在这种情况下可以执行SQL注入吗?

时间:2014-01-12 05:26:55

标签: php mysql sql-injection

我一直在讨论我的PHP代码和SQL语句,虽然我知道在处理这个问题时可以使用预处理语句,但我仍然想知道如何在这里执行SQL注入。

$name = mysql_real_escape_string(htmlspecialchars($_POST["Name"]));
$age = (int) mysql_real_escape_string(htmlspecialchars($_POST["Age"]));
$amount = (int) mysql_real_escape_string($_POST["Amount"]);

$sql = "insert into nice_table set
                    name='{$name}',
                    age='{$age}',
                    amount='{$amount}'";


$db->sql_query($sql);

在执行SQL注入时,我不太了解所有不同的方法,但是我查找过的所有内容都通过了这个,没有任何数据库错误。使用它而不是经典的准备语句实际上是否安全?

例如,会传递什么?我必须遗漏一些东西,因为它不能这么简单,仍然像准备好的陈述一样紧,对吧?

3 个答案:

答案 0 :(得分:3)

mysql_real_escape_string ALONE无法阻止所有类型的SQL注入。

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

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

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

根据安全问题中的这一功能,相信它会“保护您的数据库免受恶意用户攻击”将导致您注射。

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

准备好的声明也不是银弹。它仅覆盖了一半可能的病例。请参阅我对famous question for the details

所做的重要补充

答案 1 :(得分:2)

不推荐使用

mysql_个函数。预先mysqlipdo类。

AFAIK ,可以使用特殊字符来避免mysql_real_escape_string

我会考虑使用prepared statements验证。您可能只希望 alfanumerics dot 成为名称的可能输入。这也有帮助:P

答案 2 :(得分:1)

不,你正在使用mysql_real_escape_string(),所以这是安全的。

对于后两个变量,您也可以

$age = intval($_POST["Age"]);
$amount = intval($_POST["Amount"]);

这将同样安全。 Intval总是返回一个整数(错误时为0),因此不可能包含任何非mysql安全字符。