Ein WordPress-Sicherheits-Plugin erstellen Die Grundlagen

WordPress ist Open Source, was bedeutet, dass jeder - auch Hacker mit böswilliger Absicht - den Quellcode nach Sicherheitslücken durchsuchen kann. In diesem Tutorial werden wir ein WordPress-Plugin erstellen, um Sicherheitslücken in der WordPress-Installation zu erkennen und zu beheben.


Schritt 1 Setup & Metadaten

Machen Sie einen neuen Ordner in Ihrem Plugins-Verzeichnis sicher, Erstellen Sie dann eine Datei namens safe.php im Inneren. Die ersten Codezeilen für ein Plugin teilen WordPress lediglich mit, dass es sich um ein Plugin handelt, wie es heißt, und andere Informationen dieser Art. Dieser Abschnitt ähnelt den Metadaten eines Designs oder einer Vorlage.

 / * Plugin Name: Sicheres Plugin URI: http://wp.tutsplus.com Beschreibung: Die einfachste und effektivste Möglichkeit, Ihre WordPress-Site vor Angreifern zu schützen. Autor: Fouad Matin Version: 1.0 Urheber-URI: http://wp.tutsplus.com/author/fouad * /

Update: Gemäß dem folgenden Kommentar von Christopher ist keine Definition mehr erforderlich WP_CONTENT_URL, WP_CONTENT_DIR, WP_PLUGIN_URL, und WP_PLUGIN_DIR wie WordPress sie für uns in der Datei definiert Includes / default-constants.php.


Schritt 2 Aktion und Filtersysteme

Als nächstes müssen wir einige Action-Hooks einsetzen, die Funktionen sind, die nach einem bestimmten Ereignis ausgelöst werden, wie z admin_menu Funktion wird aufgerufen. Aktionen werden normalerweise zum Ändern von Datenbankdaten und E-Mail-Nachrichten sowie zum Ändern der auf dem Bildschirm angezeigten Informationen verwendet. Filter dagegen sind Hooks, die vor dem Rendern von Text oder dem Senden von Daten gestartet werden. Sie können auch Aktionen entfernen, wenn Sie möchten, wie z wp_generator Funktion.

 remove_action ('wp_head', 'wp_generator');

Schritt 3 Definieren Sie die tatsächlichen Funktionen

Bevor Sie einen beliebigen Text in das Plugin einfügen, müssen Sie ein Stylesheet im Wesentlichen mit dem wp_enqueue_style Funktion. Diese Funktion ist nur eine sichere Methode, um CSS-Dateien zu einer von WordPress generierten Seite hinzuzufügen. Weitere Informationen zum Enqueuing finden Sie in Japhs Tutorial, einschließlich Javascript und CSS.

 add_action ('admin_enqueue_scripts', 'safe_styles')); function safe_styles () wp_enqueue_style ('safe_style', plugins_url ('/ css / safe.css', __FILE__)); 

