2011-10-18 14 views
1
session_start(); 
$token = md5(uniqid(rand(), TRUE)); 
$_SESSION['token'] = $token; 

これは私が私のコードを起動する方法です。変数が失敗したセッション、PHPの問題

私は、その後、フォームに隠しフィールドに$トークン変数をtaht渡す:

<input type="hidden" name="token" value="<?php echo $token; ?>" /> 

が、その条件は決して真にはならない:

if($_POST['token'] == $_SESSION['token']) 
{  
     echo 'Session was valid<br/>'; 
} 

なぜですか?

+0

あなたが比較でない場合は右の値を行う際に '' $ _POST [「トークン」] 'と' $ _SESSION [「トークン」]には何ですか? – Clive

+0

隠しフィールドはpost ,,と呼ばれ、セッション変数はtokenと呼ばれ、php変数はtokenと呼ばれます。 $ tokenは、ページの読み込み/再読み込みのたびに '$ token'を生成し、フォームデータが検証される前に変更されている可能性があるため、おそらく –

+1

の内部で同じでなければなりません。 – user973254

答えて

2

ページ送信時に、新しい値がセッションに割り当てられます。

てみてください、あなたが誤ってトークンの作成とフォームの出力の間にそれを再割り当てする場合には、代わりに$tokenの形に$_SESSION['token']をエコー

session_start(); 
if(!isset($_SESSION['token'])) 
{ 
$token = md5(uniqid(rand(), TRUE)); 
$_SESSION['token'] = $token; 
} 
+0

ありがとう、それは問題を解決しました –

1

してみてください。

年齢がわかっているものを開発していたときにこれと非常によく似た問題がありましたが、画像がまだないので<img src=''>を残していたため、空のsrcが「このページ」を意味するため、ページが再度要求されたため、ページがロードされた後にトークンが再生成されました。

また、if (...)ステートメントの前に、フォームのaction属性が存在しないか、またはそれ自身を指す値がある場合は、フォームの送信時にトークンが再生成される可能性があります。

+0

非常に役立ちます。私はそれについて考えていません..私はフォームがそれ自身を再生すると思います –

3

チェックする前にトークンを再生成するためです。あなたはそれがありません確信している後にそれを変更する必要が同じ

0

すべてのページの負荷にトークンをリセットしないようにするために、あなたはこのような何かを行うことができます:

session_start(); 
if (!isset($_SESSION['token'])) 
{ 
    $token = md5(uniqid(rand(), TRUE)); 
    $_SESSION['token'] = $token; 
} 

をしかし...あなたがかもしれより良いオフsession.referer_checkまたは手順上の標準の上にこれを固定するよりもきめ細かなセキュリティを組み込んだいくつかのオープンソースのセッションクラスを使用します。 (実際にセッションが使用されている場合でも、コードが正しく実行された場合は、コードを変更する必要はありません)。 詳細については、php.net/session_set_save_handlerを参照してください。

0

あなたが提供するコードは1つのファイルであり、あなた自身がそれを送信します。 トークンを再生成し、セッション変数に割り当てます。 「AVD」で述べたように、あなたはあなたがチェックしようとしているあなたの状態を比較することができ、それ

session_start(); 
if(empty($_SESSION['token'])){ 
    $token = md5(uniqid(rand(), TRUE)); 
    $_SESSION['token'] = $token; 
} 

再割り当てを防止するためのコードです。

関連する問題