- Всегда проверять ненадежный ввод.
- Все данные не заслуживают доверия.
Способ проверки ввода зависит от того, что является вводом, но в этом случае, вероятно, довольно очевидно, что -3+union+all+select+1,2,3,4,5,6,7,load_file%28%22/etc/passwd%22%29
не является допустимым вводом для op (независимо от того, какой op).
Так что в этом случае, вероятно, было бы так же просто, как добавить некоторый код, чтобы проверить, что значение для "op" соответствует одному из ожидаемых значений.
if ( op != "or" and op != "and" and op != "monkeys" ) {
raise_exception("Invalid op specified! Go away you trickster!");
}
Вы должны сделать это для каждого значения , которое вы получаете от пользователей. Хотя это более сложно для полей свободной формы, таких как адреса электронной почты или комментарии и т. Д. Но, тем не менее, убедитесь, что они являются действительными данными для соответствующего поля - и избегайте полей произвольной формы, прежде чем вставлять их в базу данных. Это может иметь значение между:
INSERT INTO users (username,fullname) VALUES ("bob","Robert"); DROP TABLE users; SELECT 1 WHERE "x"="");
и
INSERT INTO users(username,fullname) VALUES ("bob",Robert\"\)\; DROP TABLE users\; SELECT 1 WHERE \"x\"=\"");
Функциональное отличие состоит в том, что с первой (неэкранированной) версией выполняется команда DROP TABLE users;
, а со второй вы просто вставляете нового пользователя с действительно длинным глупым именем Robert"); DROP TABLE users; SELECT 1 WHERE "x"="
.