2016-05-19 4 views
3

フォームにCSRFトークンを追加しようとしています。問題は、ファイルに追加してセッショントークンをエコーアウトし、トークンが 'token'という名前の入力に一致する場合です。しかし、私がページを提出してToken :: checkを使うとfalseを返し、入力とセッションからトークンの値をエコーアウトすると、セッションの値は変更されていますが、入力値は変わっていません。セッション変数は、フォームが送信されるときに値を変更します。

<?php 
class Token{ 
public static function generate(){ 
    return $_SESSION['token'] = base64_encode(openssl_random_pseudo_bytes(32)); 
} 

public static function check($token){ 
    if(isset($_SESSION['token']) && $token == $_SESSION['token']){ 
     unset($_SESSION['token']); 
     return true; 
    }else{ 
     return false; 
    } 
} 
} 
?> 

ここはフォームを制御するPHPです。以下は

$token = $_POST['token']; 
if(Token::check($token)){ //Continue with more code } 

トークンを扱うフォームの一部です:

<input type="hidden" name="user_id_update" value="<?php echo $user_info[0][0]->id; ?>"/> 
          <input type="hidden" name="time_update" value="<?php echo $time; ?>"/> 
          <input type="hidden" name="token" value="<?php echo Token::generate(); ?>" 
          <hr /> 

          <div class="form-group"> 
           <input type="submit" id="submit_update" value="Update" class="btn btn-success"/> 
          </div> 

誰もがこの上でいくつかの光を当てることができれば私はオンラインで検索してきたように私はそれを本当に感謝します時間は今であり、答えを見つけることができません。ありがとう。

+0

あなたのサンプルコードと説明に基づいて、私は間違ったことは何も見ません。提供されていない他のことが起こっているため、完全な推測ゲームになります。 –

答えて

0

コードを少し掘り下げた後。これらのファイルがWebサイトに追加された順序は、トークンを生成するコードがフォームのコントローラの上にあることを意味しました。フォームがポストされたときに毎回新しいセッション変数が作成されたため、ポストされたデータはセッション変数に格納されたデータと同じではありませんでした。これらのファイルが含まれていた順番を変更すると、問題が解決しました。これが将来誰かを助けてくれることを願っています。

0

私と同じ問題もありました。多くの時間を費やしてデバッグした後、私は奇妙な解決策に遭遇しました。問題はメタタグにありました。どのように私の問題を解決したか教えてください。

ファイル名:Token.php

<?php 
    class Token 
    { 
     public static function generate() 
     { 
      return $_SESSION['token'] = md5(time() . uniqid()); 
     } 

     public static function check($token) 
     { 
      if (isset($_SESSION['token']) && $token == $_SESSION['token']) { 
       unset($_SESSION['token']); 
       return true; 
      } else { 
       return false; 
      } 
     } 
    } 
?> 

ファイル名:myscript.php

<?php require_once 'header.php'; ?> 

<?php 
    if ($_SERVER['REQUEST_METHOD'] == 'POST') { 

     if(Token::check($_POST['token'])) { 
       echo 'valid token'; 

       // code... 
     } else { 
       echo 'invalid token'; 
     } 

    } 
?> 

<form action="" method="post"> 
    <!-- other fields --> 
    <input type="hidden" name="token" value="<?php echo Token::generate();?>"> 
    <input type="submit" value="Submit"> 
</form> 

<?php require_once 'footer.php'; ?> 

ファイル名:header.phpの

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="utf-8"> 
    <meta http-equiv="X-UA-Compatible" content="IE=edge"> 
    <meta name="viewport" content="width=device-width, initial-scale=1"> 
    <meta name="author" content="Ishtiyaq Husain"> 
    <link rel="shortcut icon" href="#" /> 

    <!-- other css files --> 
</head> 

これらは私がなっていた値です。

最初のページの読み込み:ページを更新した後

// print old token value from session 
echo $_SESSION['token']; //no value 
// generate new token 
echo Token::generate(); // e72a2f53a25f364e8a2e62e556f7e417 
// print new token value from session 
echo $_SESSION['token']; // e72a2f53a25f364e8a2e62e556f7e417 

// print old token value from session 
echo $_SESSION['token']; // a63e674d55e9248c25a48856649bf590 //expected value -> e72a2f53a25f364e8a2e62e556f7e417 
// generate new token 
echo Token::generate(); // 237063c2f7892242c79bfabcd48bcdc8 
// print new token value from session 
echo $_SESSION['token']; // 237063c2f7892242c79bfabcd48bcdc8 

トークンの時点でそれは$ _SESSION [ 'トークン']で新しいトークン値を取得し確認してください。なぜそれは隠された入力ボックスからの値と一致しません。デバッグ後、私はheader.phpからこの行を削除すると動作することがわかりました。 有効な説明はありますか?

<link rel="shortcut icon" href="#" /> 

などのアイコンのための有効なURLを使用します。

<link rel="shortcut icon" href="http://ishtiyaq.com/images/iLogo.png" /> 

結果は以下のとおりであった:

最初のページの読み込み:ページを更新した後

// print old token value from session 
echo $_SESSION['token']; //no value 
// generate new token 
echo Token::generate(); // 36e48f2307da7054c67822147878e0c6 
// print new token value from session 
echo $_SESSION['token']; // 36e48f2307da7054c67822147878e0c6 

// print old token value from session 
echo $_SESSION['token']; // 36e48f2307da7054c67822147878e0c6 //as expected 
// generate new token 
echo Token::generate(); // 734eaeeb862d4d0d52eea1a292f007ec 
// print new token value from session 
echo $_SESSION['token']; // 734eaeeb862d4d0d52eea1a292f007ec 
関連する問題