SkillGridИзучай computer science на практике

Веб-безопасность: не доверяй пользовательскому вводу

Инъекции, XSS и CSRF — три версии одной ошибки: чужой текст начинают выполнять как команду.

15 мин · 48 XP

Любая веб-уязвимость на этом уровне — это одно нарушенное правило: не доверяй вводу, который пришёл извне программы. Браузер, форма, 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Значение, вклеенное в текст запроса, становится текстом запроса. Параметр остаётся значением, как бы странно он ни выглядел.
VisitorAppOther userPOST /transfer to=me&amount=100the browser is told to send this, not askedcookie is attached by the browsermoney moves, and the app believed it was Ono password was ever stolen

Практика

  1. Форма входа собирает запрос склейкой текста. Какое изменение действительно убирает SQL-инъекцию?

    Подсказки
    • Найди место, где текст перестаёт быть данными и становится частью команды.
    • Кавычки — не то же самое, что параметр: одно это знак препинания, другое — значение, которое база держит отдельно.

    15 XP

  2. Сопоставь каждую атаку с той частью системы, которая выполняет текст атакующего.

    Подсказки
    • Спроси, какая программа в итоге выполняет текст атакующего: база данных, браузер или оболочка.
    • Решение всегда одна и та же идея, но место, где её применяют, разное.

    15 XP

  3. Напиши isSafeNickname(name), которая принимает только буквы, цифры и подчёркивания, от 3 до 16 символов. Эта проверка не любит чёрные списки: описывай, что разрешено, а не что запрещено.

    Подсказки
    • Белый список сравнивает со значениями, которые ты принимаешь; чёрный удаляет лишь те, что ты вспомнил.
    • Длина — дешёвая проверка, которая отсекает огромные полезные нагрузки раньше всего остального.

    18 XP