Cookie と比べて、Session はサーバー側に保存されるセッションであり、比較的安全で、Cookie のような保存長さの制限もありません。本記事では Session の使い方を簡単に紹介します。

Session はサーバー側にテキストファイル形式で保存されるため、クライアントが Session の内容を変更しても問題ありません。実際、サーバー側の Session ファイルでは、PHP が Session ファイルの権限を自動的に変更し、システムの読み書き権限のみを保持し、ftp からも変更できないため、はるかに安全です。

Cookie の場合、ユーザーがログインしているかどうかを検証するには、Cookie にユーザー名とパスワード(md5 暗号化後の文字列かもしれない)を保存し、ページをリクエストするたびに検証する必要があります。ユーザー名とパスワードがデータベースに保存されている場合、毎回データベースクエリを実行する必要があり、データベースに余分な負担をかけます。なぜなら、一度だけ検証するわけにはいかないからです。なぜでしょうか?クライアントの Cookie 内の情報は変更される可能性があるからです。$admin 変数を保存してユーザーがログインしているかどうかを表すとします。$admin が true のときはログイン済み、false のときは未ログインを表します。最初の検証に合格した後、$admin を true に設定して Cookie に保存し、次回からは検証しなくてもよいとします。これは正しいでしょうか?間違いです。もし誰かが値が true の $admin 変数を偽造したら、すぐに管理権限を取得してしまうではないですか?非常に安全ではありません。

一方、Session は異なります。Session はサーバー側に保存されるため、リモートユーザーが Session ファイルの内容を変更することはできません。したがって、単純に $admin 変数を保存してログインしているかどうかを判断できます。最初の検証に合格した後、$admin の値を true に設定し、以後その値が true かどうかを判断します。true でなければログイン画面に移動します。これにより、データベース操作を大幅に減らすことができます。また、毎回 Cookie を検証するためにパスワードを送信することによる不安全さを減らせます(Session の検証は一度だけ送信すればよいからです。SSL セキュリティプロトコルを使用していない場合)。パスワードが md5 暗号化されていても、傍受されやすいです。

もちろん、Session を使用する利点は他にもたくさんあります。例えば、制御が容易で、ユーザーに応じてカスタム保存(データベースへの保存など)が可能です。ここでは詳しく説明しません。

Session は php.ini で設定する必要があるでしょうか?通常は不要です。なぜなら、誰もが php.ini を変更する権限を持っているわけではないからです。デフォルトの Session の保存先はサーバーのシステム一時フォルダーであり、独自のフォルダーにカスタマイズして保存することもできます。これについては後ほど説明します。

Session の作成方法を説明します。とても簡単です。本当に。

Session セッションを開始し、$admin 変数を作成します:

例

<?php
// Session を開始
session_start();
// admin という名前の変数を宣言し、空の値を代入します。
$_SESSION["admin"] = null;
?>

Session を使用する場合、またはその PHP ファイルが Session 変数を呼び出す場合は、Session を呼び出す前に session_start() 関数を使って開始する必要があります。その他の設定は不要で、PHP が自動的に Session ファイルの作成を行います。

このプログラムを実行すると、システムの一時フォルダーにこの Session ファイルがあります。ファイル名は通常、sess_4c83638b3b0dbf65583181c2f89168ec のような形式で、末尾は32桁のエンコードされたランダム文字列です。エディターで開いて、その内容を確認してみましょう。

admin|N;

通常、その内容は次のような構造です:

変数名|型:長さ:値;

また、各変数はセミコロンで区切ります。長さや型など、省略できるものもあります。

検証プログラムを見てみましょう。データベースにはユーザー名と md5 暗号化されたパスワードが保存されていると仮定します。

login.php ファイルコード

<?php
// フォーム送信後...
$posts = $_POST;
// 空白文字をいくつか削除
foreach ($posts as $key => $value) {
    $posts[$key] = trim($value);
}
$password = md5($posts["password"]);
$username = $posts["username"];

$query = "SELECT `username` FROM `user` WHERE `password` = '$password' AND `username` = '$username'";
// クエリ結果を取得
$userInfo = $DB->getRow($query);

if (!empty($userInfo)) {
    // 検証に合格したら、Session を開始
    session_start();
    // ログイン成功の admin 変数を登録し、true を代入
    $_SESSION["admin"] = true;
} else {
    die("ユーザー名またはパスワードが正しくありません");
}
?>

ユーザー検証が必要なページで Session を開始し、ログインしているかどうかを判断します:

例

<?php
// グローバル変数によるセキュリティ上のリスクを防ぐ
$admin = false;
// セッションを開始する。この手順は必須です
session_start();
// ログインしているかどうかを判断
if (isset($_SESSION["admin"]) && $_SESSION["admin"] === true) {
    echo "ログインに成功しました";
} else {
    // 検証に失敗した場合、$_SESSION["admin"] を false に設定
    $_SESSION["admin"] = false;
    die("アクセス権限がありません");
}
?>

とても簡単ですね。$_SESSION をサーバー側に保存される配列と見なせばよいのです。登録する各変数は配列のキーであり、配列の使用と何ら変わりません。

システムからログアウトしたい場合はどうすればよいでしょうか?Session を破棄すればよいです。

例

<?php
session_start();
// この方法は、以前登録した特定の変数を破棄します
unset($_SESSION['admin']);
// この方法は、Session ファイル全体を破棄します
session_destroy();
?>

