我们的应用程序是付款服务商,我们的结帐流程支持重定向和iframe结帐。为了防止CSRF攻击,我们使用标准的MVC AntiForgeryToken实现。但是,一小部分的结帐失败,并显示一条错误消息,提示缺少AntiForgeryToken Cookie。
从日志中我们总结出,只有当用户代理是Mobile Safari或很少有三星浏览器(版本和平台版本不同)时,才会发生这些错误。
我们不能确定这些错误仅当嵌入到iframe中时才会发生,但是我们无法从重定向或嵌入式版本中可靠地重现这些错误。 更令人困惑的是,标准的Safari和第三方Cookie的问题也不能解释这一点,因为在所有情况下,我们都可以从日志中得知存在ASP.NET_SessionId cookie。
我们尝试在响应上设置P3P标头:
HttpContext.Response.AddHeader("p3p", "CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\"");
,但并不能解决问题。
此外,我们可以肯定,这也发生在合法用户身上,而不是专门针对恶意攻击者(假设其中任何一个都是恶意的)。为了确保表述显而易见,所有这些请求都包含一个HTTP表单条目,其中包含__RequestVerificationToken
,但没有cookie。
此外,所有记录的错误都指出:The required anti-forgery cookie "__RequestVerificationToken_L3Yx0" is not present.
我们无法解释_L3Yx0
附录。不过要明确一点,附录不是问题,或者至少不是唯一的问题,因为我们一开始就没有收到Cookie。
对于这种怪异的行为有什么可能的解释,我们怎么做才能防止该问题发生?