您的位置:首页 > 数据库

sql 注入问题

2015-09-29 10:16 274 查看
目前的理解:

PrepareStatement可以使得在SQL中实现的查询是参数化的,sql语句的格式已经事先设定好,并常驻内存(这同时也实现了高效),当用户传入参数时,会有检查机制使得只有符合语法的参数参数才有效。

SQL注入攻击主要是因为SQL语句的拼接造成的。

在Java中防止SQL注入攻击的方法是参数化查询,即使用PreparedStatement代替Statement

使用PreparedStatement的参数化的查询可以阻止大部分的SQL注入(然而并不是全部)

在使用参数化查询的情况下,数据库系统(eg:MySQL)不会将参数的内容视为SQL指令的一部分来处理,而是在数据库完成SQL指令的编译后,才套用参数运行,因此就算参数中含有破坏性的指令,也不会被数据库所运行

参数化查询,目前被视作最有效可预防SQL注入攻击的攻击手法的防御方式,而且参数化查询相比“拼接字符串”的SQL语句,不仅安全性更好,而且效率更高。

使用PreparedStatement的优点:
数据库系统会对sql语句进行预编译处理(如果JDBC驱动支持的话),预处理语句将被预先编译好,这条预编译的sql查询语句能在将来的查询中重用,这样一来,它比Statement对象生成的查询速度更快。执行计划同样会被缓存起来,它允许数据库做参数化查询。使用预处理语句比普通的查询更快,因为它做的工作更少(数据库对SQL语句的分析,编译,优化已经在第一次查询前完成了)

PreparedStatement不支持预编译SQL查询的JDBC驱动,在调用connection.prepareStatement(sql)的时候,它不会把SQL查询语句发送给数据库做预处理,而是等到执行查询动作的时候(调用executeQuery()方法时)才把查询语句发送个数据库,这种情况和使用Statement是一样的。

  

参考:

/article/4793841.html

http://www.importnew.com/5006.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: