SQL injection · SQL-инъекция
When input becomes a command
- Many apps build a database query by gluing the user's input into a string. That is dangerous.
- If an attacker types SQL as their input, it can become part of the query. This is SQL injection — the most famous web attack.
Когда ввод становится командой
- Многие приложения собирают запрос к базе данных, приклеивая ввод пользователя к строке. Это опасно.
- Если злоумышленник вводит SQL как свой ввод, он может стать частью запроса. Это SQL-инъекция — самый известный веб-атака.
See the attack
- Imagine a login that checks
... WHERE name = '<whatever you typed>'. - An attacker types
' OR '1'='1as the name. The query becomes:
'1'='1'is always true, so the database returns every user. The login is bypassed. Run it and see.
Посмотрите на атаку
- Представьте входную систему, которая проверяет
... WHERE name = '<whatever you typed>'. - Атакующий вводит
' OR '1'='1в качестве имени. Запрос принимает вид:
SELECT * FROM users WHERE name = '' OR '1'='1';
'1'='1'всегда истинно, поэтому база данных возвращает всех пользователей. Вход обходится. Запустите его и посмотрите.
The fix: parameterised queries
- Never glue user input into SQL. Use parameterised queries (also called prepared statements).
- The database treats the input strictly as a value, never as code — so
' OR '1'='1is just a (failed) name to look up. - Also apply least privilege: the web app's database account should only do what it needs.
Исправление: параметризованные запросы
- Никогда не конструируйте SQL-запросы путем подстановки пользовательского ввода напрямую в текст. Используйте параметризованные запросы (также называемые подготовленными инструкциями / prepared statements).
- База данных воспринимает ввод исключительно как значение, а не как код — поэтому
' OR '1'='1становится просто (неудачной) строкой для поиска по имени. - Также применяйте принцип минимальных привилегий: учетная запись базы данных веб-приложения должна иметь доступ только к тому, что ей необходимо.
Your turn
- Below, write a precise, safe query that returns only bob by his
id. That is the spirit of a parameterised lookup.
Covers: A-Level data security; web application security.
Ваша очередь
- Ниже напишите точный и безопасный запрос, который вернет только bob по его
id. Это и есть суть параметризованного поиска.
Охватывает: A-Level безопасность данных; безопасность веб-приложений.
Common mistakes
- Never build a query by joining raw user input into the text.
- Use parameterised queries so input can never change the query.
Распространенные ошибки
- Никогда не собирайте запросы путем склеивания сырого пользовательского ввода с текстом.
- Используйте параметризованные запросы, чтобы ввод никогда не мог изменить структуру запроса.
First, run the attack and see the damage. The app glued the attacker's input into the query, so the condition became name = '' OR '1'='1'. Complete the query exactly like that and see every user leak out. · Сначала выполните атаку и увидите ущерб. Приложение «приклеило» ввод злоумышленника к запросу, поэтому условие стало равно name = '' OR '1'='1'. Завершите запрос точно так и увидите, как утекает информация всех пользователей.
Click Run to see the output here. · Нажмите Запустить, чтобы увидеть результат здесь.
A safe lookup uses a precise condition. Change the query to return only bob's row, by adding WHERE id = 2. · Безопасный поиск использует точное условие. Измените запрос так, чтобы он возвращал только строку боба, добавив WHERE id = 2.
Click Run to see the output here. · Нажмите Запустить, чтобы увидеть результат здесь.