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语句查询数据库。