【问题标题】:Block cross domain calls to asp.net .asmx web service阻止对 asp.net .asmx Web 服务的跨域调用
【发布时间】:2010-10-11 23:15:49
【问题描述】:

我已经构建了一个应用程序,它使用 jQuery 和 JSON 来使用 ASP.NET .asmx Web 服务来执行 crud 操作。应用程序和 .asmx 在同一个域中。我不介意人们远程使用 .asmx 的读取操作,但不希望人们随意删除东西!!!

我可以将我希望公开访问的方法和“隐藏”的方法拆分为 2 个 Web 服务。如何将 'hidden'.asmx Web 服务的调用锁定到其托管的同一个域?

提前致谢。

编辑: 有人可以对此发表评论吗,似乎是合理的(来源:http://www.slideshare.net/simon/web-security-horror-stories-presentation): Ajax 可以设置 Http 标头,普通表单不能。 Ajax 请求必须来自同一个域。

所以“x-requested-with”“XMLHttpRequest”请求必须来自同一个域。

【问题讨论】:

  • 您对该演示文稿有什么具体问题吗?一切都绝对是用来破坏网站的,但有了基本的保护,你就安全了。
  • 是的,它说你可以依靠 x-requested-with 告诉你它来自同一个域,因此是安全的。我今天在其他地方问了同样的问题,每个人都相信任何 http 标头都可以被欺骗。我不确定。无论如何,我以另一种方式解决了这个问题(主要重构)
  • 但非常感谢您的帮助。它肯定让我走上了解决我现实世界问题的正确轨道。

标签: asp.net jquery security json asmx


【解决方案1】:

您需要使用 Web 服务来保护两种情况:

  1. 用户是否经过身份验证?
  2. 操作是否来自我的页面?

如果您使用的是表单身份验证,则已经处理了身份验证部分。如果您的 Web 服务位于站点的受表单身份验证保护的区域,则除非登录,否则任何人都无法访问您的 Web 服务。

第二种情况是一个稍微棘手的故事。该攻击被称为 CSRF 或 XSRF(跨站点请求伪造)。这意味着恶意网站会在您的用户仍登录到您的网站时代表他们执行操作。 Here's a great writeup on XSRF.

Jeff Atwood 在上面的链接中总结了这一切,但这里是 XSRF 保护的四个步骤:

  1. 将 GUID 写入用户的 cookie。
  2. 在您的 AJAX 调用之前,从 cookie 中读取该值并添加它 到 Web 服务 POST。
  3. 在服务器端,将 FORM 值与 cookie 值进行比较。
  4. 因为网站无法从其他域读取 cookie,所以您是安全的。

【讨论】:

    【解决方案2】:

    在 AJAX 中,浏览器会进行调用,因此即使您要检查域是否相同,它也不够安全,因为它很容易被伪造。

    您需要使用某种身份验证/授权令牌(最好有超时)来确保安全。

    【讨论】:

    • 你能详细说明一下吗?你提到的令牌系统我怎么会?
    • >那应该是“我如何创建你提到的令牌系统?”谢谢
    • 您必须发出一个密钥,当用户请求一个 crud 操作时,ajax 必须发回该密钥。此密钥应在短时间内过期,这样只有从您的服务器生成的页面才有密钥并可以执行操作
    • 可能有这方面的框架,但我不知道。
    • 嗯仍然没有更清楚。我明白你在说什么,但还有很多问题,我无法结束这个问题。什么问题的关键?网络服务?网络服务如何确定密钥请求者是合法的?
    【解决方案3】:

    快速而肮脏的解决方案是使用 IP 地址限制,仅允许您的域的 IP 地址通过 IIS 访问。

    使用 HTTP 身份验证可能会更好。有很多方法可以做到这一点,我发现 Authentication in ASP.NET Web Services 是一个有用的概述。

    【讨论】:

      猜你喜欢
      • 2012-02-07
      • 2012-09-14
      • 2011-03-31
      • 1970-01-01
      • 2012-02-11
      • 1970-01-01
      • 2013-03-27
      • 2013-06-23
      相关资源
      最近更新 更多