コンピューター ウィンドウズ インターネット

PHP session_id()はリクエストごとに更新され、$ _ COOKIEは空です。 PHPでのセッションID保護phpでのセッション

Webサーバーはサポートしていません 永続的な接続クライアントとの接続で、各リクエストは新しいリクエストとして処理され、以前のリクエストとは関係ありません。
つまり、同じ訪問者からのリクエストを追跡したり、ビュー間でその訪問者の変数を保存したりすることはできません。 個々のページ。 セッションが発明されたのは、これら2つの問題を解決するためです。
実際、セッションは、一言で言えば、ブラウザを一意に識別し、セッション変数を格納するサーバー上にこのブラウザ用のファイルを作成できるメカニズムです。

このようなメカニズムの必要性については詳しく説明しません。 これらは、eショップのショッピングカート、承認などの教科書のケースであり、サイトのインタラクティブな部分をスパムから保護するなどの些細な問題ではありません。

原則として、セッションの独自のアナログを作成するのは非常に簡単です。組み込みのPHPほど機能的ではありませんが、本質的には似ています。 クッキーとデータベースについて。
スクリプトをリクエストするとき、特定の名前のCookieが到着したかどうかを確認します。 Cookieがない場合は、Cookieを設定し、ユーザーデータを含む新しい行をデータベースに書き込みます。 Cookieがある場合は、データベースから読み取ります。 別のリクエストで、データベースから古いレコードを削除し、セッションメカニズムの準備が整いました。 結構簡単。 ただし、組み込みのセッションメカニズムを使用することが望ましいニュアンスがいくつかあります。

最初のものだけが有効になっている場合は、セッションの開始時(各呼び出しで) session_start())Cookieがクライアントに設定されます。 ブラウザは次のリクエストごとにこのCookieを正しく返し、PHPにはセッションIDがあります。 ブラウザがCookieを返さない場合、問題が発生します。 この場合、識別子付きのCookieを受信しないと、PHPは常に新しいセッションを開始し、メカニズムは機能しません。

2つ目のみが有効になっている場合、Cookieは設定されません。 そして、何が起こるかというと、基本的には、組み込みのセッションメカニズムを使用する価値があります。 スクリプトがその役割を果たし、ページが完全に形成された後、PHPはそれをすべてスキャンし、各リンクと各フォームにセッション識別子の転送を追加します。 これは次のようになります。
索引に変わる
索引
フォームに非表示フィールドを追加する

また、ブラウザは、リンクをクリックするとき、またはフォームのボタンをクリックすると、リクエストで必要な変数(セッションID)を送信します。
明らかな理由で、IDは相対リンクにのみ追加されます。

理論的には、Cookieとデータベースに関する自作のセッションでは、IDの転送をすべてのリンクに手動で割り当てることができます。そうすれば、Cookieに関係なく独自のセッションが機能します。 しかし、ほら、他の誰かがこれを行うともっと楽しいですか? ;-)

デフォルトでは 最新バージョン PHPは両方のオプションを有効にしました。 この場合、PHPはどのように動作しますか? クッキーは常に設定されています。 PHPがセッションIDCookieを見つけられない場合にのみ、リンクは自動補完されます。 ユーザーがこのセッションで初めてサイトにアクセスすると、Cookieが設定され、リンクが完成します。 次のリクエストで、Cookieがサポートされている場合、PHPはCookieを確認し、リンクのパディングを停止します。 Cookieが機能しない場合、PHPは引き続きIDをリンクに適切に追加し、セッションが失われることはありません。
Cookieが機能しているユーザーには、IDの長いリンクが1回だけ表示されます。

ふぅ。 識別子の転送が終了しました。
これで、サーバー側のデータを含むファイルをバインドする必要があります。
PHPが代行してくれます。 書くのは簡単です
session_start();
$ _SESSION ["test"] = "Hello world!" ;

そして、PHPはこのセッションに関連付けられたファイルに変数testを書き込みます。
ここに非常に重要な注意があります。
配列 $ _SESSION- 特殊な。
実際、さまざまなスクリプトで使用できるようにしたい変数があります。
変数をセッションに配置するには、変数を$ _SESSION配列の要素に割り当てるだけで十分です。
その値を取得するには、同じ要素を参照するだけです。 例を以下に示します。

ガベージコレクション-廃止されたものを削除する PHPファイルまた、それを自分で行います。 データエンコーディングやその他の必要なものの束と同様に。 このケアの結果として、セッションでの作業は非常に簡単です。
ここで、実際、セッションの作業の例に到達しました。
例は非常に小さいです:
session_start();

エコー 「このページを更新しました」。 $ _SESSION ["カウンター"] ++。 " 一度。 " ;
エコー "
アップデート" ;
?>

セッションにカウンター変数があるかどうかを確認し、ない場合は、値0で作成してから、その値を表示して1つ増やします。 増加した値はセッションに書き込まれ、次にスクリプトが呼び出されたときに、変数の値は1になり、以下同様に続きます。
すべてがとてもシンプルです。

サイトの任意のページのセッション変数にアクセスするには、セッションが必要なすべてのファイルの先頭に1行だけ(!)を書き込む必要があります。
session_start();
次に、$ _ SESSION配列の要素にアクセスします。 たとえば、承認チェックは次のようになります。
session_start();
if($ _SESSION ["authorized"]<> 1 ) {
header( "場所:/auth.php");
出口;
}

セッションから変数を削除します。
register_globals = offがある場合は、次のように書くだけで十分です。
unset($ _ SESSION ["var"]);
そうでない場合は、 近く彼女と一緒に書く
session_unregister( "var");

セッションを操作しようとしたときにPHPがスローする最も一般的なエラーは次のとおりです。
それらのうちの2つ
警告:セッションCookieを送信できません-ヘッダーはすでに送信されています
警告:セッションキャッシュリミッターを送信できません-ヘッダーはすでに送信されています

同じ理由で引き起こされ、解決策はこの偽物で説明されています
第3、
警告:open(/ tmp \ sess_SID、O_RDWR)が失敗しました:行番号のfull_script_pathにそのようなファイルまたはディレクトリ(2)がありません(以前は次のように見えました 警告:セッションデータ(ファイル)の書き込みに失敗しました。 session.save_pathの現在の設定が正しいことを確認してください(/ tmp)),
英語から翻訳すると、問題が詳細に説明されます。php.iniで指定されたディレクトリへのパスが利用できず、セッションファイルが書き込まれます。 このエラーは最も簡単に修正できます。 たとえば、存在して書き込み可能なディレクトリを作成するだけです。
session.save_path = c:\ windows \ temp
その後、Apacheを再起動することを忘れないでください。

