当我调用$mysqli->real_escape_string($str)
时,我会找回一个可以在查询中使用的安全字符串。它具有所有可能导致SQL注入攻击转义的特殊符号。
我的问题是 - 以后在查询中使用它的正确方法是什么?我是单引号还是双引号这个安全字符串?
例如,
$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查询错误。我意识到我做错了,我的所有代码都可能容易受到攻击。这就是为什么我在这里问这个问题。
答案 0 :(得分:1)
你会这样做:
$r = $mysqli->query("SELECT * FROM articles 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";
}