在我的MVC3网站上,我有一个包含多个链接的页面。这些链接都链接回我网站上的路线,具有不同的ID值,结构如下:
ie:www.mysite.com/links/33351/3
我想利用MVC3的antiforgerytoken机制,以便我可以确保从链接索引页面向www.mysite.com/links/33351/3
发送所有请求。
我熟悉如何将令牌添加到表单中,但这些都是独立的链接。
我该如何做到这一点?
答案 0 :(得分:3)
您不能将AntiForgeryToken用于GET请求(即单击链接)。有关详细信息,请参阅Using MVC3's AntiForgeryToken in HTTP GET to avoid Javascript CSRF vulnerability。
一种解决方案是检查Request.UrlReferrer以确保它们来自您的索引页面,但这远非可靠。
也许您可以解释为什么要强制实施此限制,我或许可以提出替代方案。
答案 1 :(得分: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);
。 。
答案 2 :(得分:0)
网络抓取工具是标准的乖巧的吗?如果是这样,为什么不使用robots.txt来约束抓取行为?
如果这还不够,也许您需要施加某种工作流程限制以防止深层链接访问(例如,您的控制器会拒绝访问具有会话ID A而不经过步骤1和2的链接X)。