Heim  >  Artikel  >  Backend-Entwicklung  >  PHP-Sicherheit – Permanente Anmeldung

PHP-Sicherheit – Permanente Anmeldung

黄舟
黄舟Original
2017-02-20 09:41:422108Durchsuche



Dauerhafte Anmeldung

Persistente Anmeldung bezieht sich auf einen Mechanismus zur kontinuierlichen Authentifizierung zwischen Browsersitzungen. Mit anderen Worten: Ein Benutzer, der heute angemeldet ist, wird auch morgen noch angemeldet sein, auch wenn Benutzersitzungen zwischen Besuchen ablaufen.

Das Vorhandensein dauerhafter Anmeldungen verringert die Sicherheit Ihres Authentifizierungsmechanismus, erhöht jedoch die Benutzerfreundlichkeit. Bieten Sie Benutzern die Möglichkeit, sich die Anmeldung zu merken, anstatt sich bei jedem Besuch mühsam authentifizieren zu müssen.

Angreifer verschafft sich unbefugten Zugriff, indem er die Cookies des Benutzers abspielt

Nach meinen Beobachtungen besteht das häufigste fehlerhafte dauerhafte Anmeldeschema darin, den Benutzernamen und das Passwort in einem Cookie zu speichern. Die Versuchung dazu ist verständlich – anstatt den Benutzer nach Benutzername und Passwort zu fragen, können Sie diese einfach aus dem Cookie ablesen. Der Rest des Verifizierungsprozesses ist genau der gleiche wie bei einer normalen Anmeldung, daher ist dieses Szenario einfach.

Wenn Sie jedoch Ihren Benutzernamen und Ihr Passwort in Cookies speichern, deaktivieren Sie diese Funktion bitte sofort und lesen Sie den Rest dieses Abschnitts, um einige Ideen für die Implementierung einer sichereren Lösung zu finden. Sie müssen außerdem alle Benutzer, die dieses Cookie verwenden, dazu auffordern, ihre Passwörter in Zukunft zu ändern, da ihre Authentifizierungsinformationen offengelegt wurden.

Für die dauerhafte Anmeldung ist ein dauerhaftes Anmeldecookie erforderlich, das häufig als Authentifizierungscookie bezeichnet wird, da Cookies der einzige Standardmechanismus sind, der zur Bereitstellung stabiler Daten über mehrere Sitzungen hinweg verwendet wird. Wenn das Cookie einen dauerhaften Zugriff ermöglicht, stellt es ein ernstes Risiko für die Sicherheit Ihrer Anwendung dar. Sie müssen daher sicherstellen, dass die von Ihnen im Cookie gespeicherten Daten nur für einen begrenzten Zeitraum zur Authentifizierung verwendet werden können.

Der erste Schritt besteht darin, eine Methode zu entwickeln, um das Risiko zu mindern, das von erfassten dauerhaften Anmeldecookies ausgeht. Während Sie die Erfassung von Cookies vermeiden möchten, ist ein tiefgreifender Verteidigungsprozess am besten, insbesondere da dieser Mechanismus Ihr Validierungsformular weniger sicher machen kann, selbst wenn alles einwandfrei funktioniert. Auf diese Weise kann das Cookie nicht auf der Grundlage von Informationen generiert werden, die eine dauerhafte Anmeldung ermöglichen, wie beispielsweise dem Passwort des Benutzers.

Um die Verwendung des Benutzerpassworts zu vermeiden, können Sie eine Identität erstellen, die nur für eine einmalige Verifizierung gültig ist:

CODE:
 
  <?php
 
  $token = md5(uniqid(rand(), TRUE));
 
  ?>


Sie können es in der Sitzung des Benutzers speichern, um es einem bestimmten Benutzer zuzuordnen. Dies hilft Ihnen jedoch nicht, über mehrere Sitzungen hinweg angemeldet zu bleiben, was eine große Sache ist. Daher müssen Sie eine andere Methode verwenden, um diese Identität einem bestimmten Benutzer zuzuordnen.

Da der Benutzername weniger vertraulich ist als das Passwort, können Sie ihn in einem Cookie speichern, was dem Authentifikator dabei helfen kann, festzustellen, welche Benutzer-ID bereitgestellt wurde. Ein besserer Ansatz besteht jedoch darin, eine sekundäre Identität zu verwenden, die schwer zu erraten und zu entdecken ist. Erwägen Sie das Hinzufügen von drei Feldern zur Datentabelle, in der Benutzernamen und Passwörter gespeichert werden: eine zweite Identität (Identifikator), eine permanente Anmeldeidentifikation (Token) und ein permanentes Anmelde-Timeout (Timeout).

