Поделиться через


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

Обновлен: Ноябрь 2007

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

Ошибки системы безопасности, связанные с вводом данных — одни из самых неуловимых и трудно обнаруживаемых, потому что даже если они находятся в коде, не имеющем, как кажется, никакого отношения к безопасности, эти ошибки служат воротами, через которые измененные данные передаются в другой код. Для обнаружения подобных ошибок следует рассмотреть все виды используемых входных данных, выяснить для них диапазоны возможных значений и проверить, в состоянии ли обрабатывающий их код правильно работать при всех этих значениях. Можно исправить ошибки рассматриваемого вида с помощью проверки входных данных на принадлежность диапазону допустимых значений и отказа от ввода любых данных, которые код не в состоянии корректно обработать.

При использовании ввода пользовательских данных следует учитывать следующие важные аспекты.

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

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

  • Проверьте неожиданные и некорректные пути:

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

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

    • расширение лексемы (%лексема%);

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

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

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

  • Следует помнить, что Eval (пользовательские_данные) может осуществить любые действия.

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

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

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

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

    • длинные escape-последовательности UTF-8 (%nn%nn);

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

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

См. также

Другие ресурсы

Правила написания безопасного кода