我在添加AntiForgeryToken时遇到问题。这是我的代码:
<%:Html.ActionLink("Text", "Action", new { ID = "Hello")})%>
和
RedirectToAction("Action", "Controller", new { ID = "HelloFromMe"});
控制器:
[ValidateAntiForgeryToken]
public ActionResult Action(String ID){
return View();
}
有人知道怎么做吗?
答案 0 :(得分:3)
不可能将AntiForgeryToken用于GET方法。
GET方法只应用于服务器上的只读操作。如果您想要执行除了只读操作之外的其他操作,那么您应该使用POST方法。
这里有这个令牌有用的原因,如何以及何时使用它。 http://haacked.com/archive/2009/04/02/anatomy-of-csrf-attack.aspx
答案 1 :(得分:0)
防伪令牌的想法是防止攻击者代表用户生成POST / GET请求。因此,我们在每个POST / GET请求中添加了一些攻击者不知道的特殊内容。
自定义防伪最简单的实现如下所示。 而且它与ValidateAntiForgeryToken一样安全。
std::addressof
查看:
public class ProfileController : AuthorizedAccessController
{
// GET
public ActionResult Details(int userId)
{
User user = this.Entities.User.First(u => u.Id == userId);
this.Session["ProfilePageAntiforgery"] = Guid.NewGuid(); // use RandomNumberGenerator to generate strong token
this.ViewBag.ProfilePageAntiforgery = this.Session["ProfilePageAntiforgery"];
return View(user);
}
public ActionResult DeleteMyProfile(int userId, string profilePageAntiforgery)
{
if ((string)this.Session["ProfilePageAntiforgery"] != profilePageAntiforgery)
{
return this.RedirectToAction("Details", new { userId });
}
User user = this.Entities.User.First(u => u.Id == userId);
this.Entities.User.Remove(user);
this.Entities.SaveChanges();
return this.RedirectToAction("ProfileDeleted");
}
}
从中排除定制属性是一个技术问题。 假设一个属性将令牌存储在会话和viewbag中,另一个属性进行验证。
如果无法使用Session(Web场等),则只需将其替换为DB或其他商店即可。