Session は Cookie のように有効期間を設定できるでしょうか?Session があれば Cookie を完全に捨ててよいのでしょうか?結論として、Cookie と組み合わせて Session を使用するのが最も便利です。

Session はどのようにクライアントユーザーを判断するのでしょうか?それは Session ID によって判断します。Session ID とは何かというと、その Session ファイルのファイル名です。Session ID はランダムに生成されるため、一意性とランダム性が保証され、Session の安全性が確保されます。通常、Session の有効期間を設定していない場合、Session ID はメモリに保存され、ブラウザを閉じるとその ID は自動的に破棄され、再度そのページをリクエストすると、新しい Session ID が登録されます。

クライアントが Cookie を無効にしていない場合、Cookie は Session セッションを開始するときに、Session ID と Session の有効期間を保存する役割を果たします。

Session の有効期間を手動で設定してみましょう:

例

<?php
session_start();
// 1日間保存
$lifeTime = 24 * 3600;
setcookie(session_name(), session_id(), time() + $lifeTime, "/");
?>

実際、Session には session_set_cookie_params(); という Session の有効期間を設定する関数も用意されています。この関数は session_start() 関数を呼び出す前に呼び出す必要があります:

例

<?php
// 1日間保存
$lifeTime = 24 * 3600;
session_set_cookie_params($lifeTime);
session_start();
$_SESSION["admin"] = true;
?>

クライアントが IE 6.0 を使用している場合、session_set_cookie_params(); 関数で Cookie を設定すると問題が発生することがあります。そのため、setcookie 関数を手動で呼び出して cookie を作成するほうがよいでしょう。

クライアントが Cookie を無効にしている場合はどうすればよいでしょうか?仕方ありません。有効期間はすべてブラウザプロセスに依存することになります。ブラウザを閉じると、再度ページをリクエストする際に Session を再登録しなければなりません。では、Session ID をどのように渡すのでしょうか?URL または隠しフォームで渡します。PHP は自動的に Session ID を URL に送信します。URL は http://www.test.cn/index.php?PHPSESSID= bba5b2a240a77e5b44cfa01d49cf9669 のような形式です。URL のパラメータ PHPSESSID が Session ID です。$_GET を使用してこの値を取得し、Session ID をページ間で渡すことができます。

例

<?php
// 1日間保存
$lifeTime = 24 * 3600;
// 現在の Session 名を取得、デフォルトは PHPSESSID
$sessionName = session_name();
// Session ID を取得
$sessionID = $_GET[$sessionName];
// session_id() を使用して取得した Session ID を設定
session_id($sessionID);

session_set_cookie_params($lifeTime);
session_start();
$_SESSION['admin'] = true;
?>

仮想ホストの場合、すべてのユーザーの Session がシステムの一時フォルダーに保存されると、メンテナンスが困難になり、安全性も低下します。Session ファイルの保存パスを手動で設定でき、session_save_path() がそのような機能を提供します。Session の保存ディレクトリを Web 経由でアクセスできないフォルダーに指定できます。もちろん、そのフォルダーには読み書き権限が必要です。

例

<?php
// 保存ディレクトリを設定
$savePath = './session_save_dir/';
// 1日間保存
$lifeTime = 24 * 3600;
session_save_path($savePath);
session_set_cookie_params($lifeTime);
session_start();
$_SESSION['admin'] = true;
?>

session_set_cookie_params(); 関数と同様に、session_save_path() 関数も session_start() 関数を呼び出す前に呼び出す必要があります。

また、配列やオブジェクトを Session に保存することもできます。配列の操作は通常の変数と同じですが、オブジェクトを保存する場合、PHP は自動的にオブジェクトをシリアライズ(直列化とも呼ばれます)してから Session に保存します。次の例はこのことを示しています:

person.php ファイルコード

<?php
class person {
    var $age;
    function output() {
        echo $this->age;
    }
    function setAge($age) {
        $this->age = $age;
    }
}
?>

setage.php ファイルコード

<?php
session_start();
require_once 'person.php';
$person = new person();
$person->setAge(21);
$_SESSION['person'] = $person;
echo '<a href='output.php'>check here to output age</a>';
?>

output.php ファイルコード

<?php
// オブジェクトを再構築するためにコールバック関数を設定します。
ini_set('unserialize_callback_func', 'mycallback');
function mycallback($classname) {
    include_once $classname . '.php';
}
session_start();
$person = $_SESSION['person'];
// 21 を出力
$person->output();
?>

setage.php ファイルを実行すると、setage() メソッドが呼び出され、年齢が 21 に設定され、その状態がシリアライズされて Session に保存されます(この変換は PHP が自動的に行います)。output.php に移動した後、この値を出力するには、先ほど保存したオブジェクトをアンシリアライズ(デシリアライズ)する必要があります。また、アンシリアライズ時には未定義のクラスをインスタンス化する必要があるため、後で呼び出されるコールバック関数を定義して、person.php のクラスファイルを自動的にインクルードします。これによりオブジェクトが再構築され、現在の age の値として 21 を取得し、output() メソッドを呼び出してその値を出力します。

さらに、session_set_save_handler 関数を使用して、Session の呼び出し方法をカスタマイズすることもできます。

原文アドレス:https://www.cnblogs.com/happyforev1/articles/1645916.html