防止SQL注入总结

1、预编译(占位符)可以很大程度上防止SQL注入

  预编译的原理是数据库厂商提供的JAR包中,对参数进行了转义

2、mybatis中,能用# 的地方,不用$,因为#是预编译占位符形式,可以防止SQL注入

     ORDER BY  后,无法用# ,只能用$,此时,需要代码过滤 有效列 。

正确的防御SQL注入:

1、使用预编译

     一般来说,防御SQL注入的最佳方式,就是使用预编译语句,绑定变量。  

2、使用存储过程

   使用存储过程效果和使用预编译语句类似,其区别就是存储过程需要先将SQL语句定义在数据库中。但需要注意的是,存储过程中也可能会存在注入问题。

   因此,应在尽量避免在存储过程中使用动态的SQL语句。如果无法避免,则应该使用严格的输入过滤或者是编码函数来处理用户的输入。

3、检查数据类型。

4、使用安全函数

      数据库厂商都对此做了指导,比如MYSQL

    同时,可以参考OWASP ESAPI中的实现,这个函数由安全专家编写,更值得信赖。

    使用时

Codec ORACLE_CODEC = new OracleCodec();

String query ="SELECT user_id FROM user_data WHERE user_name = ‘"+

ESAPI.encoder().encodeForSQL(ORACLE_CODEC,req.getParameter("userID"))+"’ and user_password = ‘"+

ESAPI.encoder().encodeForSQL(ORACLE_CODEC,req.getParameter("pwd"))+"’";

 

当然,为了保证自己代码的可读性,我们也可以构建自己的OracleEncoder:

Encoder e = new OracleEncoder();

String query ="SELECT user_id FROM user_data WHERE user_name = ‘"

      + oe.encode(req.getParameter("userID")) +"’ and user_password = ‘"

      + oe.encode(req.getParameter("pwd"))+"’";

除了上面所说的三种防范方法以外,我们还建议可以用以下两种附加的方法来防范SQL注入:最小权限法、输入验证白名单法。

最小权限法:

为了避免注入攻击对数据库造成的损害,我们可以把每个数据库用户的权限尽可能缩小,不要把DBA或管理员的权限赋予你应用程序账户,在给用户权限时是基于用户需要什么样的权限,而不是用户不需要什么样的权限。当一个用户只需要读的权限时,我们就只给他读的权限,当用户只需要一张表的部分数据时,我们宁愿另建一个视图让他访问。

如果你的策略是都是用存储过程的话,那么仅允许应用程序的账户执行这些查询,而不给他们直接访问数据库表的权限。诸如此类的最小权限法能够在很大程度上保证我们数据库的安全。

输入验证白名单法:

输入验证能够在数据传递到SQL查询前就察觉到输入是否正确合法,采用白名单而不是黑名单则能在更大程度上保证数据的合法性。

原文地址:https://www.cnblogs.com/zhimingxin/p/7680322.html