我们正在使用带有webHttpBinding
绑定的WCF服务来向客户端公开端点。服务由IIS(.svc)托管。客户端是使用enableWebScript
行为自动生成的JavaScript。所有方法都使用POST。
是否可以对此服务进行CSRF攻击?
我考虑了以下选项:
还有其他选择吗? Flash,Silverlight,网络套接字还是别的什么?
有效请求如下所示:
POST http://site/Service.svc/ServiceMethod HTTP/1.1
Host: site
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: cs,en-us;q=0.8,en;q=0.5,pl;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
X-Requested-With: XMLHttpRequest
Content-Type: application/json; charset=utf-8
Referer: http://site/
Content-Length: 33
Cookie: cookies, session id, etc.
Pragma: no-cache
Cache-Control: no-cache
{"param1":11,"param2":"123"}
要明确:我正在努力确保我的服务。不执行攻击。我正在考虑为每次通话添加“身份验证令牌”,但首先我想知道是否值得付出努力。
答案 0 :(得分:1)
这是一篇旧帖子,但这是第一件出现在Google上的WCF CSRC StackOverflow.com"所以这是OWASP的观点推荐标题:
这里的另一个答案有点误导。 referrer标头是检查CSRF的有用方法,但并不完全可靠。一种更可靠的方法是使用嵌入在每个表单中的随机令牌(最好是为表单的每个实例随机生成),这将在服务器端进行检查。
例如:
<html>
<body>
<form>
<input type='text' name='securityfield' /><input type='submit' value='submit' />
<input type='hidden' value='<some random token>' name='CSRF-token' />
</form
</body>
</html>
在MVC代码中:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult SomeAction(Dictionary<string, string> parameters){
if(parameters["CSRF-token"] != UserContext.csrfToken){
return View();
}
//Do actual work
}
这是必要的原因是因为CSRF攻击使用受害者的浏览器,该浏览器可能仍然登录到您的站点。如果用户打开了多个选项卡,或者您的会话只需要一段时间才能过期,则会发生这种情况。攻击者通常会将用户重定向到包含恶意数据的表单提交页面。
我还应该说AJAX不是跨域的。此外,XSS不需要实现AJAX。
答案 1 :(得分:-1)
通常,检查Referrer标头足以阻止CSRF,因为浏览器将设置引用标头(即使它是由javascript设置的)。
我认为没有人能够保证您的服务对CSRF是安全的,因为您可能(意外地)打开一些攻击媒介。例如,如果您有以下网站:
http://mycompanysite.com/MyService/Service.svc (hosting the service)
http://mycompanysite.com/MyWebApp/ (hosting a web app)
然后,Web应用程序中的漏洞可能允许攻击,因为“跨域”规则不再适用。此外,客户端应用程序(即浏览器)中可能存在漏洞,因此从托管角度来看,您实际上只能在用户使用众所周知的最新浏览器的基础上工作。没有插件等