Heim > Backend-Entwicklung > PHP-Tutorial > Offenlegung von PHP-Sicherheitssitzungsdaten (2)

Offenlegung von PHP-Sicherheitssitzungsdaten (2)

黄舟
Freigeben: 2023-03-05 20:48:02
Original
1349 Leute haben es durchsucht



Sitzungsdaten offengelegt

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(&#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";
      }
    }
  }
 
  ?>
Nach dem Login kopieren


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)
  );
Nach dem Login kopieren


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  
 |       |
 
+--------+------------------+------+-----+---------+-------+
Nach dem Login kopieren


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(&#39;_open&#39;,
                           &#39;_close&#39;,
                           &#39;_read&#39;,
                           &#39;_write&#39;,
                           &#39;_destroy&#39;,
                           &#39;_clean&#39;);
 
  ?>
Nach dem Login kopieren


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[&#39;DB_USER&#39;];
    $db_pass = $_SERVER[&#39;DB_PASS&#39;];
    $db_host = &#39;localhost&#39;;
 
    if ($_sess_db = mysql_connect($db_host,
$db_user, $db_pass))
    {
      return mysql_select_db(&#39;sessions&#39;,
$_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 = &#39;$id&#39;";
 
    if ($result = mysql_query($sql, $_sess_db))
    {
      if (mysql_num_rows($result))
      {
        $record = mysql_fetch_assoc($result);
 
        return $record[&#39;data&#39;];
      }
    }
 
    return &#39;&#39;;
  }
 
  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  (&#39;$id&#39;, &#39;$access&#39;,
&#39;$data&#39;)";
 
    return mysql_query($sql, $_sess_db);
  }
 
  function _destroy($id)
  {
    global $_sess_db;
 
    $id = mysql_real_escape_string($id);
 
    $sql = "DELETE
            FROM   sessions
            WHERE id = &#39;$id&#39;";
 
    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 < &#39;$old&#39;";
 
    return mysql_query($sql, $_sess_db);
  }
 
  ?>
Nach dem Login kopieren


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)!


Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage