Как я могу изменить или удалить входные аргументы HttpRequest в HttpModule - PullRequest
0 голосов
/ 17 января 2011

Можно ли изменить или удалить входные данные формы запроса http в модуле http?

Моя цель - создать модуль IHttp безопасности, который будет проверять запрос на приемлемые значения, такие как ограничения на допустимую длину входных данных и параметров запроса, или использовать AntiXSS Sanitizer для удаления угроз, регистрации потенциальных попыток взлома и т. Д. Перед запросом. передается процессору.

Поскольку это междисциплинарная проблема, я бы предпочел найти решение, которое применяется ко всем запросам и влияет на все способы доступа к значениям запроса: Reqest.Form, Action (модель), Action (FormCollection), HttpContext.Current .Request.Form и т. Д.

Я использую MVC и рассмотрел возможность создания пользовательских связывателей моделей для очистки данных перед созданием экземпляра модели. Но это будет зависеть от конкретного приложения, потребовать не забыть зарегистрировать все подшивки моделей и применять только к действию (модели).

1 Ответ

1 голос
/ 17 января 2011

Я предлагаю вам не очищать входные данные на этом этапе, так как это может привести к интересным проблемам.Я научился этому нелегко.

Что бы вы продезинфицировали?Внедрение кода (script / html)?Впрыска?Что-то другое?Санитарная обработка связана с тем, что вы делаете.Таким образом, если вы настраиваете код, который записывает то, что было в HTTPRequest для каждого запроса в базу данных, имеет смысл работать против внедрения, но удаление вредоносного кода или его изменение не сохранят данные, как они были предоставлены,и вы получите противоречивые данные.

Ваш код должен смотреть на контекст того, что делается с этими входами, а не переназначать необработанные входные данные.

Если он входит в базу данных, убедитесь, что он не разрешитдля инъекционных атак.Если он внедряет данные на страницу, убедитесь, что они экранированы таким образом, что вы не можете включать скрипты или изменять HTML-код.Если это электронная почта, убедитесь, что вы не можете вставить новую строку в поле электронной почты и отправлять SMTP на несколько адресов.

Это все из-за контекста, потому что для всех эксплойтов нет ловушки.Поэтому сохраняйте исходные данные необработанными, но фильтруйте их на основе того, что вы собираетесь делать в этой части кода.


Как я научился этому нелегко?Еще когда я изучал PHP и веб-безопасность, я создал скрипт, который исследовал все заголовки HTTP, куки, переменные запроса, ip, адрес страницы и другие.Затем он отфильтровал их через различные предварительно определенные фильтры на основе того, что я хотел, и передал их в требуемую функцию / объект.Например, age был числом, поэтому я обязательно присвоил его моему объекту после заполнения с помощью функции sanitize-age.Это было хорошо для некоторых случаев, но когда у вас есть несколько контекстов, в которых эти данные могут быть использованы, экранирование против SQL просто не обрезает их, а экранирование HTML-сущностей сохраняет данные таким способом, который изначально не был представлен, если бы я 'Я помещаю это в базу данных.Теперь, если этот столбец необходимо отфильтровать по XSS, тогда обновите эту конкретную часть базы данных, но не необработанные данные.

Это просто мое мнение, я неесть ресурсы, указывающие, что это лучшая практика.

...