• 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

  • 相关阅读:
    vijos 1379 字符串的展开
    BZOJ 4597 随机序列
    BZOJ 2303 方格染色
    BZOJ 2654 tree
    BZOJ 4198 荷马史诗
    BZOJ 1555 KD之死
    不重复数字
    Rails
    Train Problem I
    Key Set HDU
  • 原文地址:https://www.cnblogs.com/ivywenyuan/p/4845628.html
Copyright © 2020-2023  润新知