SQL注入问题及事务

幸运草 2020年3月30日19:01:03安全防范评论阅读模式

在这里我给大家数一下数据库中的常见问题,有时候我们在测试数据的时候会发现当我们在文本框中输入sql代码时数据库接收数据则会收到影响,这就是我们常说的sql注入问题,在这里我们常用的解决方案就是使用PrepareStatement对象替代Statement对象接收页面数据,下面我在这里给大家详细的说一下。

用户名输入: tom'--即可将sql语句改变为

SELECT * FROM users NAME = 'tom' AND PASSWORD ='1234';

SELECT * FROM users NAME ='tom' --'AND PASSWORD = '1234';

后方的密码部分将会被备注不起作用,此问题称为sql的注入问题

本质原因是让用户参与到了sql语句的编写中。

statement的对象功能比较单一,仅仅将sql语句运输到数据库执行

**PrepareStatement比较勤快

PerpareStatement会先进行一次sql语句的运输,例如

SELECT * FROM users NAME = ? AND PASSWORD =?;

此语句先进行编译,并无法执行,当PerpareStatement第二次将用户的提交的数据传递过来即可运行

当我们在实际操作时也会遇到这么一个问题,例如我们遇到转账操作时,此时我们需要扣一个人的账户加到另一个账户中去,如果出现了意外情况,此时如果只操作了一条sql语句,就会对一方造成损失,因此我们需要保证两条sql语句有一条执行则必须执行另一条,否则两条都不执行。这里我们需要了解一个新的东西,就是事务,以下是我对事务的理解及详细介绍。

建表语句

CREATE TABLE t_account(

id INT PRIMARY KEY AUTO_INCREMENT,

NAME VARCHAR(20),

balance DOUBLE(6,2)

)

-- tom向jerry转账100元的事务

-- 开启事务

START TRANSACTION;

-- 在tom的账户扣除100元

UPDATE t_account SET balance = balance-100 WHERE id=1;

-- 在jerry的账户添加100元

UPDATE t_account SET balance = balance+100 WHERE id=2;

-- 如果成功则提交事务

COMMIT;

-- 如果失败则回滚事务

ROLLBACK;

执行结果显示

[SQL] START TRANSACTION;

受影响的行: 0

时间: 0.000ms

[SQL]

UPDATE t_account SET balance = balance-100 WHERE id=1;

受影响的行: 1

时间: 0.001ms

[SQL]

UPDATE t_account SET balance = balance+100 WHERE id=2;

受影响的行: 1

时间: 0.001ms

[SQL]

COMMIT;

受影响的行: 0

时间: 0.069ms

[SQL]

ROLLBACK;

受影响的行: 0

时间: 0.000ms

在mysql中默认所有的sql语句都在事务中执行,不开启事务的话两条语句会产生两个事务,

当语句执行完成并没有问题的时候,事务会自动提交。

****开启事务则只产生一个事务,通过 start transaction来开启事务,手动控制每条sql语句执

行完成都不会自动提交

****事务的结束

1.commit 提交:语句执行成功则提交

2.rollback 回滚:语句执行失败则回滚事务

3.断网,宕机。。相当于自动回滚

4.超时。。自动回滚

5.DDL事务会自动提交

——详解DDL、DCL、DML

DDL(数据定义语言)

CREATE  DROP  ALTER  TRANSACTION

DCL(数据控制语言)

GRANK  COMMIT  RLLBACK

DML (数据操作语言)

INSERT  UPDATE  DELETE

|-DQL(DQL分属于DML)SELECT

本文来源于:SQL注入问题及事务-变化吧
特别声明:以上文章内容仅代表作者本人观点,不代表变化吧观点或立场。如有关于作品内容、版权或其它问题请于作品发表后的30日内与变化吧联系。

  • 赞助本站
  • 微信扫一扫
  • weinxin
  • 加入Q群
  • QQ扫一扫
  • weinxin
幸运草

发表评论