Я изучаю SQL-инъекцию и пробовал в своем PHP-коде этот запрос:
$condition = str_replace(["'","\\"],["\\'","\\\\"], @$_GET['q']); $query = "SELECT * FROM dummy_table WHERE dummy_column = '$condition'";
DB и таблица charset установлены в UTF8.
Я не могу ничего вводить, может кто-нибудь мне помочь?
EDIT: Как указывал GarethD, это сработало бы первым 'и чем \, разрешив инъекцию, как насчет этого str_replace?
$condition = str_replace(["\\","'"],["\\\\","\\'"], @$_GET['q']);
Этот изолированный пример неуязвим для инъекций.
Но вы должны понимать, что защита от SQL-инъекции – это не просто замена символа . И обстоятельства могут отличаться от тех, которые вы принимаете в данный момент как должное. Таким образом, ваш код станет уязвимым в долгосрочной перспективе из-за существенных недостатков этого метода :
Нет ничего плохого в замене персонажей как таковой, но только если он используется как часть полного форматирования; применяется к правой части запроса; и выполняется драйвером базы данных, а не программистом; прямо перед исполнением.
Функции, которые вы предложили в комментариях, являются хорошим шагом, но все же недостаточны, являясь субъектами перечисленных выше недостатков, что делает их склонными ко всем видам человеческих ошибок.
И SQL-инъекция – это не единственная проблема с этим подходом, это также ошибка использования, так как эта функция либо испортит ваши данные, если используется как воплощение поздних магических котировок , либо сделает ваш код раздутым, если использовать для форматирования каждого переменная справа в коде приложения.
Такие функции могут использоваться только для обработки заполнителя , но, конечно, не с помощью функции замены homebrewed, а в надлежащей функции, предоставляемой API базы данных.