我一直在讨论我的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注入时,我不太了解所有不同的方法,但是我查找过的所有内容都通过了这个,没有任何数据库错误。使用它而不是经典的准备语句实际上是否安全?
例如,会传递什么?我必须遗漏一些东西,因为它不能这么简单,仍然像准备好的陈述一样紧,对吧?
答案 0 :(得分:3)
mysql_real_escape_string ALONE无法阻止所有类型的SQL注入。
每当你需要转义时,你需要它尽管有“安全性”,但仅仅因为SQL语法需要它。在你不需要它的地方,逃避也不会对你有所帮助。
此函数的用法很简单:当您必须在查询中使用带引号的字符串时,必须转义它的内容。不是因为一些想象中的“恶意用户”,而只是为了逃避用于分隔字符串的这些引号。这是一个非常简单的规则,但却被PHP人员误解了。
这只是与语法相关的功能,与安全无关。
根据安全问题中的这一功能,相信它会“保护您的数据库免受恶意用户攻击”将导致您注射。
你可以自己做出的结论: 不,这个功能还不够。
准备好的声明也不是银弹。它仅覆盖了一半可能的病例。请参阅我对famous question for the details
所做的重要补充答案 1 :(得分:2)
mysql_
个函数。预先mysqli
或pdo
类。
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安全字符。