This question already has answers here:
How can I prevent SQL injection in PHP?
(28个答案)
5年前关闭。
我一直在忙我的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注入时,我不太了解所有不同的方法,但我所查找的所有内容都能很好地通过这个过程,而不会出现任何数据库错误。用这个代替传统的准备好的陈述是否安全?
例如,什么会直接通过?我一定漏掉了一些东西,因为它不可能这么简单,而且仍然像准备好的陈述那样严密,对吧?

最佳答案

mysql_real_escape_string不能单独阻止所有类型的SQL注入。
每当您需要转义时,尽管存在“安全性”,但您还是需要它,因为它是SQL语法所必需的。在你不需要的地方,逃跑对你一点帮助都没有。
此函数的用法很简单:当必须在查询中使用带引号的字符串时,必须对其内容进行转义。不是因为一些想象中的“恶意用户”,而是为了逃避这些用来分隔字符串的引号。这是一条非常简单的规则,但是PHP用户却非常错误。
这只是语法相关的函数,而不是安全相关的。
根据安全问题中的此功能,相信它将“保护数据库免受恶意用户的攻击”将导致注入。
你可以得出的结论是:
不,这个功能还不够。
准备好的陈述也不是灵丹妙药。它只盖住你背上一半的可能病例。查看我对famous question for the details所做的重要添加

关于php - 在这种情况下可以执行SQL注入(inject)吗? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21071629/

10-10 18:27
查看更多