SQL注入——SQL注入具体防御方案

1.GPC/RUNTIME魔术引号

  • magic_quotes_gpc负责对GET,POST,COOKIE的值进行过滤。
  • magic_quotes_runtime对从数据库或者文件中获取的数据进行过滤。

通常在开启这两个选项之后能防住部分SQL注入漏洞被利用,因为我们之前也介绍了,在某些环境下存在绕过,在INT型注入上是没有多大作用的。

通常数据污染有两种方式。

  • 一种是应用被动接受参数,类似于GET,POST等。
  • 还有一种是主动获取参数,类似于读取远程页面或者文件内容等。所以防止SQL注入的方法就是要守住这两条路。

2.过滤函数和类

       在PHP5.4之前,可以利用魔术引号来解决部分SQL注入的问题。而GPC在面对INT型注入时,也无法进行很好的防御。所以在通常的工作场景中,用得多的还是过滤函数和类。不过如果单纯的过滤函数写得不够严谨,也会出现绕过的情况。这时候可以使用预编译语句来绑定变量,一般情况下这是防御SQL注入的最佳方式。

常用过滤函数:

  • addslashes
  • 函数
  • mysql[real]escape_string
  • 函数
  • intval
  • 等字符转换

3.设计输入验证和处理策略

输入验证是一种在保护应用程序安全方面很有用的工具。不过,他只能作为深度防御策略(包含多个防护层以保护应用程序的总体安全)的一个子部分。

  • 在应用程序输入层使用白名单输入验证以便验证所有用户输入都符合应用要接收的内容。应用只允许接收符合期望格式的输入
  • 在客户端浏览器上同样执行白名单输入验证,这样可以防止为用户输入不可接收的数据时服务器和浏览器的往返传递。不能将该操作作为安全控制手段,因为攻击者可以修改来自用户浏览器的所有数据。
  • 在Web应用防火墙(WAF)层使用黑名单和白名单输入验证(以漏洞“签名”和“有经验”行为的形式)以便提供入侵检测/阻止功能和监控应用攻击。
  • 在应用程序中自始自终地使用参数化语句以保证执行安全地SQL执行。
  • 在使用从数据库中提取数据之前恰当地对其进行编码。例如将浏览器中显示的数据针对跨站脚本进行编码。
  • 在应用程序中自始自终地使用参数化语句以保证执行安全地SQL执行

4.其他防护方案

领域驱动的安全性

  • SQL注入之所以发生,是因为我们的应用程序不正确地将数据在不同表示方式之间进行映射。
  • 通过将数据封装到有效值对象中,并限制对原始数据的访问,我们就可以控制对数据的使用。

编码输出

  • 确保对包含用户可控制输入的查询进行正确的编码以防止使用单引号或其他字符来修改查询。
  • 如果正在使用LIKE子句,请确保LIKE中的通配符恰当编码。
  • 在使用从数据库接收到的数据之前确保已经对数据中的敏感内容进行了恰当的输入验证和输出编码。
发布了36 篇原创文章 · 获赞 130 · 访问量 2059

猜你喜欢

转载自blog.csdn.net/cldimd/article/details/104975341