设计一个通过单击链接而不是表单按钮来完成注销功能的网页是否安全



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

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

<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而使用链接?这种用法有多安全?

鼓励开发人员使用链接而不是表单的原因是因为它使站点容易受到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攻击。它简单有效,真的没有理由不实施它。

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

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

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

最新更新