mysql> DESCRIBE users;
 
+------------+------------------+------+-----+---------+-------+
  | Field      | Type             | Null | Key |
Default | Extra |
 
+------------+------------------+------+-----+---------+-------+
  | username   | varchar(25)      |      | PRI |    
    |       |
  | password   | varchar(32)      | YES  |     |
NULL    |       |
  | identifier | varchar(32)      | YES  | MUL |
NULL    |       |
  | token      | varchar(32)      | YES  |     |
NULL    |       |
  | timeout    | int(10) unsigned | YES  |     |
NULL    |       |
 
+------------+------------------+------+-----+---------+-------+


Durch das Generieren und Speichern einer sekundären Identität und einer permanenten Anmelde-ID können Sie ein Cookie erstellen, das keine Benutzerauthentifizierungsinformationen enthält.

CODE:
 
  <?php
 
  $salt = &#39;SHIFLETT&#39;;
 
  $identifier = md5($salt . md5($username .
$salt));
  $token = md5(uniqid(rand(), TRUE));
  $timeout = time() + 60 * 60 * 24 * 7;
 
  setcookie(&#39;auth&#39;, "$identifier:$token",
$timeout);
 
  ?>


Wenn ein Benutzer ein permanentes Login-Cookie verwendet, können Sie feststellen, ob es mehreren zu überprüfenden Kriterien entspricht:

CODE:
 
 <?php
 
  /* mysql_connect() */
  /* mysql_select_db() */
 
  $clean = array();
  $mysql = array();
 
  $now = time();
  $salt = &#39;SHIFLETT&#39;;
 
  list($identifier, $token) = explode(&#39;:&#39;,
$_COOKIE[&#39;auth&#39;]);
 
  if (ctype_alnum($identifier) &&
ctype_alnum($token))
  {
    $clean[&#39;identifier&#39;] = $identifier;
    $clean[&#39;token&#39;] = $token;
  }
  else
  {
    /* ... */
  }
 
  $mysql[&#39;identifier&#39;] =
mysql_real_escape_string($clean[&#39;identifier&#39;]);
 
  $sql = "SELECT username, token, timeout
          FROM   users
          WHERE  identifier =
&#39;{$mysql[&#39;identifier&#39;]}&#39;";
 
  if ($result = mysql_query($sql))
  {
    if (mysql_num_rows($result))
    {
      $record = mysql_fetch_assoc($result);
 
      if ($clean[&#39;token&#39;] != $record[&#39;token&#39;])
      {
        /* Failed Login (wrong token) */
      }
      elseif ($now > $record[&#39;timeout&#39;])
      {
        /* Failed Login (timeout) */
      }
      elseif ($clean[&#39;identifier&#39;] !=
              md5($salt . md5($record[&#39;username&#39;] .
$salt)))
      {
        /* Failed Login (invalid identifier) */
      }
      else
      {
        /* Successful Login */
      }
 
    }
    else
    {
      /* Failed Login (invalid identifier) */
    }
  }
  else
  {
    /* Error */
  }
 
  ?>


Sie sollten sich an drei Aspekte halten, um die Verwendung permanenter Anmeldecookies einzuschränken.

l Cookie muss innerhalb einer Woche (oder weniger) ablaufen

l Cookie Am besten verwenden Sie es nur für eine Überprüfung (Löschen oder Neugenerieren nach erfolgreicher Überprüfung)

l Begrenzen Sie das Cookie so, dass es serverseitig innerhalb einer Woche (oder weniger) abläuft

Wenn Sie möchten, dass der Benutzer auf unbestimmte Zeit gespeichert wird, solange der Benutzer Ihre Anwendung häufiger als die Ablaufzeit besucht, generieren Sie einfach die Kennung nach jeder Überprüfung neu und setzen Sie ein neues Cookie.

  另一个有用的原则是在用户执行敏感操作前需要用户提供密码。你只能让永久登录用户访问你的应用中不是特别敏感的功能。在执行一些敏感操作前让用户手工进行验证是不可替代的步骤。

 

  最后,你需要确认登出系统的用户是确实登出了,这包括删除永久登录cookie:

CODE:
 
  <?php
 
  setcookie(&#39;auth&#39;, &#39;DELETED!&#39;, time());
 
  ?>


上例中,cookie被无用的值填充并设为立即过期。这样,即使是由于一个用户的时钟不准而导致cookie保持有效的话,也能保证他有效地退出。

 以上就是PHP安全-永久登录的内容,更多相关内容请关注PHP中文网(www.php.cn)!


Stellungnahme:
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