#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"}')
^
Совет, приведенный в комментариях выше, верен: если вы сомневаетесь, используйте параметры запроса. Тогда вам не придется беспокоиться о том, безопасна ли строка.