2014-03-26 56 views
1
<?php 
$_SESSION['csrf_token'] = md5(uniqid(rand(), true)); 
?> 
<?php 
$csrf1 = $_POST['csrf_token']; 
$csrf2 = $_SESSION['csrf_token']; 
if($csrf1 === $csrf2) { 
//not executing 
} else { 
} 
?> 

的JavaScript反CSRF無法正常工作

var csrf = "<?php echo $_SESSION['csrf_token']; ?>"; 
var ajax = ajaxObj("POST", "index.php"); 
     ajax.onreadystatechange = function() { 
      if(ajaxReturn(ajax) == true) { 
       if(ajax.responseText != "success"){ 
     } else { 
    window.location.replace("login.php"); 
     } 
     } 
    } 
    ajax.send("csrf_token="+csrf); 
    } 
    return false; 

所以,這裏是從我的代碼一些PHP生成一個CSRF令牌,將其放在會議,然後檢查會話值和POST值是否一樣。問題是,if語句沒有執行。在我使用ajax發送請求之前,當我回顯會話令牌時,會話令牌是相同的。我確信會話令牌正在改變,我不確定原因。

編輯:我添加了我的javascript。我從中刪除了很多,所以我希望我沒有把它搞亂。

+0

這段代碼是在一個單獨的PHP文件中(所以上面的所有代碼都會被執行)?如果是這樣,那麼'$ _POST ['csrf_token']'應該從哪裏來? – ComFreek

+0

除了@ ComFreek的評論,我們需要更多的代碼才能找出發生的事情。如果您可以發佈您提交此表單的代碼以及任何其他相關代碼,那麼我們可以幫助我們找到根本原因 –

+0

您是否在每個請求中更新'$ _SESSION ['csrf_token']' ? – Gumbo

回答

1

OP沒有提供的一個非常重要的信息是請求轉到使其令牌生效的相同腳本。因此,發生的事情正是應該發生的事情。這是我在另一個網站上提供給他的解決方案。

<?php 
if((isset($_SESSION['csrf_token'], $_SESSION['time']) && time() - $_SESSION['time'] > 60) || !isset($_SESSION['csrf_token'])) { 
    $_SESSION['csrf_token'] = md5(uniqid(rand(), true)); 
    $_SESSION['time'] = time(); 
} 
?> 
0
if($csrf1 === $csrf2) { 

變化如此:if($csrf1 == $csrf2) {

+0

我試過了,但是我有同樣的結果。 –

+0

這是一個字符串,所以不應該是問題。 – Gumbo

0

我會echo內容和視覺上比較兩個檢查相同的值。對於它的價值,你有沒有試過strcmp()

if(strcmp($csfr1, $csfr2) == 0) { 
    //Got a match 
} else { 
    //No match, look at the two strings for debug purposes. 
    print("<pre> CSRF1: $csrf1 \n CSRF2: $csrf2 </pre>"); 
} 
+0

謝謝你的幫助。我其實只是嘗試過,無論如何,它運行//得到一個匹配。即使我更改POST值。 –