Ist WordPress ‘is_user_logged_in () sicher?

Ich habe mich schon eine Weile darüber gewundert. Ist die folgende if statement sicher genug? Ist es einfach, den Code zu durchbrechen und Zugriff auf den Inhalt zu erhalten, wenn er nicht angemeldet ist?

  

Solutions Collecting From Web of "Ist WordPress ‘is_user_logged_in () sicher?"

Nun, du musst dich fragen “Sicher genug für was?” Ich bezweifle, dass Sie eine Bank oder eine andere Institution sind, die außergewöhnlich hohe Sicherheit braucht. Wenn Sie ein Team von $ 100.000 + pro Jahr Experten wären, um diese Frage für Sie zu beantworten.

In diesem Sinne …

Sie müssten das WordPress-Login-System untergraben, um diesen Code zu umgehen. Ich bin sicher, dass das möglich ist, aber wenn Ihre Passwörter solide sind, sollte es ziemlich schwierig sein. Es wird nicht ein “Hack ein Null-Byte in der Abfragezeichenfolge” Art eines Hacks sein. Es sollte für die meisten Zwecke sicher genug sein.

Auf etwas zu sorgen ist, dass sowohl is_user_logged_in , als auch wp_get_current_user von dem es abhängt, beide Pluggable sind (sinnlos so für meinen Verstand), was bedeutet, dass ein bösartiges Plugin, oder nur ein schlecht geschriebenes, Ihre Sicherheit vollständig zerstören könnte.

Kurz gesagt – und für den allgemeinen Gebrauch – ja. Wie @s_ha_dum jedoch darauf hingewiesen hat, hängt es wirklich davon ab, wofür du es benutzt hast.

Ist die function sicher?

Wie @kaiser und @s_ha_dum erwähnt haben, ist die function steckbar – was bedeutet, dass jedes Plug-in (obwohl nicht Themen) es neu definieren kann, um irgendetwas zu tun. Das ist aber kein Problem, da diese Plug-Ins fast alles können – sie führen Code auf Ihrem Server aus.

Die Tatsache, dass es “Pluggable” ist, ist nicht wirklich das Problem hier. Sie sollten sicherstellen, dass alle von Ihnen verwendeten Plug-ins und Designs vernünftig vertrauenswürdig sind. Wo Sicherheit wichtig ist, werden Unternehmen dazu neigen, ihre eigenen Plugins zu erstellen und diese nur zu verwenden.

(Die Tatsache, dass seine Pluggable ist, so dass Unternehmen ein sichereres Authentifizierungssystem implementieren können, wenn die Notwendigkeit besteht).

Ist die Authentifizierungsmethode sicher?

Nehmen wir an, dass die function wie in WordPress Core definiert ist. Ist es sicher? (Ja).

Die function is_user_logged_in() überprüft den Browser des Benutzers auf ein gültiges Cookie. Wenn sie nicht da ist, ungültig ist oder abgelaufen ist, müssen sie sich erneut anmelden.

Der Cookie wird aus folgendem generiert:

  • Benutzername des Benutzers
  • 8 Zeichen aus ihrem Passwort-Hash
  • Zeitstempel für den Ablauf des Cookies

Der Cookee selbst enthält den Benutzernamen und den Zeitstempel im Klartext. Es enthält auch einen HMAC ( Hash Message Authentication Code ) – dieser Teil ist schwer zu erraten und hängt vom Benutzernamen und dem Zeitstempel ab. Wenn also ein Angreifer einen abgelaufenen Cookie oder einen Cookie für sein eigenes Konto ergattern konnte, konnte kein gültiger Cookie erstellt werden, der sie in ein Admin-Konto einloggte, ohne einen gültigen HMAC zu erstellen.

Der HMAC wird aus einem Hash der obigen 3 Elemente erzeugt. Jetzt scheinen 8 Zeichen nicht viel – das könnte innerhalb einer Woche brutal erzwungen werden. Aber in Wirklichkeit ist der Hash ein gesalzener Hash – unter Verwendung der SALTs Ihrer Site. Damit und so lange sie sicher sind, werden alle Versuche des Brute Forcing verhindert.

… wirklich die Sicherheit dieser function liegt in der Sicherheit der SALT Ihrer Website. Diese werden zusammen mit Ihren database-Anmeldeinformationen in Ihrer wp-config.php gespeichert. Du solltest das niemals öffentlich machen.

Kann ich erkennen, ob eine function die Definition einer Pluggable-function geändert hat?

