2017-04-25 5 views
0

簡単な設定:ページが読み込まれると、ランダムセッショントークンが生成され、$ _SESSION ["token"]に保存されます。フォームには、非表示の入力フィールドにこのトークンが含まれています。この時点まで問題はありません。非常に同じページ(action = "")にフォームを送信し、$ _SESSION ["token"]がPOST経由で送信されたトークンと等しいかどうかを確認しようとします。それに応じて変数が変更され、ページが再びロードされる前に古い$ _SESSION ["token"]を置き換える新しいセッショントークンが生成されます。PHPセッション変数が残っていません

問題はです:セッションが呼び出された瞬間に$ _SESSION ["token"]が再び変更されます(SESSIONとPOSTトークンの両方を比較する前に)。したがって、両方のトークンは決して一致しません。そして私はそれがなぜ変わるのか理解できません。これは、ページが読み込まれる前に、不明な起点のランダムなトークンをもう一度置き換えることで、これも実行されるため、私が書いたコード行ではありません。

INDEX:

<?php 
session_start(); 
date_default_timezone_set("Europe/Berlin"); 

$BASE_URL = "http://" . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI']; 

$form_valid = false; 


if (isset($_POST["token"]) && isset($_SESSION["token"])) { 
    if ($_POST["token"] == $_SESSION["token"]) { 
     $form_valid = true; 
    } 
} 

//Set (new) session token 
$token = bin2hex(random_bytes(10)); 
$_SESSION["token"] = $token; 

//Load actual page 
include ("/backend/admin.php"); 
?> 

含まれるページ:

<?php echo "FORM VALID:"; var_dump($form_valid); ?> 
<?php if (!isset($_SESSION["admin"]) || !$_SESSION["admin"]) { ?> 

    <form id="verify" method="POST" action=""> 
     <label>Password</label> 
     <input type="password" name="access"> 
     <input type="hidden" name="token" value="<?= $_SESSION['token'] ?>"> 
     <input type="submit" value="Senden"> 
    </form> 

<?php } else { ?> 

    ... 

<?php } ?> 

任意のヘルプは高く評価されます。ありがとうございました。

答えて

0

問題は、あなたのロジックであった、セッショントークンは関係なく、フォームが送信されるたびに更新されていない、

$token = bin2hex(random_bytes(10)); 
$_SESSION["token"] = $token 

オーケー

<?php 
    session_start(); 
    date_default_timezone_set("Europe/Berlin"); 

    $BASE_URL = "http://" . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI']; 

    $form_valid = false; 


if(empty($_SESSION["token"])){ 
$_SESSION["token"]= bin2hex(random_bytes(10)); 
} 

    if (isset($_POST["token"]) && isset($_SESSION["token"])) 
{ 
     if ($_POST["token"] == $_SESSION["token"]) { 
      $form_valid = true; 
      unset($_SESSION["token"]); 
     } 
    } 





    include ("/backend/admin.php"); 
    ?> 
+0

、これを試してみてくださいので、私はこれとそれを試してみました働いた。それは問題を解決している間に、間違ったパスワードを入力してからもう一度やり直すことができないためです。パスワードが何であっても、トークンは設定されていないので、新しいトークンを取得するには再度読み直す必要があります。 ああ、上記の例では、実際に正しいパスワードを確認する部分を切りました。申し訳ありません。 [1/2] – Hylaze

+1

しかし、なぜ私の論理に欠陥があるのか​​分かりません。既存のトークンが比較された後に新しいトークンが設定されているかぎり、ページを読み込むたびに新しいトークンを取得することは大丈夫です。それはまさに私がやっていることですね。 それはちょうどページリロード - >誰が気に?トークンは比較されず、新しいトークンを取得します。これはどこに欠陥があるのか​​わかりません。 しかし、それであれば、私を啓発してください:/ [2/2] – Hylaze

+0

問題が $ _POST [ "トークン"]だった - >古いトークン、 $ _SESSION [ "トークン"] - >新しいトークン、 ユーザーがサブミットするとすぐにページがリフレッシュされ、SESSIONが再び更新され、POSTに古いトークンが残るためです。これが役に立ちますようにお願いします。 –

関連する問題