2017-03-07 230 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