0

セッションハイジャックを防ぐために、次の 3 つの関数を作成しました。彼らが働きます。スクリプトの冒頭で set_auth_token を呼び出します。次に、html フォームで get_auth_token を呼び出します。フォームが投稿された後、check_auth_token を呼び出します。ただし、ユーザーがフォームに入力した後、間違って入力した後、F5/Refresh を押す傾向がある場合があります。これにより、ページが「死にます」。フォームが入力される前には発生しません。

これらを改善して、ユーザーが更新を押すたびに終了しないようにするにはどうすればよいですか?

function set_auth_token()
{
   if (!isset($_SESSION['auth_token']))
   {
      $_SESSION['auth_token'] = hash('sha256',rand().time().$_SERVER['HTTP_USER_AGENT'].$_SERVER['REQUEST_URI']);
   }
}

get_auth_token は常に set_auth_token が呼び出された後に呼び出されるため、認証トークンが見つからない場合は終了します。

function get_auth_token()
{
   if (isset($_SESSION['auth_token']))
   {
      return $_SESSION['auth_token'];   
   }
   else
   {
      die('"No auth token."');
   }
}

ページを停止させる関数:

function check_auth_token()
{
   if (array_key_exists('auth_token', $_SESSION) && array_key_exists('auth_token', $_POST))
   {
      if ($_SESSION['auth_token'] == $_POST['auth_token'])
      {
         $_SESSION['auth_token'] = hash('sha256', rand() . time() . $_SERVER['HTTP_USER_AGENT'] . $_SERVER['REQUEST_URI']);
      }
      else
      {
         die('Woah! It seems like you pressed Refresh (or Back/Forward). Just click here to sort it out.'); # TODO: hyperlink silly
      }
   }
   else
   {
      die('no auth token');
   }
}

乾杯。

4

1 に答える 1

1

私の推測 (あなたのコメントに基づく) は、ユーザーが更新すると、POST データを再度送信していますがauth_token、スクリプトの先頭で更新されているため、$_POST(前のページで生成された) の値はもはや新しい値 (スクリプトの開始時に生成されます) と等しくなります。

Post データの再送信を停止するには、 Post/Redirect/Getを確認する必要があります。

既存のキーを検証または無効化するまで、キーを再生成しないことを検討することもできます。

于 2011-04-05T00:07:27.703 に答える