zoukankan      html  css  js  c++  java
  • SQL注入漏洞

    SQL注入漏洞曾经是Web应用程序的噩梦,CMS、BBS、Blog无一不曾受其害。 

    SQL注入的原理

    以往在Web应用程序访问数据库时一般是采取拼接字符串的形式,比如登录的时候就是根据用户名和密码去查询:

     

    string sql = "SELECT TOP 1 * FROM [User] WHERE UserName = ‘” + userName + “‘ AND Password = ‘” + password + “‘”;

     

    其中userName和password两个变量的值是由用户输入的。在userName和password都合法的情况下,这自然没有问题,但是用户输入是不可信的,一些恶意用户只要用一些技巧,就可以绕过用户名、密码登录。

     

    假设password的值是”1′ or ‘1′ = ‘1“,userName的值随便取,比如是”abc”,那变量sql的值就是:

     

    "SELECT TOP 1 * FROM [User] WHERE UserName = ‘abc’ AND Password = ‘1′ or ‘1′ = ‘1′”

     

    由于’1′ = ‘1′恒为真,因此只要User表中有数据,不管UserName、Password的值是否匹配,这条SQL命令准能查出记录来。就这样,登录系统就被破解了。

     

    以往的防御方式

    以前对付这种漏洞的方式主要有三种:

     

    字符串检测:限定内容只能由英文、数字等常规字符,如果检查到用户输入有特殊字符,直接拒绝。但缺点是,系统中不可避免地会有些内容包含特殊字符,这时候总不能拒绝入库。

    字符串替换:把危险字符替换成其他字符,缺点是危险字符可能有很多,一一枚举替换相当麻烦,也可能有漏网之鱼。

    存储过程:把参数传到存储过程进行处理,但并不是所有数据库都支持存储过程。如果存储过程中执行的命令也是通过拼接字符串出来的,还是会有漏洞。

    参数化查询

    近年来,自从参数化查询出现后,SQL注入漏洞已成明日黄花。

     

    参数化查询(Parameterized Query 或 Parameterized Statement)是访问数据库时,在需要填入数值或数据的地方,使用参数 (Parameter) 来给值。

     

    在使用参数化查询的情况下,数据库服务器不会将参数的内容视为SQL指令的一部份来处理,而是在数据库完成SQL指令的编译后,才套用参数运行,因此就算参数中含有指令,也不会被数据库运行。Access、SQL Server、MySQL、SQLite等常用数据库都支持参数化查询。

  • 相关阅读:
    六、HBase集成Phoenix安装
    新建虚拟机ping不通windows主机,windows主机ping不通虚拟机解决办法(图文)
    JSON数据转换之net.sf.json包的使用
    request.getParameter() 和request.getAttribute() 区别
    SQL Server中如何获取当前年,月,日,时,分,秒
    SQL强化:将相同的或连续的时间段合并
    ORA-20000:ORU-10027:buffer overflow,limit of 10000 bytes 解决方法
    Connect By
    深入理解connect by rownum
    Oracle获取两个日期之间的所有日期
  • 原文地址:https://www.cnblogs.com/robbychan/p/3786523.html
Copyright © 2011-2022 走看看