Wenn Sie sich darauf konzentrieren, die Offenlegung von Quellcode zu verhindern, sind Ihre Sitzungsdaten nur gleichermaßen gefährdet. Standardmäßig wird SESSION im Verzeichnis /tmp gespeichert. Dies ist in vielen Situationen praktisch. Eine davon ist, dass alle Benutzer Schreibberechtigungen für /tmp haben, sodass Apache auch Schreibberechtigungen hat. Während andere Benutzer diese Sitzungsdateien nicht direkt aus der Shell-Umgebung lesen können, können sie dazu ein einfaches Skript schreiben:
<?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"; } } } ?>
Dieses Skript sucht nach Dateien mit dem Präfix sess_ im Speicherverzeichnis der Sitzungsdatei, das durch session.save_path definiert ist. Sobald die Datei gefunden wurde, wird ihr Inhalt analysiert und mit der Funktion print_r() angezeigt. Auf diese Weise können andere Entwickler problemlos an die Sitzungsdaten Ihres Benutzers gelangen.
Der beste Weg, dieses Problem zu lösen, besteht darin, Ihre Sitzungsdaten in einer Datenbank zu speichern, die durch einen Benutzernamen und ein Passwort geschützt ist. Da der Zugriff auf die Datenbank kontrolliert wird, gibt es eine zusätzliche Schutzebene. Durch die Anwendung der im vorherigen Abschnitt erwähnten Techniken kann Ihre Datenbank einen sicheren Ort für Ihre sensiblen Daten bieten. Sie sollten jedoch wachsam bleiben, dass die Sicherheit Ihrer Datenbank immer wichtiger wird.
Um Sitzungsdaten in der Datenbank zu speichern, müssen Sie zunächst eine Datentabelle erstellen:
CREATE TABLE sessions ( id varchar(32) NOT NULL, access int(10) unsigned, data text, PRIMARY KEY (id) );
Wenn Sie MySQL verwenden, wird die Tabellenstruktur wie folgt beschrieben:
mysql> DESCRIBE sessions; +--------+------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+------------------+------+-----+---------+-------+ | id | varchar(32) | | PRI | | | | access | int(10) unsigned | YES | | NULL | | | data | text | YES | | NULL | | +--------+------------------+------+-----+---------+-------+
Wenn Sie möchten, dass Sitzungsdaten in dieser Tabelle gespeichert werden, müssen Sie session_set_save_handler( )-Funktion zum Bearbeiten des in PHP integrierten Sitzungsmechanismus:
<?php session_set_save_handler('_open', '_close', '_read', '_write', '_destroy', '_clean'); ?>
Jedes dieser sechs Argumente ist der Name eines Funktion, die Sie schreiben müssen. Diese Funktionen erledigen die folgenden Aufgaben:
Jeder der oben genannten sechs Parameter stellt den Namen der Funktion dar, die Sie schreiben müssen:
l Sitzungsspeicher einschalten
l Sitzungsspeicher ausschalten
l Sitzungsdaten lesen
l Sitzungsdaten schreiben
l Sitzungsdaten zerstören
l Alte Sitzungsdaten löschen
Ich verwende bewusst aussagekräftige Namen, damit Sie deren Zweck auf einen Blick erkennen können. Die Benennung ist willkürlich, Sie können jedoch mit einem Unterstrich (wie hier gezeigt) oder einer anderen Namenskonvention beginnen, um Namenskonflikte zu vermeiden. Hier sind Beispiele für diese Funktionen (unter Verwendung von MySQL):
<?php function _open() { global $_sess_db; $db_user = $_SERVER['DB_USER']; $db_pass = $_SERVER['DB_PASS']; $db_host = 'localhost'; if ($_sess_db = mysql_connect($db_host, $db_user, $db_pass)) { return mysql_select_db('sessions', $_sess_db); } return FALSE; } function _close() { global $_sess_db; return mysql_close($_sess_db); } function _read($id) { global $_sess_db; $id = mysql_real_escape_string($id); $sql = "SELECT data FROM sessions WHERE id = '$id'"; if ($result = mysql_query($sql, $_sess_db)) { if (mysql_num_rows($result)) { $record = mysql_fetch_assoc($result); return $record['data']; } } return ''; } function _write($id, $data) { global $_sess_db; $access = time(); $id = mysql_real_escape_string($id); $access = mysql_real_escape_string($access); $data = mysql_real_escape_string($data); $sql = "REPLACE INTO sessions VALUES ('$id', '$access', '$data')"; return mysql_query($sql, $_sess_db); } function _destroy($id) { global $_sess_db; $id = mysql_real_escape_string($id); $sql = "DELETE FROM sessions WHERE id = '$id'"; return mysql_query($sql, $_sess_db); } function _clean($max) { global $_sess_db; $old = time() - $max; $old = mysql_real_escape_string($old); $sql = "DELETE FROM sessions WHERE access < '$old'"; return mysql_query($sql, $_sess_db); } ?>
Sie müssen session_set_save_handler() vor session_start() aufrufen ) Funktionen, aber Sie können die Funktionen selbst überall definieren.
Das Schöne an diesem Prozess ist, dass Sie den Code nicht bearbeiten oder die Art und Weise ändern müssen, wie Sie Sitzungen verwenden. $_SESSION existiert immer noch, das Verhalten bleibt gleich, PHP generiert und liefert weiterhin Sitzungskennungen und Konfigurationsänderungen im Zusammenhang mit der Sitzung werden ebenfalls wirksam. Alles, was Sie tun müssen, ist, diese eine Funktion aufzurufen (und alle darin angegebenen Funktionen zu erstellen), und PHP kümmert sich um den Rest.
Das Obige ist der Inhalt von PHP Security - Session Data Exposure (2). Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!