在PHP中正确使用$ mysqli-> real_escape_string

时间:2015-11-15 22:08:07

标签: php mysql sql mysqli sql-injection

当我调用$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查询错误。我意识到我做错了,我的所有代码都可能容易受到攻击。这就是为什么我在这里问这个问题。

1 个答案:

答案 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";
}