在我的 MVC3 站点上,我有一个包含多个链接的页面。这些链接都链接回我网站上的一条路线,具有不同的 ID 值,并且结构如下:
IE: www.mysite.com/links/33351/3
我想利用 MVC3 的 antiforgerytoken 机制,这样我就可以确保所有请求都www.mysite.com/links/33351/3
来自链接索引页面。
我熟悉如何将令牌添加到表单,但是这些都是独立的链接。
我怎样才能做到这一点?
在我的 MVC3 站点上,我有一个包含多个链接的页面。这些链接都链接回我网站上的一条路线,具有不同的 ID 值,并且结构如下:
IE: www.mysite.com/links/33351/3
我想利用 MVC3 的 antiforgerytoken 机制,这样我就可以确保所有请求都www.mysite.com/links/33351/3
来自链接索引页面。
我熟悉如何将令牌添加到表单,但是这些都是独立的链接。
我怎样才能做到这一点?
您不能将 AntiForgeryToken 用于 GET 请求(即单击链接)。有关详细信息 - 请参阅在 HTTP GET 中使用 MVC3 的 AntiForgeryToken 以避免 Javascript CSRF 漏洞。
一种解决方案是检查Request.UrlReferrer以确保它们来自您的索引页面,但这远不可靠。
也许您可以解释为什么要施加此限制,我也许可以提出替代方案。
感谢上面的评论帮助我解决了这个问题。
本质上,我创建了一个 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);
. . .
网络爬虫是标准行为良好的爬虫吗?如果是这样,为什么不直接使用robots.txt来约束爬行行为呢?
如果这还不够,也许您需要施加某种工作流限制以防止深度链接访问(例如,访问具有会话 id A 的链接 X 而不首先通过步骤 1 和 2 会被您的控制器拒绝)。