一個與會話暴露類似的問題是會話注入。這類攻擊是基於你的WEB伺服器除了對會話儲存目錄有讀取權限外,還有寫入權限。因此,存在著編寫一段允許其他使用者添加,編輯或刪除會話的腳本的可能。下例顯示了一個允許使用者方便編輯已存在的會話資料的HTML表單:
<?php session_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>
腳本表 腳本表
<?php session_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(); ?>
此類攻擊非常危險。攻擊者不僅可以編輯你的使用者的數據,還可以編輯他自己的會話數據。它比會話劫持更為強大,因為攻擊者能選擇所有的會話資料進行修改,從而使繞過存取限制和其他安全手段成為可能。
針對這個問題的最佳解決方案是將會話資料保存在資料庫中。參見前節所示。
以上就是PHP安全-會話注入的內容,更多相關內容請關注PHP中文網(www.php.cn)!