如果使用 json_encode,是否需要转义用户输入?

Escaping user input necessary if using json_encode?

如果我在 $_POST 和 json_encode 中接受用户的一些输入

$json = json_encode($_POST);

并将其放入查询中

$save = mysqli_query($con, "INSERT INTO table (json) VALUES ('$json')");

这是否易于 SQL 注入?这个输入是否需要转义?在我的测试中,我无法 运行 任何带有

输入的查询
') SELECT * FROM table; --

但我一点都不擅长这个。

PS - 这是学习测试。我实际上并没有在项目中这样做。

郑重声明,是的,它很容易受到攻击。 json_encode() 不转义除 ".

以外的特殊字符

这是一个演示:

<?php
$a = [ "name" => "O'Reilly" ];
$j = json_encode($a);
echo "$j\n";

输出:

{"name":"O'Reilly"}

现在,如果将其插入到 SQL 字符串中会发生什么?

你会在单引号 SQL 字符串文字中得到一个未转义的单引号字符,这会导致语法错误。

INSERT INTO table (json) VALUES ('{"name":"O'Reilly"}')
                                            ^

上面评论中的建议是正确的:如有疑问,请使用查询参数。那就不用担心字符串是否安全了