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