Угроза внедрения SQL с помощью PHP-форм?


Я пытался продемонстрировать необходимость подготовленных операторов в PHP, но у меня возникла небольшая проблема, потому что PHP делает некоторые очень странные вещи со строками, передаваемыми через формы.

Утверждение, которое я пытаюсь "сломать", простое:

SELECT username FROM users WHERE username = '$username' AND password = '$password'

Но выполнение чего-то вроде передачи X' or TRUE;-- для пароля на самом деле не работает, потому что PHP автоматически экранирует одинарную кавычку и превращает оператор в:

SELECT username FROM users WHERE username = '$username' AND password = 'X\' or TRUE;--'

И равенство паролей остается неизменным из-за экранированной одинарной кавычки. Считается ли это утверждение безопасным? Как его можно сломать, если нет?

Author: Jengerer, 2012-05-26

2 answers

Похоже, у вас включены волшебные кавычки. Я бы определенно не счел это утверждение безопасным, так как если бы вы перенесли его на сервер под управлением PHP 5.4, он был бы полностью уязвим. Волшебные кавычки уже давно являются устаревшей функцией, и она может испортить другие части приложения, поэтому не полагайтесь на нее.

Чтобы продемонстрировать, просто установите magic_quotes_gpc = Off в php.ini.

 5
Author: Ry-, 2012-05-26 16:27:51

Это потому, что в вашей среде PHP включены волшебные кавычки. Он автоматически экранирует строки, однако они устарели и не должны использоваться. Это не лекарство, это пластырь. Вам гораздо лучше использовать надлежащие методы санитарии, такие как mysql_real_escape_string.

Http://www.php.net/manual/en/security.magicquotes.what.php

Редактировать: Также подготовленные заявления!

Другие "небезопасные" безопасные функции в PHP:

addslashes - вы можете подумать, что это безопасно, но он не отфильтровывает многобайтовые символы, которые могут вызвать инъекцию.

 2
Author: Stanislav Palatnik, 2012-05-26 16:28:47