結局のところ、人間の創意工夫には限界がないので、私は次のことを説明せざるを得ません。
3番目のエラーメッセージ(ディレクトリが見つかりません)は、最初の2つに必然的になります。これは、エラーメッセージがブラウザに出力され、その後にヘッダーを使用できないためです。 したがって、時期尚早の結論を急いで探すのではなく、最初に正しい道を書き留めてください!

セッションに関する次の最も一般的な問題は、register_globalsの大きな遺産です。 $ _SESSION配列のインデックスと一致するスクリプト変数名を付けないでください。
register_globals = onを指定すると、値が互いに上書きされ、混乱します。
また、register_globals = offを使用すると、別のエラーが表示されます。「スクリプトに値のないセッション変数があり、グローバル同じ名前の変数。 これを取り除くには、使用する前に常に変数を初期化する(または少なくとも存在を確認する)必要があり、$ _ SESSION配列のインデックスと一致するグローバル変数名を指定しないでください。

それが機能しないがメッセージが表示されない場合は、画面にすべてのエラーを表示する責任があるスクリプトの最初に2行を追加します-エラーがある可能性は十分にありますが、単にそれらが表示されません。
ini_set( "display_errors"、1);
error_reporting(E_ALL);

または、error_logのエラーを参照してください。 一般に、エラーメッセージの表示に関するトピックはこの記事の範囲を超えているため、少なくともエラーメッセージが表示されることを確認してください。 このセクションで、エラーの検出についてもう少し読むことができます。

エラーがないことは確かですが、上記の例がとにかく機能しない場合は、PHPがURLを介したIDの受け渡しを有効にしていない可能性があります。 クッキーが何らかの理由で機能しない.
あなたのクッキーがどうなっているのか見てみましょう。
一般に、セッションが機能しない場合は、最初にセッションIDを手動で渡すか、リンクを作成してIDを割り当てます。
session_start();
if(!isset($ _ SESSION ["counter"]))$ _SESSION ["counter"] = 0;
エコー 「このページを更新しました」。 $ _SESSION ["カウンター"] ++。 " 一度。

アップデート" ;
?>

これを行うときは、session.use_only_cookiesディレクティブが含まれていないことを確認してください。これにより、PHPがURLを介して渡された場合にセッションIDを受け入れることができなくなります。

この例が機能しない場合、問題は平凡なものにあります ミスプリント(セッションの「問題」の半分は、スペルミスのある変数名に起因します)、または 古いバージョン PHP:セッションサポートはバージョン4.0で導入され、配列 $ _SESSION-4.1で(以前に使用された $ HTTP_SESSION_VARS).
それが機能する場合、問題はCookieにあります。 追跡-ブラウザがブラウザに返すかどうかに関係なく、サーバーがブラウザにどのような種類のCookieを配置するか。 検索は、ブラウザとサーバー間のHTTPヘッダーの交換を調べることで非常に役立ちます。
Cookieがどのように機能するかについての説明は、このすでに長すぎるテキストの範囲を超えていますが、少なくともサーバーが識別子を使用してCookieを送信し、ブラウザーがそれを返すことを確認してください。 同時に、識別子は互いに一致します=)
Cookieの設定は次のようになります
Set-Cookie:PHPSESSID = prlgdfbvlg5fbsbshch6hj0cq6;
またはどのように
Set-Cookie:PHPSESSID = prlgdfbvlg5fbsbshch6hj0cq6; パス= /
(ルートディレクトリからではなくスクリプトを要求している場合)
サーバーの応答は次のようになります
クッキー:PHPSESSID = prlgdfbvlg5fbsbshch6hj0cq6
また
クッキー:PHPSESSID = prlgdfbvlg5fbsbshch6hj0cq6; b = b
ブラウザがセッションID以外のCookieを返した場合。

ブラウザがCookieを返さない場合-Cookieがまったく機能するかどうかを確認します。
アクセスしているドメインに有効な名前(少なくとも1つのドットがあり、アンダースコアなどの不正な文字が含まれていないこと)を確認し、ブラウザのキャッシュをクリアします。これが、Cookieが機能しない主な2つの理由です。

ここの例が機能するが、独自のコードが機能しない場合、問題は明らかにセッションではなく、アルゴリズムにあります。 変数を失った場所を探し、ここから例を段階的に転送し、スクリプトをデバッグします。

ヘッダーリダイレクトまたはJavaScriptナビゲーションを使用すると、別の問題が発生する可能性があります。
実際、PHPはフォームのリンクにのみセッション識別子を自動的に追加します 、ただし、ヘッダー、javascript、メタタグに対してはこれを行いません。
したがって、たとえば次のように、識別子を手動で追加する必要があります。
header( "Location:/script.php?" .session_name()。 "=" .session_id());

また、非常にまれであり、それがどこから来ているのかが完全に不明です。問題は、session.save_handler設定にファイル以外の値があることです。 そうでない場合は、修正してください。

安全性
セッションのセキュリティは幅広いトピックです。 したがって、いくつかの重要なポイントに焦点を当てます。
ほとんどの教科書-識別子を渡さないでください アドレスバー。 これはphp.iniでも記述されていますが、セッションの機能が制限されます。 このアドバイスに従うことにした場合は、session.use_trans_sid = 0に加えて、session.use_only_cookies = 1を忘れないでください。
セッションをIPアドレスにバインドすることをお勧めします。このようにして、識別子が盗まれた場合でも、悪役はほとんどの場合それを使用できません。
session.save_pathディレクティブを使用することをお勧めします。このディレクティブを使用して、セッションファイルを保存するための独自のディレクトリを設定できます。 これは、デフォルトでサーバーの共有一時ディレクトリに保存されている場合よりも安全です。

