我有一个反CRSF MVC机制的问题。 返回的cookie和表单input不匹配。 我每次都收到一个错误,只能在一个特定的页面。 在其余的应用程序中,它运作良好。 服务器正在返回HTTP 500 Internal Server Error ,我可以在日志中看到这个exception: [System.Web.Mvc.HttpAntiForgeryException]:{“所需的防伪标记未提供或无效。”} 这是服务器正在生成的隐藏input是: <input name="__RequestVerificationToken" type="hidden" value="QK8P7rjyZE6Vm5seY7Fr704YCOoFGdTIMzl1W7R0ZFpXSMjGKLG2T05DfFSYTxvtQCEx7DDT69DGsDB2+ZXFHY8oAjiKz0gw8BhDFywgmfIpoXnGpj7fONNzIIfvbrDrE9WJsMu6Io/0bDLM5WfKs0zktiNjyOWpfYrmnfINYmjW8NLOZFoz74xTcgTptAld"> 这是返回的Cookie: Set-Cookie:__RequestVerificationToken_L2VGbG93=skmTAVI8HCbfxDS+xhioIMIISL3UOBI7qJM1JbHjTtAqKl4W70pDUcTKMm0p3R3mrHDziE8vXw0C0OO4HArzWO1/e6py+v/cFdbe9maFgjl4jMiZ9Wc4YIhC6+IUXkk6yqJDJ8dCIr8qtGaYcD9IX+m7/SlVhu521KQSWJYRcaY=; path=/; HttpOnly 当我检查服务器发送的内容时,cookie是完全一样的,但是我认为有效载荷有不同的编码: __RequestVerificationToken:QK8P7rjyZE6Vm5seY7Fr704YCOoFGdTIMzl1W7R0ZFpXSMjGKLG2T05DfFSYTxvtQCEx7DDT69DGsDB2%2BZXFHY8oAjiKz0gw8BhDFywgmfIpoXnGpj7fONNzIIfvbrDrE9WJsMu6Io%2F0bDLM5WfKs0zktiNjyOWpfYrmnfINYmjW8NLOZFoz74xTcgTptAld 差异是以两个字符显示编码: / -> %2F + -> %2B 这些是我可以find隐藏的input字段和后有效载荷之间唯一的区别。 可能是导致ValidateAntiForgeryTokenvalidation令牌失败的问题? 问候。
我已经在我的应用程序中实施了CSRF攻击的缓解措施,以下是我在互联网上的一些博客文章中阅读的信息。 特别是这些职位一直是我执行的驱动程序 ASP.NET和Web工具开发人员内容小组的ASP.NET MVC最佳实践 Phil Haack博客对跨站请求伪造攻击的剖析 ASP.NET MVC框架中的AntiForgeryToken -来自David Hayden博客的Html.AntiForgeryToken和ValidateAntiForgeryToken属性 基本上那些文章和build议说为了防止CSRF攻击,任何人都应该执行下面的代码: 1)在接受POST Http动词的每个动作上添加[ValidateAntiForgeryToken] [HttpPost] [ValidateAntiForgeryToken] public ActionResult SomeAction( SomeModel model ) { } 2)在向服务器提交数据的表单中添加<%= Html.AntiForgeryToken() %>助手 <div style="text-align:right; padding: 8px;"> <%= Html.AntiForgeryToken() %> <input type="submit" id="btnSave" value="Save" /> </div> 无论如何,在我的应用程序的一些部分,我正在使用jQuery的Ajax POST到服务器,根本没有任何forms。 例如,我让用户点击图片来执行特定操作。 假设我有一个包含活动列表的表格。 我在表格上的一列中有一个图像,标记为“已完成活动”,当用户单击该活动时,我正在执行Ajax POST,如以下示例所示: $("a.markAsDone").click(function (event) { event.preventDefault(); $.ajax({ type: "post", dataType: "html", url: […]