• 防止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查询前就察觉到输入是否正确合法,采用白名单而不是黑名单则能在更大程度上保证数据的合法性。

  • 相关阅读:
    Web测试与App测试的区别
    unittest参数化
    算法-python
    冒泡排序算法-python
    mysql基础知识
    Web自动化-浏览器驱动chromedriver安装方法
    Selenium-三种等待方式
    C++中进制转换问题
    C++11新特性,对象移动,右值引用,移动构造函数
    C++ 拷贝控制和资源管理,智能指针的简单实现
  • 原文地址:https://www.cnblogs.com/zhimingxin/p/7680322.html
Copyright © 2020-2023  润新知