Безопасность и ввод данных пользователем

Пользовательские данные, представляющие собой любой вид входных данных (данные из веб-запроса или URL-адрес, входные данные в элементы управления приложения Microsoft Windows Forms и так далее), могут отрицательно влиять на код, поскольку такие данные часто используются непосредственно как параметры для вызова другого кода. Такое поведение аналогично поведению вредоносного кода, вызывающего ваш код со странными параметрами, поэтому следует предпринимать такие же меры предосторожности. Ввод данных пользователем на самом деле защитить несколько труднее, поскольку нет кадра стека, с помощью которого можно отслеживать наличие потенциально недоверенных данных.

Это одна из ошибок безопасности, которые наиболее сложно найти, поскольку несмотря на то, что они находятся в коде, на первый взгляд не связанном с безопасностью, такие данные играют роль шлюза для передачи неверных данных в другой код. В процессе поиска подобных ошибок проанализируйте все входные данные, все возможные диапазоны значений и определите, может ли код в случае обнаружения таких данных корректно их обработать. Такие ошибки можно устранить посредством проверки диапазонов и отбрасывания любых входных данных, которые не могут быть обработаны кодом.

Ниже приведены некоторые важные аспекты, связанные с данными пользователя.

  • Все данные пользователя в ответе сервера выполняются в контексте узла сервера на клиенте. Если веб-сервер принимает пользовательские данные и вставляет его в возвращаемую <веб-страницу, это может, например, включить тег скрипта> и запустить его как будто с сервера.

  • Помните, что клиент может запросить любой URL-адрес.

  • Рассмотрим сложные и некорректные пути:

    • ..\ , пути очень большой длины;

    • Использование подстановочных знаков (*).

    • Расширение токена (%token%).

    • Необычные пути, имеющие специальное значение.

    • Альтернативные имена потоков файловой системы, например filename::$DATA.

    • Короткие имена файлов, такие как longfi~1 для longfilename.

  • Помните, что Eval(userdata) может выполнять любые операции.

  • Будьте осторожны при позднем связывании с именем, которое содержит какие-либо пользовательские данные.

  • Если вы имеете дело с веб-данными, проверьте на допустимость различные формы escape-последовательностей, включая:

    • Шестнадцатеричные escape-последовательности (%nn).

    • escape-последовательности Юникода (%nnn).

    • Специальные символы увеличенной длины в UTF-8 (%nn%nn).

    • Двойные escape-последовательности (%nn становится %mmnn, где %mm — escape-последовательность для "%").

  • Будьте осторожны с именами пользователей, которые могут иметь несколько канонических форматов. Например, часто можно использовать форму MYDOMAIN\username или форму имени пользователя@mydomain.example.com.

См. также