2011-11-19 23 views
8

在代码中,我已经看到了这一个登录页面创建令牌:原因在HTML表单使用令牌和PHP校验码

$token = $_SESSION['token'] = md5(uniqid(mt_rand(),true));

那么这个令牌回荡在一个隐藏的输入登录表单和提交的,用于验证登录的php代码还检查此令牌,如:

public function isTokenValid() 
{ 
    return (!isset($_SESSION['token']) || $this->_token != $_SESSION['token'])? 0 : 1; 
} 

此令牌的用途是什么?

编辑:该页面介绍它的使用:https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet

回答

8

喜欢这种方法通常用于防止CSRF vulnerabilities

+0

谢谢。这个页面清楚地告诉了这个令牌方法:https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet –

1

这是用来防止跨站请求伪造攻击,从而非授权用户可以强制当前登录(授权)用户通过制作链接生成表单帖子来在您的网站上执行请求。

这个想法是,您的网站必须首先生成反CSRF令牌并将其传递给授权客户端。但是这个令牌对攻击者来说是未知的,并且必须用来完成一个有效的请求回到你的网站。

如果Facebook未使用令牌对CSRF进行适当保护,则示例CSRF攻击可能会诱使用户点击链接,从而导致垃圾帖被张贴到用户的Facebook流。由于用户已经登录,攻击的网站(Facebook)将发布请求视为有效。

+0

好的谢谢迈克尔。 –

1

令牌对CSRF攻击提供某种级别的保护很有用,它们对于强制限制提交表单也很有用。

或者简单地说,可以用来防止有人无意中通过两次点击提交按钮来两次提交相同的表单。

例如:您正在银行网站上从账户A到账户B在线转账10美元。当“转账资金”屏幕出现时,后台是一个独特的令牌。您输入账户和账户的金额,然后按提交按钮,然后在下一页加载之前再次按下按钮。

您的浏览器发送两次HTTP POST。对于第一个请求,服务器接收令牌,确认它是有效的,然后删除或将其标记为无效。对于第二个请求,服务器发现(相同)令牌不再有效,并且不处理传输。如果没有这样做,你只需要转移20美元而不是10美元。

想一想,它的一种方法是当你加载一个表单时,你特别为你刚刚加载的表单的那个实例获得一个标记。如果你想提交,使用令牌。一旦你使用了令牌,它就消失了。想要另一个令牌?重新加载页面/表单以获得另一个。

注:有办法使用JavaScript来防止重复点击按钮,这应该也可以用,但如果有其他一些原因重复的HTTP请求(浏览器错误,硬件问题仍然没有帮助,等等。)。任何导致数据更改或使用资源(如打印)的事务都应使用令牌,不应无意中复制令牌。

+0

非常感谢 –