SQL注入攻击及其解决方法

SQL注入攻击:

  当程序中出现了SQL拼接时,当输入的值为jack'#或者'jack' or '1=1时,会让SQL语义发生改变,因为SQL语句中出现了SQL的关键字(# or 1=1),造成数据泄露,系统安全隐患。

SQL语义发生改变的语句例如:

select * from user where username='jack'#' and password=''

select * from user where username='jack' or '1=1' and password=''

解决SQL攻击:

  利用PreparedStatement对象;

//3,获取带有预编译的传输器
//SQL中包含着?的,叫做SQL骨架。
//? 叫做占位符
String sql = "select * from user where username=? and password=?";
ps = conn.prepareStatement(sql);
//设置参数setString
//第一个参数必须和问号的顺序一致,
//第二个参数指定问号的值
ps.setString(1, name);
ps.setString(2, pwd);
          
//4,执行SQL
rs = ps.executeQuery();

PreparedStatement优势:

1,防止SQL注入
先把SQL骨架(带有?的一条SQL,?叫做 占位符)发送给数据库服务器,然后再把参数发给服务器。
本质上是由于新对象把sql关键字给屏蔽了,把SQL关键字当做一个普通的文本处理。

2,省略了参数拼接的麻烦,通过?作为占位符,通过setString方法来绑定问号的位置,并且赋值来完成的。

3,提高执行效率
先把SQL骨架缓存起来,当下次要访问相同SQL骨架的业务时,先去缓存中找SQL,缓存中没有的话,再发出SQL语句查询数据库。
原文地址:https://www.cnblogs.com/yikuan-919/p/9519805.html