当我调用$mysqli->real_escape_string($str)
时,我得到一个可以在查询中使用的安全字符串。它具有所有可以导致SQL注入(inject)攻击逃逸的特殊符号。
我的问题是 - 稍后在查询中使用它的正确方法是什么?我是单引号还是双引号这个安全字符串?
例如,
$safe_title = $mysqli->real_escape_string($_POST['safe_title']);
现在我要这样做:
$r = $mysqli->query("SELECT * FROM articles WHERE title='$safe_title'");
或者这个:
$r = $mysqli->query('SELECT * FROM articles WHERE title="'.$safe_title.'"');
有时我会做一个,有时我会做另一个,但这一次,当我做了其中一个并在输入中输入一堆垃圾时,我不知何故遇到了 SQL 查询错误。我意识到我做错了,我的所有代码可能都容易受到攻击。这就是我在这里问这个问题的原因。
最佳答案
你会这样做:
$r = $mysqli->query("SELECT * FROM posts WHERE title='$safe_title'");
但正如 @JordiKroon 指出的,准备好的语句是首选。
$stmt = $mysqli->prepare("SELECT * FROM articles WHERE title=?");
$stmt->bind_param("s", $safe_title);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_array(MYSQLI_NUM))
{
foreach ($row as $r)
{
print "$r ";
}
print "\n";
}
关于php - PHP 中 $mysqli->real_escape_string 的正确用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33725705/