SQL-инъекция с помощью union и load_file () - PullRequest
0 голосов
/ 04 июля 2011

Мой сайт подвергся атаке SQL-инъекций. Хакер использовал следующее в строке запроса URL:

abc-buy.php?sid=144760&op=-3+union+all+select+1,2,3,4,5,6,7,load_file%28%22/etc/passwd%22%29

Как мне избежать подобных атак?

Ответы [ 4 ]

2 голосов
/ 04 июля 2011
  1. Всегда проверять ненадежный ввод.
  2. Все данные не заслуживают доверия.

Способ проверки ввода зависит от того, что является вводом, но в этом случае, вероятно, довольно очевидно, что -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"=".

2 голосов
/ 04 июля 2011

Переключитесь на PDO и используйте готовые операторы с заполнителями для всего.

0 голосов
/ 04 июля 2011

Как говорится в большинстве ответов, вам следует избегать всего, что вы сохраняете в своей базе данных (заполнители полей).

Но я недавно обнаружил, что вы должны избегать всех заполнителей в вашем запросе, потому что без него:

Заполнители для "предложения FROM" могут позволить хакерам получить доступ к данным любой таблицы.*

Заполнители для "предложения WHERE" могут позволить хакерам доступ к любой строке в текущей таблице.Это означает, что при попытке входа в систему хакер может получить доступ к вашему приложению как любой пользователь в вашей базе данных.

0 голосов
/ 04 июля 2011

использовать Zend Framework.это по умолчанию предотвратит это http://framework.zend.com/

или все, что вы положили в базу данных, которую вы избегаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...