php - PHP 中 $mysqli->real_escape_string 的正确用法

标签 php mysql sql mysqli sql-injection

当我调用$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/

相关文章:

PHP:Preg 替换括号?

php - MYSQL - 获取坐标点的最快方法

java - JOOQ 3.1 生成的文件名与类名不同导致编译错误

sql - 如何连接字符串?

mysql - 在 MariaDB/MySQL 中的多级 JSON 中查询特定值

php - 无法使用 StackExchanges 的 PageDown 将 markdown 转换为 HTML

JavaScript 表单使用 Ajax 和 Laravel 路由提交到数据库

javascript - PHP打印脚本无法识别javascript函数:

mysql.user - 列出列(权限)值作为记录

php - 仅从几个 Mysql 字段创建一个 json 数组,同时输出其他字段