37

私は主にC++プログラマーですが、PHPを手に入れようとしています。

どうやら、Webユーザーセッションを実装する方法は、$_SESSION変数を使用してユーザーのログインIDをCookieに保存することです。

誰かが自分のCookieを変更したり、別の特権を与えたり、別のユーザーとしてログインしたりすることはできませんか?

この認証メカニズムは、ユーザーにIDをファイルに保存させ、変更しないように信頼しているようです。

これを妨げるものはありますか?

ありがとう!

4

6 に答える 6

67

PHP セッションは、アプリケーションが作成するときにのみ安全です。PHP セッションは、ユーザーが自分自身を識別するための疑似ランダム文字列 (「セッション ID」) をユーザーに提供しますが、その文字列が攻撃者によって傍受された場合、攻撃者はそのユーザーになりすますことができます。

何をすべきか

この情報は、PHP マニュアルの「Session Management Basics」から取得したものですが、少し簡略化しています。いくつかのことが見逃されている可能性があります。そちらも必ず読んでください。

  1. 常に使用HTTPS

    • 攻撃者がセッション ID Cookie を読み取れないようにします
  2. 有効にするsession.use_strict_mode:

  3. 有効session.use_only_cookies化および無効化session.use_trans_sid

    • セッション ID を含む URL を共有することで、ユーザーが誤ってセッション ID を共有するのを防ぎます
    • セッション ID がRefererヘッダーに表示されないようにします
  4. セッション ID を定期的に再生成し、再生成後すぐに古いセッション IDを無効にする

    • 攻撃者が別のユーザーのセッション ID を使用した場合、ID を再生成する要求を行った側に応じて、再生成によってユーザーまたは攻撃者のセッションが無効になります。その後、誰かがすでに再生成されたセッションを使用しようとしたときに追跡し、その時点で再生成されたセッションを無効にすることができます。ユーザーはログインできますが、攻撃者は (うまくいけば) ログインできません。
  5. $_SESSION必要に応じて、リクエストに関連する追加情報 (IP アドレス、ユーザー エージェント文字列など)を追跡します。

    • 攻撃者が何らかの方法でセッション ID にアクセスできた場合、攻撃者がデータにアクセスする前に侵入を検出できる可能性があります。ただし、これによりユーザー エクスペリエンスが低下する可能性があることに注意してください。たとえば、ユーザーがモバイル ネットワークから Wi-Fi に切り替えると IP アドレスが変更され、ブラウザが自動的に更新されるとユーザー エージェント文字列が変更される場合があります。サイトが対処しようとしているトレードオフに従って、チェックするデータを調整します。
于 2012-04-15T20:04:50.333 に答える
25

いいえ、セッションはサーバーに保存されており、ユーザーがアクセスすることはできません。ログインセッションなど、サイト全体の情報を保存するために使用されます。

使用例は次のとおりです。

<?php
session_start();
if (password_verify($_POST['password'], $hash)) {
    $_SESSION['auth'] = true;
}
?>

次に、サイト全体でセッションにアクセスして、ユーザーが認証されているかどうかを確認できます。

<?php
session_start();
if ($_SESSION['auth']) {
    echo "You are logged in!";
}
?>

ユーザーはこれらの値を編集できませんが、セッションのIDは、長いランダムな文字列としてCookieを介してコンピューターに保存されます。許可されていないユーザーがこれらの文字列にアクセスすると、サイトにアクセスする可能性があります。

于 2012-04-15T19:48:39.050 に答える
6

これを行う場合:

$_SESSION['user'] = $username;

その後$username、Cookieに直接保存されません。代わりに、一意のセッションIDが生成され、Cookie内に保存されます。

保存する情報$_SESSIONはサーバー側にのみ保存され、クライアントに送信されることはありません。その後のクライアントからの要求に応じて、サーバーはCookieに保存されているIDでセッションデータをロードしますsession_start()

比較的安全です。発生する可能性がある唯一のことは、誰かがセッションIDを傍受して、実際のユーザーセッションを盗む可能性があることです。ただし、HTTPSはそれを防ぐことができます。

于 2012-04-15T19:49:56.923 に答える
6

この質問に答えるには、2つのアプローチが必要です。

  1. PHPセッションIDは、ほとんどのユースケースで推測するのに十分なほど困難です。他の広く使用されているシステムほど難しくはありません。

  2. セッションCookieのみ(およびセッションCookieの存在のみ)を信頼することは、このセッションCookieがどこから来たのか(PHPまたは他の場所)に関係なく、セキュリティ面ではそれほど遠くないようです。

つまり、要するに、PHPセッションは、使用することで安全になるのと同じくらい安全です。これは、私が知っているすべてのセッションCookieベースのシステムに当てはまります。

于 2012-04-15T19:50:53.760 に答える
0

このトピックについてどのような答えが得られても、このトピックには非常に多くの異なる意見があるため、おそらく満足することはできません. セッションや PHP セキュリティ全般について書かれた本もあります。

ここで期待できる最良の答えは、おそらく「セッションはあなたが望むほど安全です」です。より多くの作業とより多くの注意事項により、明らかに安全に使用できますが、実装自体により多くの時間がかかります. すべての場合と同様に、ニーズに対してどれだけ安全であるかを測定するのはあなたです。

于 2012-04-15T20:05:16.083 に答える