Данные GET и POST - это данные, которые напрямую отправляются от пользователя. Вы получаете его необработанным, без проверки или проверки между пользователем и вашей программой. Даже если вы должны проверить форму, которая должна инициировать данные, злоумышленник может вручную обработать запрос любыми данными, которые он хочет. Поэтому вы всегда должны обрабатывать данные запроса как ненадежный пользовательский ввод.
Существует множество атак, которые полагаются на кодер, забывая, что данные запроса недостоверны, но наиболее известна SQL-инъекция. Коренной причиной SQL-инъекции является построение запроса путем ручного конкатенации строк, некоторые из которых являются ненадежными пользовательскими вводами. Это означает, что вы сообщаете своей базе данных о выполнении ненадежного ввода пользователем.
Наивное решение для SQL-инъекции - это проверка входных данных, а затем объединение их в строку запроса, но это также плохая форма. Вы полагаетесь на свою логику проверки, чтобы сделать строку безопасной, и если вы неправильно ее используете - или логика глючит - тогда вы снова подвергаетесь атакам.
Правильное решение - отделить ваш запрос от содержащихся в нем данных. Практически все адаптеры баз данных поддерживают этот подход, и если ваш по какой-то причине не подходит, он не подходит для использования. Наиболее распространенной идиомой является (без определенного языка):
myDB.query ("select * from Stuff, где id =?", [42]);
Это гарантирует (в такой системе), что параметры не выполняются. Строка запроса построена из полностью доверенных данных, а недоверенные данные разделены.В худшем случае этот подход, применяемый к неправильному вводу, может привести к неправильным данным, а не к неправильной команде.
Этот подход, позволяющий избежать внедрения SQL, подчеркивает центральный принцип, который применяется ко всем видам атак данных запроса: данные запроса не являются вашими, и это небезопасно. При обращении с любым пользователем, включая данные запроса, всегда предполагайте, что он происходит от злоумышленника с глубоким знанием вашей системы. Это может показаться параноидальным, но оно защитит вас.
Общее правило: «Не доверяйте пользовательскому вводу». Все, что приходит от пользователя в любой форме, должно быть проверено безопасностью. – Jess