首先,让我们直截了当,但我确定它不是sql注入的唯一解决方案,准备好的声明更好,更安全......这是被授予的。
因此我们不再讨论它了,因为我只需要探索转义选项并定位用户输入而不是声明......
(有点背景故事) 我有一个庞大的应用程序w /许多基本的SQL语句,我需要做的更安全"在很短的时间内。将所有语句转换为PDO是一项任务的怪物,需要这种情况不可用的资源。
但好处是应用程序中有一个钩子,所有传入的$ _GET / $ _ POST在脚本中作为普通变量提供之前通过一个函数...(例如,globalize($ _ POST))
所以我希望转而定位这个功能并专注于"清洁"用户输入......
我几乎掌握了SQL注入技术,基本上是它的大部分概念,例如: 1)每当声明中涉及用户输入时,攻击者就有机会 2)主要任务是在攻击者的输入中用简单的单引号或双引号作为字符串或字符代码来引用你的语句引用。 3)转义可以很好地防止SQL注入,除非DATABASE字符编码能够准备好那些讨厌的非法字符串的多字节表示并且基于脚本的转义错过了它。
基于上述前提,如果:
1)我的所有SQL语句都遵循一个标准,其中使用单引号引用用户输入ALWAYS,因此我不再需要猜测我需要转义什么类型的引号(单引号)
2)所有用户输入(POST / GET)都通过一个函数(例如globalize()),它基本上是addslashes()并将每个变量全局化
3)这是一个Intranet应用程序,可以使脚本知道数据库编码支持。
问题: 在上述情况下目前可用的威胁是什么?我们如何处理它们?
...我个人正在考虑简单地将例程添加到类似于mysql_real_escape_string()的globalize()函数中。或者直到"调整"使用mysql_real_escape_string()的SQL语句比在每个sql查询上编程语句要容易/快得多..
PS 当然,这个脚本可能永远不会像准备好的语句一样安全,但我只需要让大多数攻击者都觉得它很难(不要寻找100%的防弹,因为它不值得)
答案 0 :(得分:0)
使用
mysql_real_escape_string($link,$non_escaped_string);
答案 1 :(得分:0)
虽然它可能会有效,但也有一些问题。
如果你使用addslashes,那么就有潜在的漏洞利用,因此对于MySQL,mysql_real_escape_string()通常会更好。 mysql_real_escape_string()中存在一个潜在的缺陷(这也适用于pdo的默认使用),但是这非常深奥,你几乎不得不尝试让你的代码基于它进行攻击。
更大的问题是您的用户输入可能用于具有不同字符集的不同数据库。因此,您应该指定将使用转义字符串的数据库的链接。如果您未指定此链接,则将使用最后打开的链接的详细信息。如果尚未使用任何链接,那么它将尝试使用某些默认连接参数进行连接,结果可能无法预测。
如果您只是转义所有$ _POST / $ _GET / $ _REQUEST数组(并且记住$ _COOKIES数组也可能被恶作剧用户更改)那么你可能会这样做的地方就是脚本是首次加载,当您不太可能连接到相应的数据库时。
另一个问题是,您正在处理的某些代码(以及您似乎没有时间详细处理的代码)必然已经转义输入数据。因此,你将获得双重逃避它的奇怪结果。相关(但不太可能是一个问题)是转义数字字段