114
|
Cheekysoft Moz Morris · 技术社区 · 16 年前 |
1
238
当涉及到数据库查询时,总是尝试使用准备好的参数化查询。这个
对,
想象一下下面的SQL:
您应该能够看到这很容易被利用。
这里没有危险的字符来编码,所以它将直接通过转义过滤器。离开我们:
这是一个可爱的SQL注入向量,允许攻击者返回所有行。 或
产生
这使得攻击者可以在这个完全虚构的示例中返回第一个管理员的详细信息。
虽然这些功能很有用,但必须小心使用。您需要确保在某种程度上验证所有Web输入。在本例中,我们看到我们可以被利用,因为我们没有检查我们使用的变量是否是数字。在PHP中,您应该广泛地使用一组函数来检查输入是否是整数、浮点数、字母数字等。但是当涉及到SQL时,请注意准备好的语句的大部分值。如果上面的代码是一个准备好的语句,那么它将是安全的,因为数据库函数应该知道
至于
在PHP中有一个真正的问题,因为它有一个不同的HTML相关转义函数的完整选择,并且没有明确的关于哪些函数做什么的指导。 首先,如果您在一个HTML标记内,那么您会遇到真正的麻烦。看
我们已经在一个HTML标记内,因此不需要<或>来做任何危险的事情。我们的攻击向量可能只是
现在结果HTML看起来像
攻击直接通过。
情况变得更糟了。为什么?因为
我们邪恶的攻击者现在可以注入全新的参数
给我们
在这些情况下,没有魔法子弹,你只需要自己去避免输入。如果你试图过滤掉坏字符,你肯定会失败。采用白名单方法,只允许通过好的字符。看看 XSS cheat sheet 例如不同的向量
即使你使用
最有效的方法是使用mb_convert_编码和htmlentities的组合,如下所示。
即使这样,由于IE6处理UTF的方式,它仍然容易受到攻击。但是,在IE6使用率下降之前,您可以返回到更有限的编码,如ISO-8859-1。 有关多字节问题的更深入研究,请参见 https://stackoverflow.com/a/12118602/1820 |
2
10
除了Cheekysoft出色的回答:
对于防止HTML注入(例如跨站点脚本),没有真正的银弹,但是如果您使用库或模板系统来输出HTML,则可以更容易地实现它。阅读相关文档,了解如何适当地避开问题。 在HTML中,根据上下文的不同,需要对事物进行不同的转义。尤其是在将字符串放入JavaScript时。 |
3
3
我肯定同意以上的观点,但我有一个小问题要补充,以回应奇基索夫的回答,特别是:
我编写了一个快速的小函数,放在我的数据库类中,它可以去掉任何不是数字的东西。它使用了preg ou replace,所以有一个更优化的prob功能,但它在紧要关头工作…
所以不用
我会用
它可以安全地运行查询
当然,这只是阻止了它显示正确的行,但我认为这对于任何试图将SQL注入您的站点的人来说都不是一个大问题;) |
4
2
这个难题的一个重要部分是上下文。如果引用查询中的每个参数,则发送“1或1=1”作为ID的人不会出现问题:
结果是:
这是无效的。因为您要转义字符串,所以输入不能脱离字符串上下文。我已经测试了5.0.45版本的MySQL,使用一个整型列的字符串上下文不会导致任何问题。 |
5
2
在64位系统上工作得很好,甚至更好。但是要注意系统在处理大量数据方面的限制,但是对于数据库ID来说,这在99%的时间里是有效的。 您还应该使用一个函数/方法来清除您的值。即使这个函数只是mysql_real_escape_string()的包装器。为什么?因为有一天,当发现对您首选的清理数据方法的利用时,您只需要更新一个位置,而不需要在整个系统范围内进行查找和替换。 |
6
-3
为什么,哦,为什么,你愿意吗? 不 在SQL语句中包括用户输入的引号?似乎很傻不去!在SQL语句中包含引号会使“1或1=1”成为一种徒劳的尝试,不是吗? 现在,您将说,“如果用户在输入中包含一个引号(或双引号),该怎么办?”
嗯,很容易解决这个问题:只需删除用户输入的引号。如:
|
EZDM · 避免在上使用XSS。使用JQUERY获取JSON 7 年前 |
Agent Smith · 如何使用ZF2防止XSS? 7 年前 |
Nikolai · php中的XSS黑名单 8 年前 |
vivek · 我们所说的上下文自动转义是什么意思? 8 年前 |
user2143356 · 这是否易受XSS攻击? 9 年前 |