2017-03-07 237 views
0

我已经找到解释如何生成令牌以及如何使用它的链接/答案,如thisPHP - Smarty - Http请求拦截器

我的网站使用Smarty,并有很多已经存在的表单。我试图找到一种方法在每个请求的头部中发送一个令牌,并捕获所有请求以验证头部。

:在AngularJS,我可以使用$httpProvider.interceptorsheaders['Authorization'] = 'Bearer ' + token;

我想创建这样的

class Interceptor { 
    $token; 

    function __construct(type) { 
     switch (type) { 
      case 'beforeSending': 
       $token = md5(uniqid(rand(), TRUE)); 
       $_SESSION['token'] = $token; 
       $_SERVER['HTTP_authorization'] = 'Bearer ' + $token; 
       break; 
      case 'beforeExecuting': 
       if(hash_equals($_SESSION['token'], $_POST['token'])){ 
        //continue 
       }else{ 
        //error redirect to homePage or logout 
       } 
       break; 
     } 
    } 
} 

这应该存储在会话令牌添加到每头请求。

这也应该检查每个请求是否包含正确的标记。

有没有办法在全球范围内实现这一目标,而不是将输入添加到每个表单并检查每个调用?

+0

只需指定一个会话变量,并检查需要验证的页面上的会话变量? – junkfoodjunkie

+0

我在用户登录时创建令牌,并将令牌存储为会话变量。现在有没有办法在全球范围内为每个POST检查这个令牌?而不是将代码添加到每个页面? – Weedoze

+0

不需要。您需要为每个处理文件添加会话检查。 – junkfoodjunkie

回答

0

好吧,有几种方法,但为了令牌得到适当的审查,更好的解决方案是让它在登录时生成(通过会话),然后存储或通过表单推送它(所以你有或者如果令牌本身并不重要,只是它在那里,请在允许处理脚本继续前检查是否存在令牌。

有几种方法可以做到这一点,但只要您在登录时创建会话令牌并将其存储在服务器上,您需要在处理脚本上执行的操作如下所示:

<?php 
//check to see if session is started 
if (!session_id()) { session_start(); }; 

if (isset($_SESSION['token'])) { 
    //process the rest of the form 
} 
?> 
+0

只检查令牌是否存在不会保护CSRF我认为 – Weedoze

+0

也不会通过帖子推送令牌。锻造是微不足道的。但是您可以添加一个隐藏的输入,并检查该值,并将其与登录用户等的检查组合。 – junkfoodjunkie

+0

我建议您在这里阅读更多内容:https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet – junkfoodjunkie