Я смотрел руководства Rails, и в этом разделе, чтобы защитить от инъекций SQL, они заявляют, что хакер может ввести следующий код (источник):
SELECT * FROM users WHERE login = '' OR '1'='1' AND password = '' OR '2'>'1' LIMIT 1
В руководстве Rails говорится, что:
Это просто найдет первую запись в базе данных и предоставит доступ к этому пользователю.
Может кто-нибудь объяснить, что является общим термином, используемым в SQL, для описания числовых запросов (так что я знаю, как Google больше информации), и как это работает в приведенном выше примере для обхода аутентификации?
Предполагая, что ваш начальный SQL для проверки пароля был:
SELECT * FROM users WHERE login = 'LOGIN' AND password = 'PASSWORD' LIMIT 1
Пользователь может передать LOGIN = "'OR' 1 '=' 1" и PASSWORD = "'OR' 2 '>' 1"
Это сделает ваш оператор SQL следующим:
SELECT * FROM users WHERE
login = '' OR '1'='1' AND password = '' OR '2'>'1' LIMIT 1
Давайте сломаем там WHERE
из SQL.
login = '' OR '1' = '1' AND password = '' OR '2'> '1'
(login = '' OR '1' = '1') AND (password = '' OR '2'> '1')
login = '', вероятно, будет false, но 1 = 1 всегда будет true. То же самое для пароля = '' будет false, но 2> 1 всегда будет true. Таким образом, мы получаем:
(false ИЛИ true) AND (false ИЛИ true)
Это всегда так. Поэтому с LIMIT в конце вы получите 1 запись из таблицы.
В принципе, из-за инъекции SQL из переменной LOGIN, человек может изменить логику SQL Query, чтобы ему не нужно было знать пароль пользователя или даже имя пользователя, чтобы получить запрос, чтобы вернуть одну строку, которая вероятно, приведет к успешному входу в систему.