Незначительное (и, по общему признанию, педантичное) дополнение к ответам «использовать заполнители»: параметризованные запросы, строго говоря, не являются «дезинфицирующими». Они никак не изменяют данные, чтобы сделать их безопасными. Вместо этого они защищают от внедрения SQL, отправляя структуру запросов (команды) и данные по отдельным каналам.
Причина, по которой я считаю это различие значительным, заключается в том, что обработка санации / цитирования / экранирования ваших данных и использование параметризованных запросов как одно и то же подразумевает, что они взаимозаменяемы или, в лучшем случае, параметры являются лучшим способом процитировать опасные символы так что нет ничего страшного, если вы продолжите цитировать вместо того, чтобы пытаться выяснить это заполнитель.
По правде говоря, это совершенно разные техники с совершенно разными уровнями надежности. Цитирование может обеспечить превосходную защиту от внедрения, но всегда есть вероятность, что решительный злоумышленник может найти какой-то угловой случай, который сломает или ускользнет через ваш алгоритм цитирования и позволит им выполнить успешное внедрение SQL. Параметризованные запросы, с другой стороны, обеспечивают абсолютную защиту от внедрения SQL. Поскольку команды и данные отправляются отдельно, невозможно , чтобы ядро базы данных можно было обмануть для выполнения данных в виде команды.
Если только вы не в том случае, если ваш язык или механизм базы данных не позволят вам использовать параметр в своем запросе, никогда цитирует / экранирует / дезинфицирует ввод пользователя как защиту от внедрения SQL. Всегда используйте для этой цели параметризованные запросы, если вы можете это сделать.
И обязательная ссылка: http://bobby -tables.com / содержит примеры использования параметризованных запросов на нескольких языках, включая Perl.