Веб-безопасность: не доверяй пользовательскому вводу
Инъекции, XSS и CSRF — три версии одной ошибки: чужой текст начинают выполнять как команду.
Любая веб-уязвимость на этом уровне — это одно нарушенное правило: не доверяй вводу, который пришёл извне программы. Браузер, форма, API и cookie — всё это «снаружи». Ввод при этом не «плохой» — это совершенно допустимый текст. Ошибка в том, что программа перестала считать его данными и позволила ему стать частью команды, запроса, страницы или запроса к серверу.
the page builds a greeting from the name you typed
name you typed: Ada
page shows: Hello, Ada
name you typed: <script>...</script>
page shows: the browser obeys the script instead of printing it
cause: the server put your text into the page without escaping itПользователь ввёл текст. Страница решила, что это разметка. У браузера не было способа отличить одно от другого.SQL-инъекция — та же ошибка на уровень ниже. Если код склеивает пользовательский текст в строку SQL, то значение вроде адреса почты перестаёт быть значением и становится частью грамматики запроса. Классический пример — форма входа, где текст после кавычки превращает остаток запроса в комментарий. Защита — не вычищать кавычки, а использовать параметры: тогда база всегда получает структуру запроса и значения отдельно и никогда не угадывает, что есть что.
SELECT id, email FROM users
WHERE email = 'student@example.org' AND password_hash = '...';
-- the same query, built by gluing user input into the text:
-- 1 OR 1=1 --
-- the condition stops being a condition and becomes a statementЗначение, вклеенное в текст запроса, становится текстом запроса. Параметр остаётся значением, как бы странно он ни выглядел.Практика
Форма входа собирает запрос склейкой текста. Какое изменение действительно убирает SQL-инъекцию?
Подсказки
- Найди место, где текст перестаёт быть данными и становится частью команды.
- Кавычки — не то же самое, что параметр: одно это знак препинания, другое — значение, которое база держит отдельно.
15 XP
Сопоставь каждую атаку с той частью системы, которая выполняет текст атакующего.
Подсказки
- Спроси, какая программа в итоге выполняет текст атакующего: база данных, браузер или оболочка.
- Решение всегда одна и та же идея, но место, где её применяют, разное.
15 XP
Напиши isSafeNickname(name), которая принимает только буквы, цифры и подчёркивания, от 3 до 16 символов. Эта проверка не любит чёрные списки: описывай, что разрешено, а не что запрещено.
Подсказки
- Белый список сравнивает со значениями, которые ты принимаешь; чёрный удаляет лишь те, что ты вспомнил.
- Длина — дешёвая проверка, которая отсекает огромные полезные нагрузки раньше всего остального.
18 XP