【问题标题】:How to stop other website to send cross domain ajax requests?如何阻止其他网站发送跨域ajax请求?
【发布时间】:2013-11-03 04:27:54
【问题描述】:

通过 2 个不同的应用程序,我能够发送跨组织请求。虽然浏览器返回 Cross-Origin 的错误,但我的服务器仍在接收和执行请求。例如,我可以从远程站点调用跨域请求,

$.ajax({
        xhrFields: {
            withCredentials: true
        },
        data:{ my: 'a' },
        url: 'http://MyApp/Page',
        type: 'POST'
})

我知道浏览器没有返回对脚本的响应,但我的服务器页面仍然执行。

假设一个无辜的用户登录了一个站点http://abc.com。此应用程序将接受 post 请求以插入记录。当无辜用户访问无辜http://HackerSite.com 时,http://HackerSite.com 将能够通过 Ajax 向http://abc.com 发送 POST 请求。如何避免这种情况?

【问题讨论】:

  • 好问题。如果您对此有答案,如果您发布的话,我将不胜感激。
  • 对于 WCF 服务,您可以在端点配置中将 crossdomainscriptaccessenabled 设置为 false。
  • 您在提交表单时也会遇到同样的问题,不涉及 JavaScript。 CORS 规范的创建并未考虑到额外的安全性。相反,它允许您在没有 ajax 的情况下基本上执行您已经执行(跨域)的相同操作。 CORS 规范走得更远一些,因为它确保您的服务器甚至没有收到底层请求,如果您的服务器没有正确选择加入规范并且相同的请求无法跨域发送 sans ajax (比如说,通过表单提交)。最后一个概念称为预检。

标签: jquery asp.net security cors


【解决方案1】:

应适当设置 Access-Control-Allow-Origin 标头以禁止您需要的域以外的域。但是这只适用于现代浏览器。 参考http://encosia.com/using-cors-to-access-asp-net-services-across-domains/ http://code.google.com/p/html5security/wiki/CrossOriginRequestSecurity

【讨论】:

  • 这不是实施安全性的适当位置。浏览器/客户端不可信。
【解决方案2】:

在简单的解决方案上,但并非完全无懈可击的是我们所说的“验证令牌”。来自您网站的每个帖子都应该有一个 CSRF 令牌,您可以在服务器端对其进行验证,以确保请求确实来自您的网站。查看更多信息:http://shiflett.org/articles/cross-site-request-forgeries

【讨论】:

    【解决方案3】:

    您所说的漏洞是CSRF,但可以防范。

    您可以通过发送和检查 X-Requested-With: XMLHttpRequest 标头来防止在 AJAX 请求之外(例如通过 HTML 表单)提交 POST。由于此标头不在安全列表中(即没有CORS),因此也无法通过 AJAX 跨域发送。

    然而,过去曾有一些通过插件(例如 flash)进行的漏洞利用,其中可以设置标头,而通过浏览器(例如 Referer)是不可能的,因此为了防止这种情况,建议使用 synchroniser token pattern涉及在隐藏字段中设置一个令牌,该令牌将被验证以及所有破坏性请求的 cookie。破坏性是指更改、提交或删除内容的请求(即应该是 POST)。

    更多信息请看这里:http://www.html5rocks.com/en/tutorials/cors/

    【讨论】:

    • 在我的 asp.net web-form 案例中,它正在发送 cookie,这是预检规则,The browser can skip the preflight request if the following conditions are true: The request method is GET, HEAD, or POST, and The application does not set any request headers other than Accept, Accept-Language, Content-Language, Content-Type, or Last-Event-ID, and The Content-Type header (if set) is one of the following: application/x-www-form-urlencoded multipart/form-data text/plain
    • 但是我会再检查一次,你就知道了。谢谢
    猜你喜欢
    • 2019-11-04
    • 1970-01-01
    • 2018-09-27
    • 2019-04-17
    • 1970-01-01
    • 2015-06-08
    • 2019-01-22
    • 2015-05-05
    • 1970-01-01
    相关资源
    最近更新 更多