2014-10-04 307 views
0

我使用此PHP class防止CSRF攻擊。php防止csrf攻擊多次提交

CODE:

$token = NoCSRF::generate('csrf_token'); 

<form name="csrf_form" action="#" method="post"> 
    <input type="hidden" name="csrf_token" value="<?php echo $token; ?>"> 
    ...Other form inputs... 
    <input type="submit" value="Send form"> 
</form> 

進行檢查CSRF:

try 
{ 
    // Run CSRF check, on POST data, in exception mode, with a validity of 10 minutes, in one-time mode. 
    NoCSRF::check('csrf_token', $_POST, true, 60*10, false); 
    // form parsing, DB inserts, etc. 
} 
catch (Exception $e) 
{ 
    // CSRF attack detected 
} 

這個工作對我來說,當我有一個在我的網頁但是,當我在我的網頁有兩種形式只有一種形式合作並以其他形式提交始終顯示CSRF attack detected

PHP檢查FORM 1:

if($_POST['submit'] == "from") && !empty($_POST['username'])){ 

    try 
     { 
     // Run CSRF check, on POST data, in exception mode, with a validity of 10 minutes, in one-time mode. 
     NoCSRF::check('csrf_token', $_POST, true, 60*10, false); 
     // form parsing, DB inserts, etc. 
    } 
    catch (Exception $e) 
    { 
     // CSRF attack detected 
    } 
} 

PHP檢查表格2:

if($_POST['submit'] == "from2") && !empty($_POST['username'])){ 

    try 
     { 
     // Run CSRF check, on POST data, in exception mode, with a validity of 10 minutes, in one-time mode. 
     NoCSRF::check('csrf_token', $_POST, true, 60*10, false); 
     // form parsing, DB inserts, etc. 
    } 
    catch (Exception $e) 
    { 
     // CSRF attack detected 
    } 
} 

HTML表單:

<form name="csrf_form" action="#" method="post"> 
      <?PHP $token = NoCSRF::generate('csrf_token');?> 
      <input type="hidden" name="csrf_token" value="<?php echo $token; ?>"> 
      <input type="text" name="username"> 
      <input type="submit" value="form"> 
     </form> 
    <form name="csrf_form" action="#" method="post"> 
      <?PHP $token = NoCSRF::generate('csrf_token');?> 
      <input type="hidden" name="csrf_token" value="<?php echo $token; ?>"> 
      <input type="text" name="badname"> 
      <input type="submit" value="form2"> 
    </form> 

如何解決這個問題或如何做的工作該類多個形成?!

類源here

+0

爲什麼你檢查isset($ _ POST ['from2']),在你的html代碼中沒有這樣一個名字爲from2的輸入。 – daredesm 2014-10-04 23:39:00

+0

http://stackoverflow.com/questions/20587746/one-token-vs-multiple-tokens-to-prevent-csrf-attacks – 2014-10-05 07:18:43

回答

1

確保你只叫NoCSRF::generate()一次。如果它被多次調用,舊標記的數據將被覆蓋,使其無效。

或者,對兩個令牌使用不同的密鑰(而不是對兩者使用"csrf_token")。

+0

你說得對。這是一個安全的,如果我生成的所有表單/張貼一個csrf令牌? – 2014-10-05 06:58:20