Damit der Benutzer die Plugin-Seite öffnen kann, müssen wir eine Menüseite für unser Plugin hinzufügen. Das Sicherheits-Plugin sollte auch nur für Administratoren verfügbar sein (dies können Sie bei Bedarf ändern)..

 add_action ('admin_menu', 'add_menu_bpg'); Funktion add_menu_bpg () if (! current_user_can ('administrator')) return false;  if (function_exists ('add_menu_page')) add_menu_page ('Safe', 'Safe', 'Edit_pages', 'safe-admin-page', 'safe_main', 'WP_PLUGIN_URL' ; 

Schritt 4 Metaboxen

Um Informationen auf der Plugin-Seite anzuzeigen, verwenden wir Metaboxen, damit diese mit dem WordPress-Admin-Design konsistent aussehen. Wir möchten die System- / Server-Informationen anzeigen und einige grundlegende, schnelle Sicherheitsüberprüfungen durchführen.

 Funktion safe_meta_box () ?> 

Lassen Sie uns nun prüfen, ob es ein Konto mit der Standardeinstellung von gibt Administrator Dies ist die erste Vermutung der meisten Hacker und somit ein einfacher Einstieg in Ihr Admin-Panel. Außerdem empfehle ich Ihnen, eine .htaccess-Datei in Ihrem zu konfigurieren wp-admin Verzeichnis, das alle IP-Adressen außer Ihrer blockiert. In unserem nächsten Artikel werden wir eine Möglichkeit zum Konfigurieren von .htaccess auf der Plug-In-Seite einrichten.

 global $ wpdb; Echo '
WP ID META-Tag aus WordPress-Kern entfernt
'; Echo '
'; $ name = $ wpdb-> get_var ("SELECT user_login FROM $ wpdb-> users WHERE user_login =" admin ""); if ($ name == "admin") echo '"admin" Benutzer existiert.'; else echo 'Kein Benutzer "admin".'; Echo '
'; Echo '
'; if (file_exists ('. htaccess')) echo '.htaccess-Datei in WP-Admin / gefunden'; else echo 'Die Datei .htaccess ist im Abschnitt wp-admin nicht vorhanden.'; Echo '
'; ?>

Fügen wir eine weitere Spalte / ein Feld für die rechte Seite des Bildschirms hinzu, in der wir alle Informationen und Einstellungen des Servers anzeigen können.

 Funktion safe_meta_box2 () ?> 

Schritt 5 Hauptfunktionen

Erstellen Sie aus organisatorischen Gründen ein neues Verzeichnis mit dem Namen inc in deinem sicher Verzeichnis, in dem Sie eine Datei mit dem Namen Functions.php um unsere Hauptfunktionen zu übernehmen. Diese Funktionen sind für die Ausführung der Tests, das Überprüfen der Dateiberechtigungen, Datenbankeinstellungen usw. verantwortlich. Es ist besser, diese von der Haupt-Plugin-Datei zu trennen, damit sie einfacher zu navigieren und zu lesen sind.

Beginnen Sie zunächst mit dem Herstellen einer Verbindung zur Datenbank und dem Abrufen der MySQL-Version und des MySQL-Informationsarrays. Lassen Sie uns auch prüfen, ob der abgesicherte PHP-Modus aktiviert ist, da dies bei anderen Plugins und Einstellungen zu Problemen führen kann.

 function safe_get_serverinfo () global $ wpdb; $ sqlversion = $ wpdb-> get_var ("SELECT VERSION () AS-Version"); $ mysqlinfo = $ wpdb-> get_results ("SHOW VARIABLES LIKE 'sql_mode'"); if (is_array ($ mysqlinfo)) $ sql_mode = $ mysqlinfo [0] -> Wert;  if (leer ($ sql_mode)) $ sql_mode = __ ('Nicht festgelegt');  $ sm = ini_get ('safe_mode'); if (strcasecmp ('Ein', $ sm) == 0) $ safe_mode = __ ('Ein');  else $ safe_mode = __ ('Aus'); 

Um eingehende Pingbacks zu akzeptieren, allow_url_fopen muss in Ihrer php.ini auf "on" gesetzt sein. Es macht jedoch auch Ihren Code anfällig für Code-Injection, weil die file_get_contents () kann Daten von entfernten Standorten abrufen, z. B. von einem FTP- oder Webserver.

 if (ini_get ('allow_url_fopen')) $ allow_url_fopen = __ ('Ein');  else $ allow_url_fopen = __ ('Aus'); 

Speicherbeschränkungen und Ausführungszeiten werden im nächsten Teil des Tutorials für das Plugin eine wichtige Rolle spielen, um mögliche Lösungen für Sicherheitslücken unter Berücksichtigung der Systemgrenzen vorzuschlagen.

 if (ini_get ('upload_max_filesize')) $ upload_max = ini_get ('upload_max_filesize');  else $ upload_max = __ ('Nicht zutreffend');  if (ini_get ('post_max_size')) $ post_max = ini_get ('post_max_size');  else $ post_max = __ ('N / A');  if (ini_get ('max_execution_time')) $ max_execute = ini_get ('max_execution_time');  else $ max_execute = __ ('N / A');  if (ini_get ('memory_limit')) $ memory_limit = ini_get ('memory_limit');  else $ memory_limit = __ ('N / A');  if (function_exists ('memory_get_usage')) $ memory_usage = rund (memory_get_usage () / 1024/1024, 2). __ ('MByte');  else $ memory_usage = __ ('N / A');  if (is_callable ('exif_read_data')) $ exif = __ ('Ja'). "(V". Substr (phpversion ('exif'), 0,4). ")";  else $ exif = __ ('Nein');  if (is_callable ('iptcparse')) $ iptc = __ ('Ja');  else $ iptc = __ ('Nein');  if (is_callable ('xml_parser_create')) $ xml = __ ('Ja');  else $ xml = __ ('Nein'); 

Jetzt spucken wir einfach alle Daten aus, die wir gerade über den Server gesammelt haben.

 ?> 
  • :
  • :
  • :
  • :
  • :
  • :
  • :
  • :
  • :
  • :
  • :
  • : s
  • :
  • :
  • :
  • Ein weiterer Hauptfehler bei den meisten generischen WordPress-Installationen ist die Verwendung des Standardtabellenpräfixes: wp_. In unserem nächsten Artikel werden wir eine Möglichkeit zum Sichern und Umbenennen der Tabellen einrichten safe_check_table_prefix und safe_errorsoff Funktionen werden ins Spiel kommen.

     Funktion safe_check_table_prefix () if ($ GLOBALS ['table_prefix'] == 'wp_') echo 'Ihr Tabellenpräfix sollte nicht sein wp_.
    '; else echo 'Ihr Tischpräfix ist nicht wp_.
    '; function safe_errorsoff () echo 'WordPress DB-Fehler deaktiviert.
    ';

    Wenn Sie eine ältere Version von WordPress haben, aktualisieren Sie zuerst. Unabhängig davon, wie gut Sie davon sind, wie Sie Upgrades verfolgen, besteht immer die Möglichkeit, dass Sie zurückfallen. Sobald die Sicherheitslücken einer früheren Version im Änderungsprotokoll für die neue Version aufgeführt sind, ist die Sicherheit Ihrer Installation jetzt gefährdet. Die meisten Designs machen dies standardmäßig, aber um sicherzugehen, haben wir es zuvor mit dem entfernt remove_action filtern und jetzt stellen wir sicher, dass der Endbenutzer dies auch weiß.

     function safe_version_removal () global $ wp_version; Echo 'Ihre WordPress-Version wurde erfolgreich ausgeblendet.
    '; function safe_check_version () $ c = get_site_transient ('update_core'); if (is_object ($ c)) if (leer ($ c-> Updates)) echo ''.__ (' Sie haben die neueste Version von Wordpress. ').''; Rückkehr; if (! empty ($ c-> Updates [0])) $ c = $ c-> Updates [0]; if (! isset ($ c-> Antwort) || 'latest' == $ c-> Antwort) echo ''.__ (' Sie haben die neueste Version von Wordpress. ').''; Rückkehr; if ('upgrade' == $ c-> Antwort) $ lv = $ c-> aktuell; $ m = ''.sprintf (' Wordpress (% s) ist verfügbar. Sie sollten auf die neueste Version aktualisieren. ', $ Lv).''; Echo __ ($ m); Rückkehr; Echo ''.__ (' Beim Abrufen des Status Ihrer Wordpress-Version ist ein Fehler aufgetreten. ').'';

    Mit den neueren Versionen von WordPress wird die Sicherheit der wp-config.php sollte kein Problem sein, aber es ist besser sicher zu sein als leid. Wenn jemand mit böswilliger Absicht in die Hände bekommen würde wp-config.php, Sie könnten auf Ihre Datenbankzugriffsberechtigungen, Berechtigungsschlüssel und Datenbanksalze zugreifen. Wir werden nur prüfen, ob wir die Datei erhalten, in die Datei schreiben können oder ob sie überhaupt in diesem Verzeichnis vorhanden ist. In diesem Fall zeigen wir eine dringende Benachrichtigung und in unserem nächsten Artikel eine Methode zur einfachen Behebung des Problems.

     Funktion safe_wpConfigCheckPermissions ($ wpConfigFilePath) if (! is_writable ($ wpConfigFilePath)) echo ''.__ (' Ihre WP-Konfigurationsdatei ist keine Bedrohung. ').''; falsch zurückgeben;  if (! function_exists ('file') ||! function_exists ('file_get_contents') ||! function_exists ('file_put_contents')) echo ''.__ (' Ihre WP-Konfigurationsdatei ist keine Bedrohung. ').''; falsch zurückgeben;  else echo ''.__ (' Ihre WP-Konfigurationsdatei kann von Hackern kompromittiert werden, die Berechtigungen festlegen. ').''; wahr zurückgeben; 

    Nun müssen wir zurück zum safe.php Datei und fügen Sie unsere neue hinzu Functions.php, über den Aktions- und Filterhaken.

     required_once (WP_PLUGIN_DIR. "/safe/inc/functions.php");

    Schritt 6 Rendern

    Zurück zum safe.php, Die letzte Ergänzung ist die safe_main () Funktion, die beim Laden der Seite aufgerufen wird. Hier müssen wir die zuvor definierten Metaboxen hinzufügen und ein wenig Stil hinzufügen.

     Funktion safe_main () add_meta_box ("safe_box_1", 'Basisprüfungen', "safe_meta_box", "box1"); add_meta_box ("safe_box_2", 'Systeminformationen', "safe_meta_box2", "box2"); Echo ' 
    '; do_meta_boxes ('box1', 'advanced', "); echo '
    '; do_meta_boxes ('box2', 'advanced', "); echo '
    ';

    Zuletzt erstellen Sie eine CSS-Datei mit dem Namen safe.css in einem Verzeichnis namens css unter unserem sicher Verzeichnis. Sie können die Felder beliebig gestalten oder den folgenden CSS-Code für den Fehler- und Erfolgstext verwenden:

     div.pass, span.pass color: # 7AB317;  div.fail, span.fail color: # ff3333;  div.fail, span.fail a color: # ff3333; 

    Fazit

    Inzwischen sollten Sie wissen, wie Sie eine Menüseite für Ihr Plugin hinzufügen, Aktions- und Filter-Hooks anwenden und programmgesteuert nach Sicherheitslücken in WordPress suchen.

    Wenn Sie weitere Vorschläge oder Fragen zu Sicherheits-Plugins haben, können Sie uns gerne einen Kommentar hinterlassen! Dieses Plugin befindet sich auch auf GitHub. Machen Sie also weiter, legen Sie das Repository fest und passen Sie es an, wie Sie möchten.

    Update: Dieser Artikel wurde gemäß den folgenden Vorschlägen von Christopher aktualisiert.