Экранирование пользовательского ввода необходимо при использовании json_encode?

#php #mysql #sql-injection

Вопрос:

Если я возьму некоторые данные от пользователя $_POST и закодирую их в json_encode

 $json = json_encode($_POST);
 

и поместите это в запрос

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

Подвержено ли это SQL-инъекциям? Нужно ли экранировать этот ввод? В моих тестах я не мог запускать какие-либо запросы с такими входными данными, как

 ') SELECT * FROM table; --
 

но я даже отдаленно не силен в этом.

PS — Это тест на обучение. На самом деле я не занимаюсь этим в рамках проекта.

Комментарии:

1. Зачем рисковать — просто используйте готовые заявления каждый раз, когда вы беспокоитесь об этом, и позвольте api/базе данных позаботиться об этом.

2. никогда ни от чего не убегай. Просто используйте подготовленные заявления 100% времени

Ответ №1:

Для протокола, да, он уязвим. json_encode() не экранирует специальные символы, за исключением " .

Вот демо-версия:

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

Выход:

 {"name":"O'Reilly"}
 

Теперь, что произойдет, если вы интерполируете это в строку SQL?

Вы получите неэкранированный символ в одинарных кавычках внутри строкового литерала SQL в одинарных кавычках, что приведет к синтаксической ошибке.

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

Совет, приведенный в комментариях выше, верен: если вы сомневаетесь, используйте параметры запроса. Тогда вам не придется беспокоиться о том, безопасна ли строка.