阻止对asp.net .asmx Web服务的跨域调用
我已经构建了一个使用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”请求必须来自同一个域。
使用Web服务需要保护两种方案:
- 用户是否经过身份validation?
- 动作来自我的页面吗?
如果您正在使用表单身份validation,则已经处理了身份validation。 如果您的Web服务位于站点的受表单身份validation保护的区域,则除非他们已登录,否则任何人都无法访问您的Web服务。
第二种情况是一个稍微棘手的故事。 该攻击称为CSRF或XSRF(跨站点请求伪造)。 这意味着恶意网站在用户仍然登录到您的网站时代表您的用户执行操作。 这是一篇关于XSRF的精彩文章 。
杰夫阿特伍德总结了上面的链接,但这里有四个步骤的XSRF保护:
- 将GUID写入用户的cookie。
- 在AJAX调用之前,从cookie中读取该值并将其添加到Web服务POST。
- 在服务器端,将FORM值与cookie值进行比较。
- 由于网站无法从其他域读取Cookie,因此您是安全的。
在AJAX中,浏览器会进行调用,因此即使您要检查域是否相同,它也不够安全,因为它很容易被伪造。
您需要使用某种认证/自动化令牌(最好是超时)以保证安全。
快速而肮脏的解决方案是使用IP地址限制,只允许通过IIS访问域的IP地址。
可能更好的是使用HTTP身份validation。 有很多方法可以做到这一点,我发现ASP.NET Web Services中的身份validation是一个有用的概述。