Die obige function von Kaiser funktioniert nur, wenn ein MU-Plugin eine function überschrieben hat. Hier ist eine allgemeinere Lösung, wobei der Haftungsausschluss, dass ein Plug-in keine Pluggable-function überschreibt, kein Hinweis darauf ist, dass Ihre Plug-Ins sicher sind.

 /** * Do not use in production. * * Checks if any plug-ins have overwritten a pluggable function in * `wp-includes/pluggable.php` with a custom function. * * Prints list and kills processing if a function has been overwritten. * * Based on Kaiser's answer (link below). * @link http://wordpress.stackexchange.com/questions/105637/is-wordpress-is-user-logged-in-secure/105667#105667 */ function wpse105637_was_pluggable_defined_by_plugin(){ $arr = token_get_all( file_get_contents( ABSPATH.WPINC.'/pluggable.php' ) ); $functions = array(); foreach ( $arr as $curr_key => $part ){ if ( ! is_array( $part ) ) continue; if ( token_name( $part[0] ) === 'T_FUNCTION' ){ while ( is_array( $arr[ $curr_key ] ) AND 'T_FUNCTION' !== $arr[ $curr_key ][0] ) ++$curr_key; $functions[] = $arr[ --$curr_key ][1]; } } $overwritten = 0; foreach ( $functions as $f ){ $reflFunc = new ReflectionFunction( $f ); if( ABSPATH.WPINC.'/pluggable.php' !== $reflFunc->getFileName() ){ $overwritten++; printf( '

Functions Overwritten

' ); print '
'.$f .' ' . $reflFunc->getFileName() . ':' . $reflFunc->getStartLine() . '
'; } } if( $overwritten ) wp_die( sprintf( '%d pluggable functions overwritten', $overwritten ) ); } add_action( 'plugins_loaded', 'wpse105637_was_pluggable_defined_by_plugin' );

Steckbare functionen

Zunächst einmal werden Pluggables aus der Datei ~/wp-settings.php geladen. Sie sind enthalten, nachdem alle Plug-in-Dateien enthalten sind (aber vor plugins_loaded ), so dass jedes Plugin sie ersetzen kann. (mu-plugins sind noch früher enthalten, haben also Vorrang).

Hindernisse für einen Hack

Der Standardbenutzer wird sich darüber nie Gedanken machen, da er / sie möglicherweise nicht einmal einen muplugins-Ordner besitzt, da er standardmäßig nicht vom core hinzugefügt wird. Also muss der “Hacker” zuerst den Ordner hinzufügen. Dies bedeutet, dass er bereits Zugriff auf Ihr Dateisystem hat und Sie völlig andere Probleme haben als ein Hack auf Ihrem installierten System. Kein ernsthafter Hacker würde sich jetzt mit WordPress beschäftigen, wenn jede andere, leichter zugängliche Tür weit offen steht. Überprüfen Sie also, ob WPMU_PLUGIN_DIR und WPMU_PLUGIN_URL definiert sind. Wenn nicht, müssen Sie sich keine Sorgen machen.

Die nächste Sache – falls du einen muplugins-Ordner hast – solltest du diese Dateien überprüfen. Das ist ziemlich einfach: MU-Plugins funktionieren nur als Single-File-Plugins. Wenn Sie also mehr Plugins als Dateien haben, lädt bereits eine Ihrer Dateien externe Dateien. Sie können dies einfach überwachen, indem Sie die Gesamtzahl der Dateien mit get_included_files() auf dem muplugins_loaded Hook mit der Priorität 0 und dann die Anzahl gegen die enthaltenen Dateien erneut auf dem plugins_loaded -hook auf Priorität 0 verteilen. Der Unterschied muss dem entsprechen, von dem Sie zurückkommen

 count( glob( WPMU_PLUGIN_DIR.'/*.php' ) ); 

Das letzte, worüber man sich Sorgen machen muss.

Nehmen wir an, jemand hat es wirklich geschafft, Ihnen ein MU-Plugin zu übergeben (das Sie selbst installieren mussten, nachdem Sie den Ordner selbst hinzugefügt hatten), dann ist es an der Zeit zu überwachen, ob eine der Pluggable-functionen ersetzt wurde. Sie können dazu das unten stehende Plugin verwenden. Es wird einfach die() in jedem Fall, wo eine Ihrer functionen ersetzt wurde – “Schutz” Sie und Ihre Besucher. Es schaltet sich so spät wie möglich ein (es gibt keine echte “neueste” Hook-Priorität), liest alle functionen aus der Pluggable-Datei und prüft dann deren Existenz. Da es nur den Inhalt der Datei erfasst, wird es nicht einbezogen und daher werden diese functionen nicht definiert. Auf diese Weise können Sie sicherstellen, dass das MU-Plugin immer auf dem neuesten Stand ist, da sich die Anzahl der functionen ändern kann, aber das Plugin wird es trotzdem wissen.

Beachten Sie, dass die Plugins mindestens PHP Version 5.3 benötigen.

 < ?php defined( 'ABSPATH' ) OR exit; /** * Plugin Name: (#105637) Check pluggable changes */ add_action( 'muplugins_loaded', 'wpse_pluggable_check', pow( 99, 99 ) ); function wpse_pluggable_check() { $arr = token_get_all( file_get_contents( ABSPATH.WPINC.'/pluggable.php' ) ); $functions = array(); foreach ( $arr as $curr_key => $part ) { if ( ! is_array( $part ) ) continue; $token = token_name( array_shift( $part ) ); $token === 'T_FUNCTION' AND $functions[] = $arr[ $curr_key + 2 ][1]; } foreach ( $functions as $f ) function_exists( $f ) AND wp_die( 'pluggable overwritten!' ); } 

Das function fn_name() { Plugin geht davon aus, dass das functionsschema immer die function fn_name() { . Hier ist eine leicht verbesserte Version, die die folgenden Arrays durchsucht.

 $arr = token_get_all( file_get_contents( ABSPATH.WPINC.'/pluggable.php' ) ); $functions = array(); foreach ( $arr as $curr_key => $part ) { if ( ! is_array( $part ) ) continue; if ( token_name( $part[0] ) === 'T_FUNCTION' ) { while ( is_array( $arr[ $curr_key ] ) AND 'T_FUNCTION' !== $arr[ $curr_key ][0] ) ++$curr_key; $functions[] = $arr[ --$curr_key ][1]; } } foreach ( $functions as $f ) function_exists( $f ) AND wp_die( 'pluggable overwritten!' );