sql 注入问题

  • 目前的理解:

    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是一样的。

  

参考:

http://www.cnblogs.com/LoveJenny/archive/2013/01/15/2860553.html

http://www.importnew.com/5006.html

原文地址:https://www.cnblogs.com/ivywenyuan/p/4845628.html