3

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

当我使用 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

他们使用链接是因为hrefhttps 吗?这种用法有多安全?

4

2 回答 2

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 攻击。它简单而有效,真的没有理由不实施它。

于 2012-06-18T19:32:21.487 回答
2

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

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

http://site.com/logout?token=123456
于 2012-06-18T19:39:35.840 回答