【问题标题】:How can I change or remove HttpRequest input arguments in a HttpModule如何更改或删除 HttpModule 中的 HttpRequest 输入参数
【发布时间】:2011-01-17 18:24:16
【问题描述】:

是否可以更改或删除 httpmodule 中的 http 请求表单输入?

我的目标是创建一个安全 IHttpmodule 来检查请求的合理值,例如对可接受的输入和查询参数长度的限制,或者在请求之前使用 AntiXSS Sanitizer 来消除威胁、记录潜在的黑客攻击等被传递给处理器。

因为这是一个横切关注点,我更愿意找到一个适用于所有请求并影响可以访问请求值的所有方式的解决方案,Reqest.Form、Action(model)、Action(FormCollection)、HttpContext.Current .Request.Form等

我正在使用 MVC,并考虑在创建模型实例之前创建自定义模型绑定器来清理数据。但这将是特定于应用程序的,需要记住注册每个模型绑定器并且仅适用于 Action(model)。

【问题讨论】:

    标签: c# asp.net httpmodule


    【解决方案1】:

    我建议您不要在此阶段清理输入,因为它可能会导致有趣的问题。我很难学到这一点。

    你会消毒什么?代码注入(脚本/html)? Sql注入?还有什么?消毒与您正在做的事情有关。因此,如果您正在设置将每个请求的 HTTPRequest 中的内容记录到数据库中的代码,那么对抗注入是有意义的,但删除恶意代码或修改它不会存储提供的数据,你会得到不一致的数据。

    您的代码应该查看使用这些输入所做的上下文,而不是重新分配原始输入数据。

    如果它要进入数据库,请确保它不会允许注入攻击。如果它将数据嵌入到页面中,请确保将其转义,以便您无法包含脚本或使用它更改 HTML。如果是电子邮件,请确保您不能在电子邮件字段中插入换行符并让 SMTP 发送到多个地址。

    一切都与上下文有关,因为所有漏洞利用都没有包罗万象。因此,请保持您的原始输入为原始输入,但要根据您在该部分代码中将要执行的操作对其进行过滤。


    我是如何艰难地学会这一点的?早在我学习 PHP 和 Web 安全的时候,我就编写了一个脚本来调查所有 HTTP 标头、cookie、请求变量、ip、页面地址等。然后它根据我想要的内容通过各种预定义的过滤器过滤它们,并将它们传递给所需的函数/对象。例如,年龄是一个数字,所以我会确保在通过 sanitize-age 函数进行过滤后将其分配给我的对象。这在某些情况下很好,但是当您有多个可以使用该数据的上下文时,对 SQL 进行转义并不能减少它,并且转义 HTML 实体以一种我最初没有呈现的方式存储数据m 将其放入数据库中。现在,如果该列需要针对 XSS 进行过滤,那么继续并用它更新数据库的特定部分,而不是原始数据。

    这只是我的看法,我没有资源表明这是最佳实践。

    【讨论】:

    • @user257493,感谢您的意见。在这个阶段,我不打算进行特定于上下文的验证,这将留给特定的操作。但是知道预期的应用程序,我知道不应该有任何“战争与和平”长度的输入或嵌入的脚本/html。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-10
    • 2015-06-23
    相关资源
    最近更新 更多