php防止sql注入的方法详解pc软件 文章资讯 手机软件

您当前的位置→图文中心安全防范php防止sql注入的方法详解

php防止sql注入的方法详解


2017/2/20  编辑:admin 来源:本站整理   

一、什么是SQL注入式攻击?

  所谓SQL注入式攻击, 就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串, 欺骗服务器执行恶意的SQL命令。 就在某些表单中, 用户输入的内容直接用来构造(或者反应影响)动态SQL命令, 或作为存储过程的输入参数, 这类表单特别容易受到SQL注入式攻击。 常见的SQL注入式攻击过程类如:

  ⑴ 某个ASP.NET Web应用有一个登录页面, 这个登录页面控制着用户是否有权访问应用, 它要求用户输入一个名称和密码。   

  ⑵ 登录页面中输入的内容将直接用来构造动态的SQL命令, 或者直接用作存储过程的参数。 下面是ASP.NET应用构造查询的一个例子: 

 System.Text.StringBuilder query = new System.Text.StringBuilder("SELECT * from Users WHERE login = '")。  Append(txtLogin.Text)。  Append("' AND password='")。  Append(txtPassword.Text)。  Append("'");

  ⑶ 攻击者就在用户名字和密码输入框中输入"'或'1'='1"之类的内容。

  ⑷ 用户输入的内容提交给服务器之后, 服务器运行上面的ASP.NET代码构造出查询用户的SQL命令, 但由于攻击者输入的内容非常特殊, 所以最后得到的SQL命令变成:SELECT * from Users WHERE login = '' or '1'='1' AND password = '' or '1'='1'.

  ⑸ 服务器执行查询或存储过程, 将用户输入的身份信息和服务器中保存的身份信息来进行对比。

  ⑹ 由于SQL命令实际上已被注入式攻击修改, 已经不能够真正验证用户身份, 所以系统system会错误地授权给攻击者。

  如果攻击者知道应用会将表单中输入的内容直接用于验证身份的查询, 他就一定会尝试输入某些特殊的SQL字符串篡改查询改变其本来的功能, 欺骗系统system授予访问权限。

  系统system环境不同, 攻击者有可能造成的损害也不同, 这主要由应用访问数据信息库的安全权限决定。 如果用户的帐户具有管理员或其他比较高级的权限, 攻击者就有可能对数据信息库的表执行各种他想要做的操作, 包括添加、删除或更新数据信息, 甚至有可能直接删除表。

二、怎么才能防范?

  好就在要防止ASP.NET应用被SQL注入式攻击闯入并不是一件特别困难的事情, 只要就在利用表单输入的内容构造SQL命令之前, 把所有输入内容过滤一番就可以能够了。 过滤输入内容可以能够按多种方式来进行。

 (1)对于动态构造SQL查询的场合, 可以能够使用下面的技术:

  第一:替换单引号, 即把所有单独出现的单引号改成两个单引号, 防止攻击者修改SQL命令的含义。 再来看前面的例子, “SELECT * from Users WHERE login = ''' or ''1''=''1' AND password = ''' or ''1''=''1'”显然会得到与“SELECT * from Users WHERE login = '' or '1'='1' AND password = '' or '1'='1'”不同的结果。

  第二:删除用户输入内容中的所有连字符, 防止攻击者构造出类如“SELECT * from Users WHERE login = 'mas' —— AND password =''”之类的查询, 因为这类查询的后半部分已经被注释掉, 不会再有效, 攻击者只要知道一个合法的用户登录名称, 根本不有请求需要知道用户的密码就可以能够顺利获得访问权限。

  第三:对于用来执行查询的数据信息库帐户, 限制其权限。 用不同的用户帐户执行查询、插入、更新、删除操作。 由于隔离了不同帐户可执行的操作, 因而也就防止了原本用于执行SELECT命令的地方却被用于执行INSERT、UPDATE或DELETE命令。
 

 (2)用存储过程来执行所有的查询。 SQL参数的传递方式将防止攻击者利用单引号和连字符实施攻击。 此外, 它还使得数据信息库权限可以能够限制到只允许特定的存储过程执行, 所有的用户输入就一定要遵从被调用的存储过程的安全上下文, 这样就很难再发生注入式攻击了。

 (3)限制表单或查询字符串输入的长度。 如果用户的登录名字最多只有10个字符, 那么一定不要认可表单中输入的10个上面的字符, 这将很大很大增加攻击者就在SQL命令中插入有害代码的难度。   

 (4)检查用户输入的合法性, 确信输入的内容只包含合法的数据信息。 数据信息检查应当就在客户端和服务器端都执行——之所以要执行服务器端验证, 是为了弥补客户端验证机制脆弱的安全性。   

  就在客户端, 攻击者完全有有可能获得网页的源代码, 修改验证合法性的脚本(或者直接删除脚本), 之后将非法内容可以通过修改后的表单提交给服务器。 因此, 要保证验证操作确实已经执行, 唯一的办法就是就在服务器端也执行验证。 您可以能够使用许多内建的验证对象, 例如RegularExpressionValidator, 它们能够全自动生成验证用的客户端脚本, 当然您也可以能够插入服务器端的方法调用。 如果找不到现成的验证对象, 您可以能够可以通过CustomValidator我自己建造一个。
 

 (5) 将用户登录名称、密码等数据信息加密保存。 加密用户输入的数据信息, 之后再将它与数据信息库中保存的数据信息比较, 这相当于对用户输入的数据信息来进行了“消毒”处理, 用户输入的数据信息不会再对数据信息库有任意一个特殊的意义, 从而也就防止了攻击者注入SQL命令。 System.Web.Security.FormsAuthentication类有一个HashPasswordForStoringInConfigFile, 非常适合于对输入数据信息来进行消毒处理。  

 (6) 检查提取数据信息的查询所返回的记录数量。 如果程序只要求返回一个记录, 但实际返回的记录却超过一行, 那就当作出错处理。

 (7)使用预处理语句

相关文章
  • iPhone8和三星S8哪个好?哪个更好用
  • 微信显示IPhone8技巧,微信朋友圈怎么显示来自iPhone8
  • 苹果8怎么购买?iphone8抢购攻略
  • iPhone8外形出炉,快来围观
  • Photoshop 让图片呈现出HDR效果,PS软件将人像照片调出HDR效果
  • iPhone8 还没发布就出现严重问题 !
  • 苹果手机怎么恢复删除短信?iPhone被删除短信还能找回吗
  • 苹果手机怎么恢复微信聊天记录?教你快速找回iPhone微信记录
  • 升级苹果iOS11 Beta3“设置”IPHONE手机全变英文怎么解决
  • 苹果手机如何扫描信用卡?iPhone手机扫描信用卡教程
  • 发表评论
    阅读排行
    相关热门
    网站帮助 - 广告合作 - 下载声明 - 网站地图