mysql_real_escape_string可以防止各种sql注入吗?

时间:2012-03-22 00:02:25

标签: php mysql sql sql-injection

  

可能重复:
  SQL injection that gets around mysql_real_escape_string()

我没有看到任何有价值的信息或没有过时的信息。 所以,有这样一个问题:Does mysql_real_escape_string() FULLY protect against SQL injection?但是它已经过时了(它来自'09),所以从12月的php 5.3和mysql 5.5开始,它是否完全保护?

3 个答案:

答案 0 :(得分:11)

mysql_real_escape_string ALONE可以阻止没有。

此外,此功能与注射完全无关。

每当你需要转义时,你都需要它,尽管有#34;安全",但仅仅因为它是SQL语法所必需的。而你不需要它,逃避不会帮助你甚至一点点。

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

这只是语法相关的功能,与安全无关。

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

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

准备好的陈述也不是一个灵丹妙药。它仅涵盖了一半可能的案件。有关详细信息,请参阅important addition I made to the famous question

答案 1 :(得分:4)

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

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

我不记得博文,但this question on here在同一个球场。

答案 2 :(得分:0)

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

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