4

在我的 MVC3 站点上,我有一个包含多个链接的页面。这些链接都链接回我网站上的一条路线,具有不同的 ID 值,并且结构如下:

IE: www.mysite.com/links/33351/3

我想利用 MVC3 的 antiforgerytoken 机制,这样我就可以确保所有请求都www.mysite.com/links/33351/3来自链接索引页面。

我熟悉如何将令牌添加到表单,但是这些都是独立的链接。

我怎样才能做到这一点?

4

3 回答 3

3

您不能将 AntiForgeryToken 用于 GET 请求(即单击链接)。有关详细信息 - 请参阅在 HTTP GET 中使用 MVC3 的 AntiForgeryToken 以避免 Javascript CSRF 漏洞

一种解决方案是检查Request.UrlReferrer以确保它们来自您的索引页面,但这远不可靠。

也许您可以解释为什么要施加此限制,我也许可以提出替代方案。

于 2011-12-30T09:40:46.590 回答
2

感谢上面的评论帮助我解决了这个问题。

本质上,我创建了一个 Javascript 函数来处理项目点击。我页面上的每个链接都有一个 ID,所以我只是将 ID 传递给提交表单的 JS 函数:

<script type="text/javascript"> <!--
    function doClick(itemID) {
        document.getElementById('hid_ItemID').value = itemID;

        // add whatever additional js type processing needed here - ie. analytics, etc.

        document.forms[0].submit();
    }
//-->
</script>

表单本身包含 MVC 防伪令牌标签:

@using (Html.BeginForm("DoRequest", "DoItemClickRq", FormMethod.Post, new { target = "_blank" }))
{
    @Html.AntiForgeryToken()
    <input type="hidden" id="hid_ItemID" name="hid_ItemID" value="" />
.
.
.

控制器方法:

    [ValidateAntiForgeryToken]
    [HttpPost]
    public ActionResult DoItemRequest()
    {
        int itemListID = 0;
        int pagePositionNumber = 0;
        int.TryParse(Request["hid_ItemID"], out itemListID);

. . .

于 2012-01-01T19:41:30.140 回答
0
  1. 对于良好的设计实践,应用程序中可通过 HTTP GET 访问的所有 URL 都应该是幂等的,这意味着无论访问多少次,它们都不应更改状态。听起来这可能是您问题的根源,具体取决于“导航到链接执行一些维护”的解释。或者您可能会因为维护而担心系统负载。这就是 CSRF 方法通常避免处理 GET 请求的原因之一。
  2. 在 URL 中公开 CSRF 令牌(如会话 ID)是不好的安全做法。URL 可能会泄漏到日志文件、代理服务器中,尤其是在您的站点不使用 100% SSL 的情况下。

网络爬虫是标准行为良好的爬虫吗?如果是这样,为什么不直接使用robots.txt来约束爬行行为呢?

如果这还不够,也许您需要施加某种工作流限制以防止深度链接访问(例如,访问具有会话 id A 的链接 X 而不首先通过步骤 1 和 2 会被您的控制器拒绝)。

于 2011-12-30T16:04:05.780 回答