ソース コードの公開を防ぐことに重点を置くと、セッション データも同様に危険にさらされます。デフォルトでは、SESSION は /tmp ディレクトリに保存されます。これは多くの状況で便利です。その 1 つは、すべてのユーザーが /tmp への書き込み権限を持っているため、Apache にも書き込み権限があることです。他のユーザーはこれらのセッション ファイルをシェル環境から直接読み取ることはできませんが、そのための簡単なスクリプトを作成できます。 このスクリプトは、session.save_path で定義されたセッション ファイル保存ディレクトリ内で、sess_ というプレフィックスが付いたファイルを検索します。ファイルが見つかると、その内容が解析され、print_r() 関数を使用してその内容が表示されます。このようにして、他の開発者はユーザーのセッション データを簡単に取得できます。
この問題を解決する最善の方法は、ユーザー名とパスワードで保護されたデータベースにセッション データを保存することです。データベースへのアクセスが制御されるため、追加の保護層が追加されます。前のセクションで説明したヒントを適用すると、データベースに機密データを安全に保管できる場所が提供されますが、データベースのセキュリティがますます重要になっていることに注意する必要があります。
セッション データをデータベースに保存するには、まずデータ テーブルを作成する必要があります:
<?php header('Content-Type: text/plain'); session_start(); $path = ini_get('session.save_path'); $handle = dir($path); while ($filename = $handle->read()) { if (substr($filename, 0, 5) == 'sess_') { $data = file_get_contents("$path/$filename"); if (!empty($data)) { session_decode($data); $session = $_SESSION; $_SESSION = array(); echo "Session [" . substr($filename, 5) . "]\n"; print_r($session); echo "\n--\n\n"; } } } ?>
MySQL を使用している場合、テーブル構造は次のように記述されます。 :
CREATE TABLE sessions ( id varchar(32) NOT NULL, access int(10) unsigned, data text, PRIMARY KEY (id) );
セッションデータをこのテーブルに保存したい場合は、 session_set_save_handler( ) PHP の組み込みセッション メカニズムを編集する関数:
mysql> DESCRIBE sessions; +--------+------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+------------------+------+-----+---------+-------+ | id | varchar(32) | | PRI | | | | access | int(10) unsigned | YES | | NULL | | | data | text | YES | | NULL | | +--------+------------------+------+-----+---------+-------+
これら 6 つの引数はそれぞれ、 これらの関数は次のタスクを処理します:
上記の 6 つのパラメータはそれぞれ、次のタスクを処理します:
l開くセッション ストレージ
l セッションの破棄データ
l 古いセッションデータを消去します
一目で目的がわかるように、意図的に意味のある名前を使用しています。命名は任意ですが、名前の競合を防ぐために、アンダースコア (ここに示すように) または別の命名規則で始めることをお勧めします。これらの関数の例を次に示します (MySQL を使用):
<?php session_set_save_handler('_open', '_close', '_read', '_write', '_destroy', '_clean'); ?>
session_start() の前に session_set_save_handler() を呼び出す必要があります。 ) 関数ですが、関数自体はどこにでも定義できます。
このプロセスの利点は、コードを編集したり、セッションの使用方法を変更したりする必要がないことです。 $_SESSION はまだ存在し、動作は同じままで、PHP は引き続きセッション ID を生成して配信し、セッションに関連する設定変更も有効になります。この 1 つの関数を呼び出す (そして、その関数で指定されたすべての関数を作成する) だけで、残りは PHP が処理します。
上記は、PHP セキュリティ - セッション データの漏洩 (2) の内容です。さらに関連する内容については、PHP 中国語 Web サイト (www.php.cn) に注目してください。