【问题标题】:Reliable way to sniff XMLHttpRequest (browser sniffing for AJAX requests) in ASP.NET?在 ASP.NET 中嗅探 XMLHttpRequest(浏览器嗅探 AJAX 请求)的可靠方法?
【发布时间】:2009-07-19 05:49:47
【问题描述】:

我想在我的应用程序中添加一个额外的障碍,以防止通过 javascript 自动执行它,特别是在任何流行浏览器通过 XMLHttpRequest 完成自动请求时。

我可以在 ASP.NET 中使用 XMLHttpRequest 的可靠信号吗?

我想另一个相关的问题是,XMLHttpRequest 很难看起来是一个普通的人为驱动的请求吗?因为如果是这样,那我想我是在做傻事。

更新:我可能对这个问题的表述过于狭隘。目标是检测:由其他人编写的代码,而不是由普通浏览器提交的代码,可能是机器人,可能不是来自我的 Intranet 客户等。到目前为止,我想到了 XHR 和 .NET WebRequest 请求。

【问题讨论】:

    标签: asp.net javascript xmlhttprequest browser-detection


    【解决方案1】:

    您始终可以使用验证码来确保由人工负责提交请求。 recaptcha.net 是免费的,有助于将书籍数字化。

    编辑:

    如果您知道要尝试阻止的恶意行为类型,则可以开发简单的算法来检测该行为。当检测到该行为时,您可以使用验证码向客户提出质疑,以确保有人负责。这种方法开始成为普遍做法。看看这个主题的post

    【讨论】:

    • 我考虑过,但客户觉得他们所有的页面都同样敏感,我不能要求他们在每个页面上放置验证码,或者在每个页面上设置密码提示。
    • 将验证码放在第一页,然后您可以假设其他人是合法用户请求的。或者也使用 SO 之类的请求之间的最短时间限制,或者如果请求在特定时间跨度上超过 x,则抛出 CAPTCHA,例如 Facebook。
    【解决方案2】:

    不,没有办法做到这一点。很多流行的库,如 jquery,都放置了一个特殊的标头(jquery 的“x-requested-with”)来表明它是一个 ajax 调用,但这显然是客户端自愿的。

    必须假设你收到的任何请求都可能是恶意的

    【讨论】:

      【解决方案3】:

      你可以做一些偷偷摸摸的事情,但不幸的是它不会阻止所有人。例如,您可以在加载页面时运行的开始/登录页面上放置一些 JavaScript。此 JavaScript 会导致重定向,并可能会写入一个加密的 cookie 值,然后将其发送回服务器。使用 XMLHttpRequest(或其他)显然只是返回内容并且不执行任何 JavaScript,因此您可以过滤掉这些请求,因为它们没有脚本设置的 cookie 值。在 JavaScript 上运行一些混淆会更好。

      【讨论】:

        【解决方案4】:

        没有办法查明请求是否是伪造的。使用 .NET HttpWebRequest 类,您可以完美地模拟来自浏览器的任何有效 HTTP 请求。但根据您的应用,您可以考虑以下其中一项:

        • 查看 HTTP 标头以找到最明显的尝试
        • 防止短时间内来自同一 IP 地址的请求过多
        • 需要登录
        • 只允许某些 IP 地址范围
        • 验证码
        • 在提交之前运行一些 Javascript 代码以更难地使用 .NET HttpWebRequest 进行破解(请参阅 Mark Ba​​rnard 的回答)

        你必须找出人们为什么会尝试这样做,然后找到一种方法让他们非常不方便。可能以这样一种方式,您可以轻松地修改验证程序,以便他们必须一直跟上。

        【讨论】:

          【解决方案5】:

          您可以使用request challenge tokens 实施策略,这与用于CSRF/XSRF 保护的策略不同。另一种可能的选择可能是使用身份验证,但如果您有一个公共网站,这可能不是很友好。

          【讨论】:

            【解决方案6】:

            据我所知,XMLHttpRequest 的所有实现都会在请求中添加一个标头。

            编辑:

            抱歉,标头(至少在 PHP 下)是 'HTTP_X_REQUESTED_WITH'

            【讨论】:

            • 这个默认不加,是客户端库自愿加的
            • 但是,如果设置了该标头,那么它肯定是一个 XMLHttpRequest。
            • 我是否遗漏了什么,或者该标头是否也不能在手动发送的请求中被伪造?
            • @Thr4wn,是的,但是恶意代码编写者渴望以脚本以外的形式出现,因此尽管他们可以添加标头,但他们宁愿在没有标头的情况下出现,因此看起来像人一个机器人。
            • 点仍然存在,HTTP_X_REQUESTED_WITH 标头不是必需的,并且它不保证请求的来源。它不可靠,不应用于安全性。
            猜你喜欢
            • 2011-09-02
            • 1970-01-01
            • 2016-05-28
            • 2011-10-15
            • 2011-06-25
            • 2015-06-05
            • 1970-01-01
            • 1970-01-01
            • 2011-10-30
            相关资源
            最近更新 更多