如果用户输入,mysqli_real_escape_string 的用途是什么
/
\
'
在输入字段中?
它们真的有害吗?
如果他们是,他们有什么害处?
如果用户输入,mysqli_real_escape_string 的用途是什么
/
\
'
在输入字段中?
它们真的有害吗?
如果他们是,他们有什么害处?
该'
字符的风险在于输入中的文字引号字符可能会过早关闭 SQL 表达式中的引号字符串。例如:
UPDATE Users SET password = '$pass' WHERE userid = $id
这假设 $input 在字符串中是安全的。如果我传递这样的 URL:
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 代码中放置字符串文字、日期文字或数字文字的地方才能使用它们。
$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 调用现在可以注入攻击者想要的任何内容,包括丢弃、密码绕过、数据泄露等。