首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AntiforgeryToken &多种形式

AntiforgeryToken &多种形式
EN

Stack Overflow用户
提问于 2014-07-12 19:14:32
回答 2查看 514关注 0票数 1

我想使删除链接是安全的内容。即。

第1行

编辑删除

第2行

编辑删除

删除链接是POST链接。

要使delete链接发布请求而不是get请求,我可以使用简单的表单POST与AntiForgeryToken和AntiForgeryToken验证结合使用

代码语言:javascript
复制
   using(Html.BeginForm("Delete","Home", FormMethod.Post))
    {
            @Html.AntiForgeryToken()    
            @Html.Hidden("objectId", i)
            <input type="submit" value="Delete" />
    }

c#

代码语言:javascript
复制
 [HttpPost]
 [ValidateAntiForgeryToken]
 public ActionResult Delete(int objectId)
 {
      SafeLogic();
      return View(...);
 }

我也想用表来做这件事,但是我对产生这么多的令牌有一些性能上的顾虑,例如。

代码语言:javascript
复制
@for (int i = 0; i < 500; i++)
{
  <tr>
  <td> Data Row @i </td>
  <td>    
    using(Html.BeginForm("Index","Home", FormMethod.Post))
    {
            @Html.AntiForgeryToken()    
            @Html.Hidden("objectId", i)

            <input type="image" src="img_delete.gif" alt="Delete" />
    }
  </td>
 
}

AntiForgeryTokens的产生成本有多高?是许多AntiForgery令牌的产生。最多100,会是个问题。有这么多内联html表单是可以的吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-13 05:33:31

我有个私人项目需要你这样做。

我没有为每个可以被删除的项目设置一个表单,而是有一个带有单个防伪令牌的表单。

代码语言:javascript
复制
@using(Html.BeginForm())
{
  @Html.AntiForgeryToken()
  {your HTML/Razor}
}

delete图标基本上是一个ajax调用,它将激活控制器操作.

代码语言:javascript
复制
public JsonResult Delete(int id)
{
   //delete the item
   if(success)
   {
      return Json(true, JsonRequestBehavior.DenyGet);
   }
   else
   {
      return Json(false, JsonRequestBehavior.DenyGet);
   }
}

...and该操作将返回真或假(成功或失败)。根据这些信息,我将使用jQuery从表中删除项(在我的示例中,是格式化的表列表)。这样我就不会刷新整页了。

可能对你的实施不起作用,但为我解决了问题。

我不一定知道哪一个是最佳实践,多个表单还是一个有多个提交按钮的单一表单。有人说,如果这些表单的结束操作指向相同的操作,则不应该执行多个表单。更多信息:https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=html+best+practices+multiple+forms

这可能取决于您希望您的html (使调试更容易)有多漂亮或可读性,例如,如果您有一个带有几个块的页面,它可能不会那么混乱。但是,想一想,一旦您有了五个或六个这样的块,您的页面将是怎样的。

票数 1
EN

Stack Overflow用户

发布于 2014-07-12 21:15:14

我将令牌移到循环之外,以避免任何赋值操作。我仍然不确定许多内联表单是一个很好的解决方案,甚至比附加脚本或onclick事件更好。只是试试看。

代码语言:javascript
复制
@{var token = @Html.AntiForgeryToken();}


@for (int i = 0; i < 5; i++) 
{


  using(Html.BeginForm("Index","Home", FormMethod.Post))
  {
          @Html.Hidden("text", "Element:" + i)
          @token
          <input type="Submit"/>
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24716427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档