Я - разработчик программного обеспечения, начинающий изучать безопасность приложений, и у меня есть следующие вопросы, связанные с SQL-инъекцией.
Я слежу за видеокурсом, и есть два примера:
1) Iиметь небезопасный SQL-запрос, подобный следующему:
txtSql = "SELECT * FROM Users WHERE UserId = " + txtUserId
Хорошо, если переданное значение txtUserId имеет значение, подобное 99 ИЛИ 1 = 1
Я получу запрос, подобный этому
SELECT * FROM Users WHERE UserId = 99 OR 1 = 1
, который вернет мне весь список записей, содержащихся в таблице Users , поскольку 1 = 1 всегда верно иИЛИ конкатенация вернет true, так что это как этот запрос:
SELECT * FROM Users WHERE TRUE
возвращает мне весь список записей. Правильно ли это рассуждение?
2) Тогда у меня есть второй, более сложный пример:
Существует форма входа пользователя (имя пользователя и пароль). За этой формой находится небезопасная реализация запроса:
sql = 'SELECT * FROM USERS WHERE Name = "' + uName + '" AND Pass = "' + uPass + '"'
Хорошо, если пользователь вставит в форму входа следующие данные:
uName = " OR ""="
uPass = " OR ""="
Результат запроса будет:
SELECT * FROM Users WHERE Name = "" OR ""="" AND Pass = "" OR ""=""
Таким образом, он выбирает записи, где
Имя поле пустое ("") или равно "=" (и это условие всегда должно быть ложным, потому что довольно странно иметь пустое имя пользователя или имя пользователя, например "=").
Pass поле пусто("") или равно "=" (и это условие всегда должно быть ложным, потому что довольно странно иметь пустой пароль или пароль типа "=").
Итак, у нас есть такое условие:
WHERE FALSE AND FALSE
И вот мое сомнение: ЛОЖЬ И ЛОЖЬ = ЛОЖЬ
Почему он говорит, что этот запрос возвращает мне весь список записейпользовательской таблицы?
Если я хорошо понимаю логику, предыдущий запрос должен быть переведен примерно так:
SELECT * FROM Users WHERE FALSE AND FALSE
Что не так в моих рассуждениях? Чего мне не хватает?