Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在这种情况下可以执行SQL注入吗?_Php_Mysql_Sql Injection - Fatal编程技术网

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

Php 在这种情况下可以执行SQL注入吗?,php,mysql,sql-injection,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($_P

我一直在忙于处理我的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\uuquot/code>函数不受欢迎。prefer
mysqli
pdo

另外,可以使用特殊字符来避免mysql\u real\u escape\u string


我倾向于使用
准备好的语句
和验证。您可能只希望alfanumerics和dot可以作为name的输入。这也会有帮助:P

不,您正在正确使用mysql\u real\u escape\u string(),因此这是安全的

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

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

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

mysql\u real\u escape\u字符串本身无法阻止所有类型的SQL注入

无论何时需要转义,都需要转义,尽管“安全性”很重要,但这只是因为SQL语法需要转义。在你不需要的地方,逃跑对你一点帮助都没有

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

这只是与语法相关的函数,与安全性无关

在安全问题上依赖于此功能,相信它将“保护您的数据库免受恶意用户的攻击”将导致注入

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


事先准备好的声明也不是灵丹妙药。在可能的情况下,它只能覆盖你的背部。请参阅我对

htmlspecialchars
所做的重要添加,它不是为了防止SQL注入。您可能应该学习使用带有绑定变量的准备语句。那么你就不必怀疑“我做得对吗?”这两个整数的转换意味着你在这些行上不需要任何其他东西——如果你已经将它们转换成整数,那么通过这些路由SQL注入是不可能的。对于
$name
htmlspecialchars
也不是必需的。如果您使用它来防止XSS攻击,在呈现名称时使用它是正常的,而不是在存储名称时。如果
mysql\u real\u escape\u string
不足以阻止注入,您能否澄清您的答案以解释还需要什么?在许多情况下,使用prepare语句可以避免SQL注入。如果您想避免所有类型的SQL注入,那么,在说“mysql\u real\u escape\u string本身不能阻止所有类型的SQL注入”时,您的意思是开发人员需要检查动态构建的SQL,以确保不会创建意外的查询。这是真的,但我不想让OP从你的回答中理解非参数化解决方案是脆弱的——如果它们写得好,它们仍然是安全的。你说得对。。我概括地说。在某些场景中,仅使用mysql\u real\u escape\u字符串即可解决所有问题。在某些情况下,它可能会失败。所以,我们应该根据我们的情况采取行动。我认为名字中有撇号的人应该被允许使用它们。我甚至没有想到这一点,因为在我的国家,人们的名字没有撇号:P