【问题标题】:Is it safe to design a web page where logout functionality is done through clicking a link instead of a form button?设计一个通过单击链接而不是表单按钮来完成注销功能的网页是否安全?
【发布时间】:2012-06-20 01:22:18
【问题描述】:

我遇到过许多警告使用链接提供注销功能的文章。他们都建议使用表单和按钮进行注销。

当我使用firebug检查gmail的注销元素的html时,我发现它是一个链接:

<a target="_top" role="button" id="gb_71" onclick="gbar.logger.il(9,{l:'o'})" href="?logout&amp;hl=en" class="gbqfbb">Sign out</a>

href 有类似的东西

https://mail.google.com/mail/ca/?logout&hl=en

他们是否因为href 是https 而使用链接?这种用法有多安全?

【问题讨论】:

  • 那些文章给出的避免使用链接的原因是什么?
  • 我不熟悉该建议。我使用的许多 Web 应用程序都提供了用于注销的标准 url(例如 /logout),以及指向该 URL 的链接。您可以提供指向其中一篇文章的链接的任何更改吗?我很好奇。
  • 我在我的书签中找不到文章链接,但是有一种情况是机器中安装的爬虫插件(用于浏览html页面中的所有链接)用于单击注销链接,因此注销用户。所以文章推荐使用表单和按钮
  • 另外,我猜来自 site2 的 csrf 攻击可以让经过身份验证的用户(站点 1)点击 site2 上一个看起来无害的链接,这实际上是一个带有 'site1/logout' 的链接

标签: html gmail csrf logout


【解决方案1】:

使用 GET 注销用户没有什么不寻常的。无论如何,这是一个不好的做法。例如,如果您已登录 Gmail 帐户,请访问 this page 以查看“结果”。而且,HTTP 或 HTTPS 无关紧要。

但是,这个技巧不适用于 Stackoverflow http://stackoverflow.com/users/logout。无论如何,最好注销用户,使用 POST 请求或随机令牌:

http://site.com/logout?token=123456

【讨论】:

    【解决方案2】:

    不鼓励开发人员使用链接而不是表单的原因是因为它使网站容易受到 CSRF(跨站请求伪造)攻击。假设您有一个站点,注销 URL 是 example.org/?logout。如果您访问我的站点,并且我加载了该 URL,它将使您退出您在 example.org 上的当前会话。这似乎没有破坏性,但必须继续登录是相当烦人的。

    现在想象一下你已经将它实现为表单的地方......

    <form action="?logout" method="POST">
      <input type="hidden" value="blahblah" name="key" alt="I am a random key!" />
      <input type="submit" value="Log out..." />
    </form>
    

    key 的值将在页面加载时随机生成。加载 url example.org?logout 时,它会检查会话以确保随机密钥与表单提交的密钥相同。如果不相同,则用户可能不会注销。如果相同,他们可能会。

    这个简单的方法可以阻止所描述的 CSRF 攻击。它简单有效,真的没有理由不去实现它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-01
      相关资源
      最近更新 更多