问题 mysql_real_escape_string ALONE可以阻止各种sql注入吗?


可能重复:
围绕mysql_real_escape_string()的SQL注入 

我还没有看到任何有价值或不过时的信息。 所以,有这个问题: mysql_real_escape_string()是否完全防止SQL注入? 然而它非常过时(它来自'09),因此在12月的php 5.3和mysql 5.5中,它是否完全保护?


9927
2018-03-22 00:02


起源

在理论上是的:) - Arman P.
请为Zaphod Beeblebrox的爱,通过PDO或mysqli扩展程序升级自己准备好的语句。 mysql* 是一种永远不应该使用的恐龙。如果有这么多“教程”网站没有顽固地继续使用它,PHP开发团队就已经弃用了它。这种向后练习的新奉献者每天都在铸造,因为他们不知道更好,毕竟,“教程说我可以这样做。” 准备好的语句是防止SQL注入的正确方法。 - rdlowrey
资源: news.php.net/php.internals/53799 - rdlowrey
谢谢@rdlowrey,我的脑子在想“每个人都使用mysql,它有多糟糕!”显然,你是对的。 - w8ph
我对mysqli进行了一些研究,看起来我根本不必使用“mysql_real_escape_string”。并且,sql注入是不可能的,我插入的所有内容都是实际文本而不用担心任何事情。我只是想证实一下,这是真的吗? - w8ph


答案:


mysql_real_escape_string ALONE可以防止 没有。 

此外, 这个功能与注射完全没有关系。

每当你需要逃脱时,你需要它尽管“安全”,但仅仅因为 它是SQL语法所必需的。 在你不需要它的地方,逃避也不会对你有所帮助。

使用此功能很简单:必须使用时 引用的字符串 在查询中,您必须转义它的内容。不是因为一些想象中的“恶意用户”,而只是为了逃避用于分隔字符串的这些引号。这是一个非常简单的规则,但却被PHP人员误解了。

这只是语法相关的功能,而不是安全相关。

在安全问题上取决于此功能,相信它将“保护您的数据库免受恶意用户攻击”  引导你注射。

你可以自己做出的结论:
不,这个功能还不够

准备好的陈述 也不是一颗银弹。 它仅覆盖了一半可能的病例。见 我对这个着名的问题做了重要的补充 细节


11
2018-03-22 11:30





很长一段时间以来,我读了一篇关于此的博文,所以它可能不再适用但是...

这些帖子表示如果你的字符串中有unicode编码字符,它们将被真正的转义字符串遗漏,但会被mysql引擎评估 - 暗示你确实仍然可以打开一个良好的注入。

我不记得博客文章了 这个问题就在这里 是在同一个球场。


4
2018-03-22 00:12





是。通过使用本机mysql转义函数正确转义字符串,无法“突破”并执行查询。

但是,更好的方法是使用预先准备好的陈述。这将做很多事情。通过使用预准备语句,您可以利用数据库中的更多优化,并且可以正确地转义传入的任何数据。请查看: http://php.net/manual/en/mysqli.prepare.php


0
2018-03-22 00:07