追加情報:

  • Cookieに加えて、セッションメカニズムは、ページキャッシュを禁止するヘッダー(同じキャッシュリミッター)も送信します。 HTMLの場合、これは正しく、必要です。 ただし、認証を確認するスクリプトを使用してファイルを送信しようとすると、InternetExplorerはそのファイルのダウンロードを拒否します。 このタイトルのせいです。 電話
    session_cache_limiter( "private");
    セッションを開始する前に、問題を解決する必要があります。
  • 奇妙に見えるかもしれませんが、配列内 $ _SESSION数値インデックスは使用できません- $ _SESSION [1]、$ _ SESSION ["10"]-セッションは機能しません。
  • バージョン4.2と5.0の間のどこかで、session.use_trans_sidを設定することができませんでした ini_set()。 5.0から、それはすでに再び可能です。
  • バージョン4.3.3より前では、セッションの開始時にリクエストに識別子がなかった場合にのみ、PHPがCookieを送信していました。 これで、Cookieはすべての呼び出しで送信されます session_start()

    セッションを使用した承認の例
    上記のすべてを小さな例で説明しましょう。
    auth.phpファイルを作成します。
    if(isset($ _ POST ["auth_name"]))
    {
    $ sql = "SELECT * FROM users WHERE name =?s";
    $ row = $ db-> getRow($ sql、$ _ POST ["auth_name"]);
    if($ row && password_verify($ _POST ["auth_pass"]、$ row ["pass"]))(
    $ _SESSION ["user_id"] = $ row ["id"];
    }
    header( "Location:http://"。$ _ SERVER ["HTTP_HOST"]。$ _ SERVER ["REQUEST_URI"]);
    出口;
    }

    if(isset($ _ GET ["action"])AND $ _GET ["action"] == "logout")(
    session_start();
    session_destroy();
    header( "Location:http://"。$ _ SERVER ["HTTP_HOST"]。 "/");
    出口;
    }

    if(!isset($ _ SESSION ["user_id"]))(
    ?>








    出口;
    }

    これで、保護されたすべてのスクリプトに次の行を書き込むだけで十分です。
    「auth.php」が必要です;
    この例では、MySQLでの安全で便利な作業のためにクラスを使用して、セッションがすでに開始され、データベース接続が作成されていることを前提としています。 また、推奨されるpassword_hash関数を使用してパスワードがハッシュされていることを前提としています。
    保護されたファイルの例:

    session_start();
    "safemysql.class.php"を含める;
    $ db = new safemysql(["db" => "test"]);
    「auth.php」を含める;
    ?>
    秘密

    ログアウト

    OPS! 非常に便利なリンク:
    http://www.php.net/manual/en/ref.session.php-公式ドキュメントのPHPでのセッションサポートに関する最新の最新情報と、多数のユーザーコメント。 読むことを強くお勧めします。
    http://phpclub.ru/manrus/f/ref.session.html-Alexander Piramidinによって翻訳されたドキュメントからの、この章のロシア語への非常に時代遅れの翻訳。
    http://phpclub.ru/detail/article/sessions
    哀れなタイトル「セッションについての真実」の記事。 二重の印象を残します。 最初に、著者はセッションのメカニズムについて非常にアクセスしやすいと話しますが、記事の終わりまでに彼が提供する方法は完全に泥だらけです。

    サイトのDmitryBorodinによる教科書記事
    http://php.spb.ru/は強くお勧めしません。
    みんな、彼女はひどく時代遅れです。 実際に不正確であるだけでなく、PHPでのセッションは長い間機能していません。
    Dimaのおかげで、ロシア語でのセッションに関する最初の記事でした。私はそれを自分で勉強しましたが、今は当然の休息に送る必要があります。
    また、残念ながら、インターネット上にあり、何年も更新されていない他の多くの記事は古くなっています。

  • PHPのセッションは、サーバー側のクライアントのコンピューターに関する情報を格納するためのメカニズムです。 実際、PHPでのセッションはそれほど複雑なトピックではありませんが、それを理解するには、PHPでCookieがどのように機能するかを知る必要があります。 したがって、PHPでCookieがどのように機能するかわからない場合は、最初に対応する記事を読んでから、ここに戻ってください。

    セッションという言葉は英語からセッションとして翻訳されているので、PHPでのセッションの意味はより理解しやすくなりますが、「セッション」という用語はプログラマーの間で定着しており、この記事で使用します。

    PHPのセッションは、Cookieメカニズムと非常によく似ており、同じキー=>値のペアですが、サーバー側に保存されるだけです。

    session_start()関数

    セッションを開始する必要があります。これには、session_start()関数があります。 この関数は、セッション、またはセッションを開始します。

    ページの最初でsession_start()関数を呼び出すことが望ましいですが、私の例ではこれを行いません。

    配列$ _SESSION

    セッションは、サーバーに格納されているが1人の一意の訪問者を参照する変数のグループです。 繰り返します、これ 重要な瞬間: セッションはサーバーに保存されます.

    各訪問者と彼のセッションからのデータとの相互作用を確実にするために、 クッキー、PHP自体が作成するコマンドを提供しますが、それについて心配する必要はありません。 このCookieはサーバー専用であり、ユーザーデータの取得には使用できません。

    サーバーでは、セッションデータはに保存されます テキストファイルこれらは、PHPプログラムの$ _SESSION配列で使用できます。 セッションに変数を格納するには、この配列に値を割り当てる必要があります。

    最後に例を使い始めましょう。 すべてがとてもシンプルです。

    PHPでのセッション 値。 ";?>

    次に、別の例で$ _SESSION配列から値を取得してみましょう。

    PHPでのセッション

    2番目の例でsession_start()関数を削除すると、$ _ SESSION配列データにアクセスできなくなることに注意してください。

    session_id()関数

    セッションが作成された後、session_id()関数を使用して一意のセッションIDに自動的にアクセスできます。 この関数を使用すると、セッションID値の設定と取得の両方を行うことができます。

    PHPでのセッション

    ブラウザの開発者ツールバーを見ることができます(Chromeでは、Ctrl + Shift + I、次にResourcesを押すと、Cookieが見つかります)。このドメインは、PHPSESSIDという名前のCookieをブラウザに配置します。「7g5df9rkd1hhvr33lq1k6c72p7 "。

    前述のように、サーバーがブラウザーを判別し、$ _ SESSION配列を介してスクリプトで使用できる対応する変数のセットを処理するのは、PHPSESSIDの値によるものです。

    session_name()関数

    session_id()関数でセッション識別子の値を取得できる場合、session_name()関数でセッションの名前を取得できます。

    PHPでのセッション

    もう一度session_start()関数について

    これで、PHPのセッションの仕組みについて詳しく理解できたので、もう一度session_start()関数に戻る必要があります。 この関数は、現在のユーザーのセッションメカニズムを初期化します。 これはどの程度正確に行われますか。

    • ユーザーが初めてサイトを実行している場合、session_start()はクライアントにCookieを設定し、ユーザーIDに関連付けられたサーバー上に一時ストレージを作成します。
    • 渡された現在のIDに関連付けられているストアを指定します。
    • サーバーのストレージにデータがある場合、そのデータは$ _SESSION配列に配置されます。
    • php.iniファイルのregister_globalsがOnに設定されている場合、$ _SESSION配列のすべての要素がグローバル変数に変換されます。

    セッションの使用例

    次に、セッションで小さな実験を行うことができる例を見ていきます。

    PHPでのセッション

    カウンター

    現在のセッションで、ページを開きました一度。

    ">このタブで例を開きます。

    すべてのセッション作業は$ _SESSION配列に基づいており、この例ではっきりとわかります。

    ブラウザウィンドウを閉じると、セッションが終了し、カウンタがゼロにリセットされます。 PHPでのセッションのこの動作は変更できます。この問題については、この記事の後半で説明します。

    セッションを終了する

    セッションを終了するには、次のものが必要です。

    1. $ _SESSION配列をクリアします。
    2. サーバー上の一時ストレージを削除します。
    3. セッションCookieを削除します。

    session_unset()関数を使用して、$ _ SESSION配列をクリアできます。

    session_destroy()関数は、サーバー上の一時ストレージを削除します。 ちなみに、彼女はもう何もしていません。

    PHP cookieチュートリアルで学習したsetcookie()関数を使用して、セッションcookieを削除する必要があります。

    セッション終了の例:

    セッションを終了する

    セッションが終了しました。

    これで、実験を行うことができます。1つのウィンドウにカウンターを使用して例を実行し、カウンターを巻き上げてから、セッションを削除して例を実行し、カウンターを使用してページを再度更新します。

    次のようにCookieファイルを削除できます。

    setcookie(session_name()、 ""、time()-60 * 60 * 24 * 32、 "/")

    もう一度、session_name()関数とsession_id()関数について

    session_name()関数とsession_id()関数が実際に使用されることはめったにありませんが、この記事ではPHPでのセッションのメカニズムそのものを明らかにする必要があるため、これらについて記述します。

    これらの関数を使用して独自のセッション名とIDを設定できますが、これはお勧めしません。 それらを設定する場合は、次の例のように、session_start()関数の前に引数を使用してこれらの関数を記述します。

    PHPでのセッション

    この例を使用すると、すべてのユーザーに同じセッションIDが割り当てられます。

    ここでさらに詳しく説明します。さまざまなブラウザ(たとえば、ChromeやInternet Explorer)でsession_name()関数(ここにリンクがあります)に関するセクションの例を実行すると、各ブラウザに独自のブラウザがあります。一意のセッション識別子。 ブラウザはCookieを独自のフォルダに保存するため、session_start()関数を使用すると、各ブラウザで独自の一意の識別子を作成できます。したがって、サーバー上に一意のストレージがブラウザごとに作成されます。 したがって、各ブラウザーにカウンター(これ)がある例は、互いに独立して機能します。

    すべてのユーザーに同じセッションIDを設定すると、ユーザーはサーバー上の同じストレージで機能します。 さまざまなブラウザからの訪問をカウントするカウンターの例を次に示します。

    100)(session_unset(); session_destroy();)?> PHPでのセッション

    カウンター#2

    別のブラウザでページを開いた一度。

    ">このタブで例を開きます。

    この例を実行すると、そこにユニットが表示されるのは事実ではありません。 他の訪問者は、サーバー上のセッションストアの値をすでに変更している可能性があります。 この場合、サーバーがストレージを削除すると、わかりません。カウンターが100を超えると、セッションが終了します。

    待ち時間の設定

    デフォルトでは、セッションは訪問者がブラウザウィンドウを閉じるまで「存続」します。 これは、session_start()関数がそのようなCookieをクライアントに設定するためです。

    セッションの有効期間は、session_set_cookie_params()関数を使用して変更できます。構文は次のとおりです。

    session_set_cookie_params(int Lifetime [、string path [、string domain [、bool secure]]])

    実際には、最初のパラメーター(lifetime)のみを使用するだけで十分です。ここでは、時間を秒単位で書き留めます。これにより、ブラウザーを閉じた後、サーバーがセッション状態を記憶する期間が決まります。

    session_set_cookie_params()関数のアクションは、スクリプト操作の期間にのみ適用されます。

    この関数の使用例を次に示します。

    PHPでのセッション

    カウンター#3

    カウンターバリュー:.

    ">このタブでカウンターを開きます。

    カウンターを巻き上げてブラウザーを閉じ、30秒後にこの例をもう一度開きます。 セッションが保存されます。

    セッションは実際には非常に単純です。 それらが何のためにあり、どのように配置されているかを理解する必要があります。 最初に最初の質問に答えましょう。
    Webサーバーがクライアントとの永続的な接続を維持しておらず、各要求は以前の要求に関係なく、新しい要求として扱われることをご存知かもしれません。

    つまり、同じ訪問者からのリクエストを追跡したり、個々のページビュー間でその変数を保存したりすることはできません。 セッションが発明されたのは、これら2つの問題を解決するためです。
    実際、セッションは、一言で言えば、ブラウザを一意に識別し、セッション変数を格納するサーバー上にこのブラウザ用のファイルを作成できるメカニズムです。

    このようなメカニズムの必要性については詳しく説明しません。 これらは、オンラインストアのショッピングカート、承認などの場合と、サイトのインタラクティブな部分をスパムから保護するなどの些細な問題ではありません。

    原則として、セッションの独自のアナログを作成するのは非常に簡単です。組み込みのPHPほど機能的ではありませんが、本質的には似ています。 クッキーとデータベースについて。

    スクリプトをリクエストするとき、特定の名前のCookieが到着したかどうかを確認します。 Cookieがない場合は、Cookieを設定し、ユーザーデータを含む新しい行をデータベースに書き込みます。 Cookieがある場合は、データベースから読み取ります。 別のリクエストで、データベースから古いレコードを削除し、セッションメカニズムの準備が整いました。 結構簡単。 ただし、組み込みのセッションメカニズムを使用することが望ましいニュアンスがいくつかあります。

    まず、何らかの方法でブラウザを識別する必要があります。 これを行うには、彼に一意の識別子を与え、リクエストごとにそれを転送するように依頼する必要があります。 認めるのは恥ずかしいことですが、セッションについて最初に知ったとき、これは特別なメカニズムであり、ブラウザがサーバーと通信するための新しい方法である「セッション」だと思いました。 セッションIDが特別な方法で渡されること。 しかし、失望はひどいものでした...

    セッションでは、標準のよく知られた方法を使用してデータを転送します。 実際、他に何もありません。
    識別子は正規変数です。 デフォルト名はPHPSESSIDです。
    PHPのタスクは、ブラウザに送信して、次のリクエストで返すようにすることです。 すでに述べたFAQセクションから、変数を渡すことができるのは、CookieまたはPOST / GETリクエストの2つの方法のみであることが明らかです。
    PHPは両方のオプションを使用します。

    php.iniの2つの設定がこれに関与しています。

    session.use_cookies-1に等しい場合、PHPは識別子をCookieに渡します。0の場合、いいえ。
    session.use_trans_sidが1の場合、PHPはそれをURLとフォームに追加して渡します。0の場合は、いいえです。

    これらおよび他のセッションパラメータは、他のPHP設定と同じ方法で変更できます。php.iniファイル、およびini_set()コマンドまたはWebサーバー構成ファイルを使用します。

    最初のものだけが有効になっている場合は、セッションの開始時(各呼び出しで) session_start())Cookieがクライアントに設定されます。 ブラウザは次のリクエストごとにこのCookieを正しく返し、PHPにはセッションIDがあります。 ブラウザがCookieを返さない場合、問題が発生します。 この場合、識別子付きのCookieを受信しないと、PHPは常に新しいセッションを開始し、メカニズムは機能しません。

    2つ目のみが有効になっている場合、Cookieは設定されません。 そして、何が起こるかというと、基本的には、組み込みのセッションメカニズムを使用する価値があります。 スクリプトがその役割を果たし、ページが完全に形成された後、PHPはそれをすべてスキャンし、各リンクと各フォームにセッション識別子の転送を追加します。 これは次のようになります。

    索引

    に変わる

    索引

    フォームに非表示フィールドを追加する

    理論的には、Cookieとデータベースに関する自作のセッションでは、IDの転送をすべてのリンクに手動で割り当てることができます。そうすれば、Cookieに関係なく独自のセッションが機能します。 しかし、ほら、他の誰かがこれを行うともっと楽しいですか? ;-)

    最近のバージョンのPHPでは、両方のオプションがデフォルトで有効になっています。 この場合、PHPはどのように動作しますか? クッキーは常に設定されています。 また、PHPがセッションIDのCookieを検出しなかった場合にのみ、リンクがオートコンプリートされます。 ユーザーがこのセッションで初めてサイトにアクセスすると、Cookieが設定され、リンクが完成します。 次のリクエストで、Cookieがサポートされている場合、PHPはCookieを確認し、リンクの完了を停止します。 Cookieが機能しない場合、PHPは引き続きIDをリンクに適切に追加し、セッションが失われることはありません。
    Cookieを有効にしているユーザーには、IDの長いリンクが1回だけ表示されます。

    識別子の転送が終了しました。 これで、サーバー側のデータを含むファイルをバインドする必要があります。 PHPが代行してくれます。 書くのは簡単です:

    session_start();
    $ _SESSION ["test"] = "Hello world!" ;

    そして、PHPはこのセッションに関連付けられたファイルに変数testを書き込みます。

    ここに非常に重要な注意があります。

    配列 $ _SESSION- 特殊な。
    実際、さまざまなスクリプトで使用できるようにしたい変数があります。
    変数をセッションに配置するには、変数を$ _SESSION配列の要素に割り当てるだけで十分です。
    その値を取得するには、同じ要素を参照するだけです。 例を以下に示します。

    ガベージコレクション-廃止されたPHPファイルの削除も単独で処理されます。 データエンコーディングやその他の必要なものの束と同様に。 このケアの結果として、セッションでの作業は非常に簡単です。
    ここで、実際、セッションの作業の例に到達しました。
    例は非常に小さいです:

    session_start();

    エコー 「このページを更新しました」。 $ _SESSION ["カウンター"] ++。 " 一度。 " ;
    エコー "
    アップデート" ;
    ?>

    セッションにカウンター変数があるかどうかを確認し、ない場合は、値0で作成してから、その値を表示して1つ増やします。 増加した値はセッションに書き込まれ、次にスクリプトが呼び出されたときに、変数の値は1になり、以下同様に続きます。 すべてがとてもシンプルです。

    サイトの任意のページのセッション変数にアクセスするには、セッションが必要なすべてのファイルの先頭に1行だけ(!)を書き込む必要があります。

    session_start();

    session_start();
    if($ _SESSION ["authorized"]<> 1 ) {
    header( "場所:/auth.php");
    出口;
    }

    セッションから変数を削除します。 register_globals = offがある場合は、次のように書くだけで十分です。

    unset($ _ SESSION ["var"]);

    そうでない場合は、 近くそれであなたは書く必要があります:

    session_unregister( "var");

    どのセッションを使用すべきか、何を使用すべきでないかを理解することは非常に重要です。

    まず、セッションはユーザーが必要とする場合にのみ使用でき、ユーザーの邪魔にならないことを忘れないでください。 結局のところ、彼はいつでも識別子を取り除くことができます!
    たとえば、スクリプトではなくフォームに入力していることを確認するときに、ユーザー自身がセッションを機能させることに関心があるとします。そうしないと、フォームを送信できなくなります。 ただし、スクリプトへのリクエスト数を制限するために、セッションは適切ではなくなりました。悪意のあるスクリプトは単に識別子を返しません。

    第二に。 人が理解しているように、セッションがサイトでの作業のセッションであるという事実を明確に理解することが重要です。 来て、働いて、ブラウザを閉じました-セッションは終了しました。 映画のセッションのように。 別のチケットを見たい場合は、新しいチケットを購入してください。 新しいセッションを開始します。 これについての技術的な説明もあります。 セッションメカニズムは、ブラウザが閉じられるまでのみ機能することが保証されています。 結局のところ、Cookieはクライアントに対して機能しない可能性があり、この場合、もちろん、識別子が追加されたすべてのリンクは、閉じられると消えます。

    確かに、ブラウザを閉じないとセッションが消えることがあります。 この記事で説明した制限により、セッションメカニズムでは、ユーザーがいつブラウザを閉じたかを判断できません。 このために、タイムアウトが使用されます。これは、ユーザーがサイトを離れたと見なされる所定の時間です。 デフォルトでは、この設定は24分です。

    ユーザー情報を長期間保存する場合は、Cookieを使用し、必要に応じてサーバー上のデータベースを使用します。 特に、これはすべての一般的な認証システムの仕組みです。

    ユーザーが識別されると、セッションが開始され、認証のサインがセッションで送信されます。
    -ユーザーを「記憶」する必要がある場合、ユーザーを識別するCookieが配置されます。
    -ユーザーが次にサイトにアクセスするときにログインするには、パスワードを入力する必要があります。そうしないと、システム自体が以前に設定されたCookieによってユーザーを認識し、セッションが開始されます。 古いセッションを継続するのではなく、新しいセッション。

    第三に、サイトに入るすべての人のために、無差別にセッションを開始するべきではありません。 これは完全に不必要な負担を生み出します。 ささいなことのためにセッションを使用しないでください-たとえば、カウンターで。 もちろん、スパイログがセッションと呼ぶものは、ヒット統計に基づいて計算され、PHPのようなセッションメカニズムを使用していません。

    さらに、あなたのサイトにインデックスを付ける検索エンジンを見てみましょう。 検索ロボットがCookieをサポートしていない場合、デフォルトでPHPはリンクにPHPSESSIDを提供します。これは、検索エンジンではあまり人気がない可能性があります。これは、噂によると、動的リンクを優先しませんが、ここでは一般的に、訪問するたびに-新しいアドレス!

    セッションを使用してサイトのプライベートセクションへのアクセスを制限する場合、すべてが単なる検索エンジンであり、インデックスを作成するべきではありません。 承認されたユーザーと承認されていないユーザーの両方に同じページを表示する必要がある場合は、このトリックが役立ちます。パスワードを入力したユーザー、またはすでにセッションを開始しているユーザーに対してのみセッションを開始します。

    これを行うには、単にではなく、各ページの上部に session_start()私たちは書く:

    if(isset($ _ REQUEST [session_name()]))session_start();

    したがって、識別子を送信した人に対してのみセッションを開始します。
    したがって、承認時に初めてユーザーに送信する必要があります。

    名前とprolが正しければ、次のように記述します。 session_start() !

    セッションを操作しようとしたときにPHPがスローする最も一般的なエラーは次のとおりです。
    それらのうちの2つ

    警告:セッションCookieを送信できません-ヘッダーはすでに送信されています
    警告:セッションキャッシュリミッターを送信できません-ヘッダーはすでに送信されています

    同じ理由で引き起こされ、解決策はこの偽物で説明されています

    警告:open(/ tmp \ sess_SID、O_RDWR)が失敗しました:行番号のfull_script_pathにそのようなファイルまたはディレクトリ(2)がありません

    彼女が見える前に

    警告:セッションデータ(ファイル)の書き込みに失敗しました。 session.save_pathの現在の設定が正しいことを確認してください(/ tmp) ,

    英語から翻訳すると、問題が詳細に説明されます。php.iniで指定されたディレクトリへのパスが利用できず、セッションファイルが書き込まれます。 このエラーは最も簡単に修正できます。 たとえば、存在して書き込み可能なディレクトリを作成するだけです。

    session.save_path = c:\ windows \ temp

    その後、Apacheを再起動することを忘れないでください。

    結局のところ、人間の創意工夫には限界がないので、私は次のことを説明せざるを得ません。
    3番目のエラーメッセージ(ディレクトリが見つかりません)は、最初の2つに必然的になります。これは、エラーメッセージがブラウザに出力され、その後はヘッダーを使用できないためです。 したがって、時期尚早の結論を急いで探すのではなく、最初に正しい道を書き留めてください!

    セッションに関する次の最も一般的な問題は、register_globalsの大きな遺産です。 $ _SESSION配列のインデックスと一致するスクリプト変数名を付けないでください。

    register_globals = onを指定すると、値が互いに上書きされ、混乱します。

    それが機能しないがメッセージが表示されない場合は、画面にすべてのエラーを表示する責任があるスクリプトの最初に2行を追加します-エラーがある可能性は十分にありますが、単にそれらが表示されません。

    ini_set( "display_errors"、1);
    error_reporting(E_ALL);

    または、error_logのエラーを参照してください。 一般に、エラーメッセージの表示に関するトピックはこの記事の範囲を超えているため、少なくともエラーメッセージが表示されることを確認してください。 このセクションで、エラーの検出についてもう少し読むことができます。

    エラーがないことは確かですが、上記の例がとにかく機能しない場合は、PHPがURLを介したIDの受け渡しを有効にしていない可能性があります。 とクッキーは何らかの理由で機能しません.
    あなたがクッキーで持っているものを見てください。

    一般に、セッションが機能しない場合は、最初にセッションIDを手動で渡すか、リンクを作成してIDを割り当てます。

    session_start();
    if(!isset($ _ SESSION ["counter"]))$ _SESSION ["counter"] = 0;
    エコー 「このページを更新しました」。 $ _SESSION ["カウンター"] ++。 " 一度。

    アップデート" ;
    ?>

    これを行うときは、session.use_only_cookiesディレクティブが含まれていないことを確認してください。これにより、PHPがURLを介して渡された場合にセッションIDを受け入れることができなくなります。

    この例が機能しない場合、問題は平凡なものにあります ミスプリント(セッションの「問題」の半分は、スペルミスのある変数名に起因します)、または古すぎるバージョンのPHP:セッションサポートはバージョン4.0で導入され、配列 $ _SESSION-4.1で(以前に使用された $ HTTP_SESSION_VARS).

    それが機能する場合、問題はCookieにあります。 追跡-ブラウザがブラウザに返すかどうかにかかわらず、サーバーがブラウザにどのような種類のCookieを配置するか。 検索は、ブラウザとサーバー間のHTTPヘッダーの交換を調べることで非常に役立ちます。

    Cookieがどのように機能するかについての説明は、このすでに長すぎるテキストの範囲を超えていますが、少なくともサーバーが識別子を使用してCookieを送信し、ブラウザーがCookieを返すことを確認してください。 同時に、識別子は互いに一致します=)
    Cookieの設定は次のようになります

    Set-Cookie:PHPSESSID = prlgdfbvlg5fbsbshch6hj0cq6;

    Set-Cookie:PHPSESSID = prlgdfbvlg5fbsbshch6hj0cq6; パス= /

    (ルートディレクトリからではなくスクリプトを要求している場合)
    サーバーの応答は次のようになります

    クッキー:PHPSESSID = prlgdfbvlg5fbsbshch6hj0cq6

    クッキー:PHPSESSID = prlgdfbvlg5fbsbshch6hj0cq6; b = b

    ブラウザがセッションID以外のCookieを返した場合。

    ここの例が機能するが、独自のコードが機能しない場合、問題は明らかにセッションではなく、アルゴリズムにあります。 変数を失った場所を探し、ここから例を段階的に転送し、スクリプトをデバッグします。

    ヘッダーリダイレクトまたはJavaScriptナビゲーションを使用すると、別の問題が発生する可能性があります。
    実際、PHPはフォームのリンクにのみセッション識別子を自動的に追加します
    、ただし、ヘッダー、javascript、メタタグに対してはこれを行いません。

    したがって、たとえば次のように、識別子を手動で追加する必要があります。

    header( "Location:/script.php?" .session_name()。 "=" .session_id());

    また、非常にまれであり、それがどこから来ているのかが完全に不明です。問題は、session.save_handler設定にファイル以外の値があることです。 そうでない場合は、修正してください。

    • Cookieに加えて、セッションメカニズムは、ページキャッシュを禁止するヘッダー(同じキャッシュリミッター)も送信します。 HTMLの場合、これは正しく、必要です。 ただし、認証を確認するスクリプトを使用してファイルを送信しようとすると、InternetExplorerはそのファイルのダウンロードを拒否します。 このタイトルのせいです。 電話
      session_cache_limiter( "private");
      セッションを開始する前に、問題を解決する必要があります。
    • 奇妙に見えるかもしれませんが、配列内 $ _SESSION数値インデックスは使用できません- $ _SESSION [1]、$ _ SESSION ["10"]-セッションは機能しません。
    • バージョン4.2と5.0の間のどこかで、session.use_trans_sidを設定することができませんでした ini_set()。 5.0から、それはすでに再び可能です。
    • バージョン4.3.3以前のCookieは、セッションの開始時にリクエストに識別子が含まれていなかった場合にのみCookieを送信していました。 これで、すべての呼び出しでCookieが送信されます session_start

      さらに質問がある場合、または何かが明確でない場合は、私たちへようこそ

    セッションは、一意のセッションIDを持つ個々のユーザーの情報を保存する簡単な方法です。 これは、ページ要求間の状態を保存するために使用できます。 セッションIDは通常、セッションCookieを介してブラウザに送信され、使用可能なセッションデータを取得するために使用されます。 セッションIDまたはセッションCookieがない場合、PHPは新しいセッションを作成して新しいセッションIDを生成するように指示されます。

    セッションは単純なテクノロジーを使用します。 セッションが作成されると、PHPは渡されたID(通常はセッションCookieから)を使用して既存のセッションを取得するか、何も渡されなかった場合は新しいセッションが作成されます。 PHPは、セッションの開始後に$ _SESSIONスーパーグローバルにセッション情報を入力します。 PHPが終了すると、$ _ SESSIONスーパーグローバルの内容が自動的にシリアル化され、セッションハンドラーを使用して永続性に送信されてセッションが記録されます。

    デフォルトでは、PHPは内部ファイルハンドラーを使用してセッションを保存します。これは、INI変数session.save_handlerで設定されます。 このハンドラーは、サーバー上のsession.save_path構成ディレクティブで指定されたディレクトリーにデータを保存します。

    機能を使用して手動でセッションを開始できます session_start()。 session.auto_startディレクティブが1に設定されている場合、セッションはリクエストの開始時に自動的に開始されます。

    通常、セッションはPHPがスクリプトの実行を終了すると終了しますが、関数を使用して手動で終了することもできます。 session_write_close().

    警告

    注意

    コメント:

    ファイルを使用するセッション(PHPのデフォルト)は、関数によってセッションが開かれるとすぐにセッションファイルをロックします session_start()または、session.auto_startを指定して間接的に。 ロックされると、スクリプトが終了するか関数が呼び出されるときに閉じられるまで、他のスクリプトは同じセッションファイルにアクセスできません。 session_write_close().

    これは、AJAXを多用し、複数の同時リクエストを行うサイトでは問題になる可能性があります。 この問題を解決する最も簡単な方法は、関数を呼び出すことです session_write_close()セッションで必要なすべての変更が行われるとすぐに、できればスクリプトの開始に近づきます。 同時アクセスをサポートする別のセッションメカニズムを使用することもできます。

    当初からPHPは大成功で受け入れられましたが、この言語で十分な規模のプロジェクトが作成されるとすぐに、開発者は新しい問題に直面しました。PHPにはグローバル変数の概念がありませんでした。 つまり、特定のスクリプトが実行され、生成されたページがクライアントに送信され、このスクリプトで使用されていたすべてのリソースが破棄されました。 説明してみましょう。同じサイトにindex.phpとdothings.phpの2つのページがあるとします。 これらのページのソースコードは次のようになります。

    index.php dothings.php

    これらの2つのスクリプトを実行すると、最初のページに「index.phpを要求されました」という碑文が表示され、2番目のページは空になります。

    Webサイトの開発者は、よく考えずに、Cookieを使用してクライアント側にグローバル変数を格納し始めました。 プロセスは次のようになりました。ユーザーがサイトのメインページにアクセスし、いくつかのアクションを実行すると、サイトの他のページで必要になる可能性のあるこのユーザーに関連するすべての情報が、次の形式でブラウザに保存されます。クッキーの。 この方法には非常に深刻な欠点があります。そのため、多くの開発者が一度にPHPに背を向けました。 たとえば、ユーザーがサイトのプライベートセクション(またはユーザーのみが所有するセクション)にアクセスできるようにする必要があります。 ユーザーにCookieを送信する必要があります。これは、サイトでの後続の識別子として機能します。 このアプローチは、サイトがユーザーの行動に関する情報を収集し始めるとすぐに非常に面倒で不便になります。これは、ユーザーに送信されたすべての情報を偽造できないようにエンコードすることが望ましいためです。 最近では、偽のCookieが複数のチャットを「置く」可能性があり、場合によっては他の誰かのメールに侵入することさえあります。 さらに、ブラウザがCookieをサポートしていない奇妙な人々が世界にまだいます。

    セッションメカニズムの技術的な問題については説明しませんが、PHPでセッションを適切に操作する方法についてのみ説明します。

    セッションを操作する方法は?

    いくつかの商用ホスティングで記​​事(またはスクリプト)の例をテストする場合、セッションの操作に問題はないはずです。 サーバーを自分でセットアップした場合(実サーバーであろうとエミュレーターであろうと)、次のようなエラーが表示される場合があります。

    「警告:open(/ var / state / php / sess_6f71d1dbb52fa88481e752af7f384db0、O_RDWR)が失敗しました:そのようなファイルまたはディレクトリはありません(2)」。

    これは、PHPが正しく構成されていないことを意味します。 この問題は、セッションをphp.iniファイルに保存してサーバーを再起動するための正しいパス(既存のディレクトリへの)を設定することで解決できます。

    セッションからの変数(データ)を使用するスクリプトには、次の行が含まれている必要があります。

    session_start();

    このコマンドは、このページにこのユーザー(ブラウザー)に関連付けられているすべての変数が必要であることをサーバーに通知します。 サーバーはこれらの変数をファイルから取得し、使用可能にします。 データがユーザーに送信される前にセッションを開くことが非常に重要です。 実際には、これは、次のように、ページの最初でsession_start()関数を呼び出すことが望ましいことを意味します。

    session_start(); ?> ...セッションファイルを保存するディレクトリを設定するには、session_save_path()関数を使用します。session_save_path($ _ SERVER ["DOCUMENT_ROOT"]。 "/ session"); session_start();

    セッションが開始されると、グローバル変数を設定できます。 $ _SESSION配列の任意のフィールドに値を割り当てると、同じ名前の変数がセッション変数として自動的に登録されます。 この配列は、セッションを使用するすべてのページで使用できます。 例としてプログラムを取り上げましょう。

    index.php 大丈夫。 セッションがロードされました! 行って、そこに何があるか見てみましょう: dothings.php

    これらのファイルを順番に実行すると、最初の「index.php」スクリプトは次の結果を生成します。

    大丈夫。 セッションがロードされました! 行って、そこに何があるか見てみましょう:

    そして2番目の「dothings.php」はこれです:

    index.phpを求められました

    $ a変数は、セッションを開始したこのサイトのすべてのページで使用できるようになりました。

    セッションを操作するためのその他の便利な機能とコツ:

    • unset($ _ SESSION ["a"])-セッションは、指定されたセッション変数の値を「忘れる」。
    • session_destroy()-セッションが破棄されます(たとえば、ユーザーが「ログアウト」ボタンを押してシステムを離れた場合)。
    • session_set_cookie_params(int Lifetime [、string path [、string domain]])-この関数を使用すると、セッションの「終了」時刻を決定するunix_timestampを設定することにより、セッションが「存続」する期間を設定できます。 デフォルトでは、セッションはクライアントがブラウザウィンドウを閉じるまで存続します。
    • session_write_close()-セッション変数を記録して閉じます。 これは、ページの処理に時間がかかり、ブラウザのセッションファイルがブロックされている場合に、新しいウィンドウでサイトを開くために必要です。

    それでは、セッションメカニズムの実際のアプリケーションに移りましょう。 ここでは、かなり単純でありながら有用な例をいくつか見ていきます。

    ユーザー認証

    PHPセッションを使用したユーザー認証に関する質問は、Webプログラミング会議で常に尋ねられます。 セッションを使用してシステム内のユーザーを承認するためのメカニズムは、セキュリティの観点から非常に優れています(セクションを参照)。

    この例は、index.php、authorize.php、secretplace.phpの3つのファイルで構成されます。 index.phpファイルには、ユーザーがユーザー名とパスワードを入力するフォームが含まれています。 このフォームはデータをauthorize.phpファイルに渡します。これにより、承認が成功した場合にユーザーがsecretplace.phpファイルにアクセスできるようになります。そうでない場合は、エラーメッセージが表示されます。

    例: index.php パスワードを入力する

    ログイン:
    パスワード:
    authorize.php ページ... header( "場所:secretplace.php"); 出口; ))//何か問題が発生した場合、ユーザーは//エラーメッセージを受け取ります。 ?> 間違ったパスワードを入力しました! secretplace.php おい、あなたは秘密のページにいます!!! :)

    安全性

    したがって、あるページ(PHPスクリプト)から別のページ(サイトからの次の呼び出しまで)に識別子を渡すことができます。これは、すべてのサイト訪問者を区別できることを意味します。 セッション識別子は非常に大きな数(128ビット)であるため、ブルートフォースでそれを取得できる可能性はほとんどありません。 したがって、攻撃者には次のオプションが残されます。

    • ユーザーのコンピューターには、セッション番号を盗む「トロイの木馬」があります。
    • 攻撃者は、ユーザーのコンピューターとサーバー間のトラフィックをキャプチャします。 もちろん、安全な(暗号化された)SSLプロトコルがありますが、誰もがそれを使用しているわけではありません。
    • 隣人がユーザーのコンピューターに近づき、セッション番号を盗みました。

    誰かが誰かから何かを盗むという事実に基づくそのような状況は、一般に、プログラマーの能力の範囲内ではありません。 管理者とユーザー自身がこれを処理する必要があります。

    ただし、PHPは非常に頻繁に「だまされる」可能性があります。 ユーザー認証プログラムで発生する可能性のあるハッキングを見てみましょう。

    • authorize.phpファイルは、サードパーティのスクリプトを使用してパスワードを推測する試みです。
    • ファイルsecretplace.phpは、次のように、ブラウザのアドレスバーに$ logged_user変数の値を入力してプログラムをだまそうとします。
      「http://www.yoursite.ru/secretplace.php? Logged_user = hacker"

    したがって、私たちのプログラムでは、2つの「穴」がはっきりと見えます。1つは小さくてあまり目立たないものですが、2つ目は巨大で、ほとんどのハッカーは必要のない場所に登ります。

    穴番号1を「パッチ」する方法は?

    IPアドレスなどをブロックするための大量のコードを記述するのではなく、リクエストがどこから来たのか、つまり、リクエストがどのページから来たのかを確認するだけです。サイトのページであれば、すべて問題ありません。しかし、他のすべての場合、私たちは許可しません。 authorize.phpファイルを修正しましょう。

    authorize.php V2 ページ... header( "場所:secretplace.php"); 出口; ))))?> 間違ったパスワードを入力しました!
    「穴」番号2を取り除く方法は?

    すべての定命の者がフォーラムに投稿するために登録できるWebサイトがあるとします。 当然、フォーラムでは、一部のユーザー(管理者、モデレーター)が他のユーザーよりも多くの機会を持っています。たとえば、他のユーザーからのメッセージを削除できます。 ユーザーのアクセスレベルをセッションの$ user_status変数に格納します。ここで、$ user_status = 10は完全なシステムアクセスに対応します。 サイトにアクセスした攻撃者は、通常の方法で登録し、ブラウザのアドレスバーに追加するだけで十分です。 ?user_status = 10。 だからあなたはフォーラムに新しい管理者を迎えました!

    原則として、スクリプトの完全なアドレスの後に疑問符を追加し、変数の名前とその値を追加するだけで、アドレスバーを介して任意のスクリプト変数を設定できます。 これを回避するためにコードを修正しましょう:

    secretplace.php V2 変数unset($ _ SESSION ["logged_user"]); //セッションを開きますsession_start(); / *このページに移動することはできません...ユーザー名が登録されていない場合は、index.phpページにリダイレクトしてログインとパスワードを入力してください...実際にはここで多くのことができます。たとえば、ユーザーのIPを覚えておいて、3回目のファイルへのアクセスを試みた後、それをブロックします。 * / if(!isset($ _ SESSION ["logged_user"]))(header( "Location:index.php"); exit;)?> おい、、あなたは秘密のページにいます! 結果

    セッションメカニズムは、PHP言語の非常に優れた機能です。 セッションはシンプルで、非常に柔軟に使用できます。 ちなみに、PHPセッションには文書化された機能が1つあります(バージョン4.0.3以降で利用可能)-セッションは変数だけでなくオブジェクトも格納できます。

    ?>
    //リンクへのSIDの自動挿入。 ini_set( "session.use_trans_sid"、true); session_start(); ?> ここをクリック!
    ここをクリック!!

    //セッションの操作例。 session_start(); //サイトにアクセスしたばかりの場合は、カウンターをリセットします。 if(!isset($ _ SESSION ["count"]))$ _SESSION ["count"] = 0; //セッションでカウンターをインクリメントします。 $ _SESSION ["count"] = $ _SESSION ["count"] + 1; ?>

    カウンター

    時間。
    ブラウザを閉じて、カウンタをリセットします。
    "target =" _blank ">子ブラウザウィンドウを開きます。
    // Cookieなしでセッションを使用する簡単な例。 session_name( "test"); session_start(); $ _SESSION ["count"] = @ $ _ SESSION ["count"] + 1; ?>

    カウンター

    現在のブラウザセッションで、このページを開いています時間。
    ブラウザを閉じて、このカウンタをリセットします。
    ?">ページを更新するには、ここをクリックしてください。