Может оказаться, что уязвимым является запрос, результаты которого не отображаются пользователю. Это может быть, например, вспомогательный запрос:
$sql = "SELECT count(*) FROM users WHERE userid='" . $_GET['userid'] . "'";
Запрос выше всего лишь проверяет наличие пользователя с данным userid: если он возвращает любую отличную от нуля величину — показывается профиль пользователя с соответствующим userid, если же возвращён 0 (то есть, нет пользователей, удовлетворяющих критерию запроса) — сообщение "пользователь не найден".
В этом случае определение пароля (или другой информации) производится перебором. Взломщик передает в качестве параметра userid строку 2' AND password LIKE 'a%. Итоговый запрос: SELECT count(*)FROM users WHERE userid='2' AND password LIKE 'a%'
Взломщик получит "пользователь не найден", если пароль не начинается на букву 'a', или стандартную страницу с профилем пользователя, в противном случае. Перебором определяется первая буква пароля, затем вторая и.т.д.
.
Выводы
- Все запросы, использующие внешние данные, требуется защитить от SQL-инъекций. Внешние данные могут быть переданы не только в качестве GET-параметров, но и методом POST, взяты из COOKIE, со сторонних сайтов или из базы данных, в которую пользователь имел возможность занести информацию.
- Все числовые параметры следует явно преобразовывать в числовой вид с помощью функций intval() и floatval()
- Все строковые параметры следует экранировать с помощью mysql_real_escape_string() и заключать в кавычки.
- Если построить SQL-инъекцию сложно, не следует ожидать, что злоумышленник не догадается как это сделать. Особенно это относится к движкам, исходный код которых является публичным.