Что означают числа с утверждениями равенства в предложении WHERE в SQL (WHERE 2> 1)?

0

Я смотрел руководства Rails, и в этом разделе, чтобы защитить от инъекций SQL, они заявляют, что хакер может ввести следующий код (источник):

SELECT * FROM users WHERE login = '' OR '1'='1' AND password = '' OR '2'>'1' LIMIT 1

В руководстве Rails говорится, что:

Это просто найдет первую запись в базе данных и предоставит доступ к этому пользователю.

Может кто-нибудь объяснить, что является общим термином, используемым в SQL, для описания числовых запросов (так что я знаю, как Google больше информации), и как это работает в приведенном выше примере для обхода аутентификации?

Теги:

1 ответ

2
Лучший ответ

Предполагая, что ваш начальный 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, чтобы ему не нужно было знать пароль пользователя или даже имя пользователя, чтобы получить запрос, чтобы вернуть одну строку, которая вероятно, приведет к успешному входу в систему.

  • 0
    О, так это логическое утверждение. Он проверяет, верно ли условие WHERE, а затем извлекает первый элемент из базы данных?
  • 1
    Да. В допустимом сценарии (имеется в виду кто-то, кто не пытается взломать систему), вы должны иметь логин и пароль в переменных, а условие where вернет true, только если оба соответствуют любой строке в базе данных. Это подтвердит соответствие имени пользователя и пароля из базы данных. Но по вышеуказанной причине вы не должны использовать это и использовать параметры.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню