PHP セキュリティセッションのデータ漏洩 (2)

黄舟
リリース: 2023-03-05 20:48:02
オリジナル
1335 人が閲覧しました



セッションデータが公開されました

ソース コードの公開を防ぐことに重点を置くと、セッション データも同様に危険にさらされます。デフォルトでは、SESSION は /tmp ディレクトリに保存されます。これは多くの状況で便利です。その 1 つは、すべてのユーザーが /tmp への書き込み権限を持っているため、Apache にも書き込み権限があることです。他のユーザーはこれらのセッション ファイルをシェル環境から直接読み取ることはできませんが、そのための簡単なスクリプトを作成できます。 このスクリプトは、session.save_path で定義されたセッション ファイル保存ディレクトリ内で、sess_ というプレフィックスが付いたファイルを検索します。ファイルが見つかると、その内容が解析され、print_r() 関数を使用してその内容が表示されます。このようにして、他の開発者はユーザーのセッション データを簡単に取得できます。

この問題を解決する最善の方法は、ユーザー名とパスワードで保護されたデータベースにセッション データを保存することです。データベースへのアクセスが制御されるため、追加の保護層が追加されます。前のセクションで説明したヒントを適用すると、データベースに機密データを安全に保管できる場所が提供されますが、データベースのセキュリティがますます重要になっていることに注意する必要があります。

セッション データをデータベースに保存するには、まずデータ テーブルを作成する必要があります:

 <?php
 
  header(&#39;Content-Type: text/plain&#39;);
  session_start();
 
  $path = ini_get(&#39;session.save_path&#39;);
  $handle = dir($path);
 
  while ($filename = $handle->read())
  {
    if (substr($filename, 0, 5) == &#39;sess_&#39;)
    {
      $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(&#39;_open&#39;,
                           &#39;_close&#39;,
                           &#39;_read&#39;,
                           &#39;_write&#39;,
                           &#39;_destroy&#39;,
                           &#39;_clean&#39;);
 
  ?>
ログイン後にコピー

session_start() の前に session_set_save_handler() を呼び出す必要があります。 ) 関数ですが、関数自体はどこにでも定義できます。

このプロセスの利点は、コードを編集したり、セッションの使用方法を変更したりする必要がないことです。 $_SESSION はまだ存在し、動作は同じままで、PHP は引き続きセッション ID を生成して配信し、セッションに関連する設定変更も有効になります。この 1 つの関数を呼び出す (そして、その関数で指定されたすべての関数を作成する) だけで、残りは PHP が処理します。

上記は、PHP セキュリティ - セッション データの漏洩 (2) の内容です。さらに関連する内容については、PHP 中国語 Web サイト (www.php.cn) に注目してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート