如果用户输入
,则使用mysqli_real_escape_string/
\
'
在输入栏中?
它们真的有害吗?
如果是的话,他们的伤害是什么?
答案 0 :(得分:1)
'
字符的风险是输入中的文字引号字符可能会过早地关闭SQL表达式中的带引号的字符串。例如:
UPDATE Users SET password = '$pass' WHERE userid = $id
这假设$ input在字符串中是安全的。如果我传递这样的网址:
http://example.com/setpassword.php?id=1234&pass=xyzzy', admin='1
我可以欺骗你的代码:
UPDATE Users SET password = 'xyzzy' AND admin='1' WHERE userid = 1234
给自己管理员权限。
像mysqli_real_escape_string()这样的函数的目的是通过确保文字引号字符不用于终止复制输入的字符串来防止这种情况。
所以我能做的最糟糕的事情就是将我的密码设置为一个长而奇怪的字符串:
UPDATE Users SET password = 'xyzzy\' AND admin=1' WHERE userid = 1234
使用参数占位符将输入变量绑定到查询中通常更方便,而不是直接将它们复制到字符串中。
<?php
$stmt = $mysqli->prepare("UPDATE Users SET password = ? WHERE userid = ?");
$stmt->bind_param("si", $pass, $id);
$stmt->execute();
这样你就不必担心逃避或不平衡的报价。它使您的代码看起来更好,更易于阅读,并且更易于调试和维护。
唯一的缺点是参数取代了标量值 。您不能使用它们来插入动态表名,列名,表达式,SQL关键字等。只能在您的SQL代码中放置字符串文字,日期文字或数字文字。
答案 1 :(得分:0)
$sql = "SELECT * FROM myTable WHERE col1 = '" . mysqli_real_escape_string($userInput) . "'";
根据您的用户输入,$ sql现在等于
"SELECT * FROM myTable WHERE col1 = '\/\\n\\\\n\'\'"
并且使用此输入或任何用户输入都可以安全运行。
如果您没有使用转义函数,则输出为
SELECT * FROM myTable WHERE col1 = '/
\
''
如果查询将会产生错误。更糟糕的是,当攻击者尝试sql注入时,例如:
' OR 1 = 1 OR col1 = '
制作你的sql:
SELECT * FROM myTable WHERE col1 = '' OR 1 = 1 OR col1 = ''
了解用户如何在搜索中添加一些字段?您的sql调用现在可以注入攻击者想要的任何内容,包括丢弃,密码绕过,数据泄露等。