当CRUD操作使用链接而不是表单时,如何防止CSRF攻击?

时间:2012-01-27 09:57:49

标签: security csrf

我已经在我的网站上使用CSRF令牌在我的表单中的隐藏输入字段中实现了CSRF保护。但是,在我的网站的某些地方,我不会使用表单来执行某些操作,例如:用户可以点击链接删除某些内容(例如/post/11/delete)。目前这对CSRF攻击是开放的,所以我想对这些链接实施预防。我怎样才能做到这一点?我可以想到两种可能的方式:

  1. 将所有链接(例如删除内容)设置为只有一个隐藏字段(CSRF令牌)和一个提交按钮(设置为普通链接)的小型表单。
  2. 将CSRF令牌添加到查询字符串
  3. 我不喜欢其中任何一个选项:

    1. 设置提交按钮以完全按照链接进行操作可能会遇到一些问题(正确的跨平台)?
    2. 虽然它永远不会被搜索引擎挑选,也不喜欢我网址中的一些随机字符串(只是美学)。
    3. 那么我有什么方法可以忽略或者是我的两种选择吗?

3 个答案:

答案 0 :(得分:2)

在您的链接中添加token


  1. 样式提交看起来像链接并不难。虽然中间点击或“复制链接位置”命令会出现问题。明显。

  2. facebook / google并不害怕在网址中加入“随机字符串”。你也不应该。 (在这些链接中添加nofollow,并在robots.txt中排除它们可以解决您对SEO的担忧。这是因为您出于某种原因向访客用户/搜索引擎显示REST链接)。

答案 1 :(得分:1)

如果您确实不希望URL参数具有较长的随机值,则可以为每个“删除”操作实现确认页面,并在其中显示包含隐藏字段的表单。 在/ post / 11 / delete时收到的请求没有有效令牌将使服务器响应确认页面。 使用有效令牌在/ post / 11 / delete处收到的请求将触发删除。

答案 2 :(得分:0)

最佳做法是不通过GET操作执行更新。

这是一个聪明的小脚本,它将挂钩所有链接,并使它们除了查询字符串中的有效内容之外还有一个隐藏变量。希望这有用!

document.ready = function () {
    var makeLinkPost = function(link) {
        var handleClick = function(event) {
            event.preventDefault();
            $("<form action='" + this.href + "' method='POST'><input type='hidden' value='CSRF'/></form>'").appendTo("body").submit();
        }
        $(link).click(handleClick);
    }

    $("a").each(function() {
        makeLinkPost(this);
    })
}