In diesem Beitrag erstellen wir ein WordPress-Musterplugin und schützen dieses mit den wichtigsten Anti-Hacking Funktionen.
Muster-Plugin Beschreibung / Funktionen:
Beachten Sie, es handelt sich hierbei nur im Testplugin, keine tatsächliches Plugin mit einer Funktion. Das Test-Plugin lässt sich aber als Grundlage für ein richtiges Plugin nutzen.
Funktionen:
– Erzeugt unter “Einstellungen” den Menu-Punkt “Mein Plugin – HNP”
– Erzeugt durch Klick auf den neuen Menu-Punkt Zugang zu einer Optionen-Seite
– Erzeugt ein Text-Eingabe-Feld auf der Optionenfeld, zudem einen Speichern-Button
– Die eingetragenen Text-Eingabe-Daten können via Shortcode im Frontend angezeigt werden
– Das Shortcode ist [hnp_mein_plugin]
<?php /* Plugin Name: Mein Plugin - HNP Edition Description: Ein WordPress Plugin mit Option-Seite und Shortcode - HNP Edition. Ohne Sicherheit. Author: Homepage-nach-Preis Version: 1.0 Author URI: https://homepage-nach-preis.de/ License: GPLv3 */ // Fügt die Option-Seite im Backend hinzu function hnp_mein_plugin_option_page() { add_options_page('Mein Plugin Optionen - HNP', 'Mein Plugin - HNP', 'manage_options', 'hnp-mein-plugin', 'hnp_mein_plugin_option_page_content'); } add_action('admin_menu', 'hnp_mein_plugin_option_page'); // Funktion für den Inhalt der Option-Seite function hnp_mein_plugin_option_page_content() { ?> <div class="wrap"> <h1>Mein Plugin Einstellungen - HNP</h1> <form method="post" action="options.php"> <?php // Fügt die WordPress Einstellungsfelder hinzu settings_fields('hnp_mein_plugin_settings'); do_settings_sections('hnp-mein-plugin'); submit_button('Speichern'); ?> </form> </div> <?php } // Funktion für die Erstellung der Einstellungsfelder function hnp_mein_plugin_settings_init() { add_settings_section('hnp_mein_plugin_section', 'Allgemeine Einstellungen - HNP', 'hnp_mein_plugin_section_callback', 'hnp-mein-plugin'); add_settings_field('hnp_mein_plugin_text_input', 'Text Input - HNP', 'hnp_mein_plugin_text_input_callback', 'hnp-mein-plugin', 'hnp_mein_plugin_section'); register_setting('hnp_mein_plugin_settings', 'hnp_mein_plugin_text_input'); } add_action('admin_init', 'hnp_mein_plugin_settings_init'); // Callback-Funktion für die Sektionsüberschrift function hnp_mein_plugin_section_callback() { echo 'Hier können Sie Ihre Einstellungen vornehmen - HNP.'; } // Callback-Funktion für das Text-Input Feld function hnp_mein_plugin_text_input_callback() { $text_input = get_option('hnp_mein_plugin_text_input'); echo '<input type="text" name="hnp_mein_plugin_text_input" value="' . esc_attr($text_input) . '" />'; } // Shortcode-Funktion zum Anzeigen der gespeicherten Daten im Frontend function hnp_mein_plugin_shortcode() { $text_input = get_option('hnp_mein_plugin_text_input'); return '<p>' . esc_html($text_input) . '</p>'; } add_shortcode('hnp_mein_plugin', 'hnp_mein_plugin_shortcode'); ?>
Der Code bietet die oben genannten Funktionen, aber keine Sicherheit. Deswegen sollte der Code / das Plugin geschützt werden – und zwar folgend:
Schützen des Plugins vor Hacking / XSS Attacken:
<?php /* Plugin Name: Mein Plugin - HNP Edition Description: Ein WordPress Plugin mit Option-Seite und Shortcode - HNP Edition. Mit Sicherheit. Author: Homepage-nach-Preis Version: 1.0 Author URI: https://homepage-nach-preis.de/ License: GPLv3 */ // ABSPATH -- Schützt vor direkte Zugriffe auf die Plugin-Datei defined('ABSPATH') or die('Huh, are you trying to cheat?'); // Fügt die Option-Seite im Backend hinzu -- current_user_can gewährleistet, dass nur User mit ausreichenden Rechten auf die Options-Seite zugreifen können // esc_html() gewährleistet, dass die Ausgabe nicht als ausführbarer Code interpretiert wird function hnp_mein_plugin_option_page() { if (!current_user_can('manage_options')) { wp_die('You do not have enough permission to view this page'); } add_options_page('Mein Plugin Optionen - HNP', 'Mein Plugin - HNP', 'manage_options', 'hnp-mein-plugin', 'hnp_mein_plugin_option_page_content'); } add_action('admin_menu', 'hnp_mein_plugin_option_page'); // Funktion für den Inhalt der Option-Seite function hnp_mein_plugin_option_page_content() { ?> <div class="wrap"> <h1><?php echo esc_html__('Mein Plugin Einstellungen - HNP', 'hnp'); ?></h1> <form method="post" action="options.php"> <?php // Fügt die WordPress Einstellungsfelder hinzu settings_fields('hnp_mein_plugin_settings'); do_settings_sections('hnp-mein-plugin'); submit_button(esc_html__('Speichern', 'hnp')); ?> </form> </div> <?php } // Funktion für die Erstellung der Einstellungsfelder -- sanitize_text_field unerwünschte HTML- oder JavaScript-Tags entfernen function hnp_mein_plugin_settings_init() { add_settings_section('hnp_mein_plugin_section', esc_html__('Allgemeine Einstellungen - HNP', 'hnp'), 'hnp_mein_plugin_section_callback', 'hnp-mein-plugin'); add_settings_field('hnp_mein_plugin_text_input', esc_html__('Text Input - HNP', 'hnp'), 'hnp_mein_plugin_text_input_callback', 'hnp-mein-plugin', 'hnp_mein_plugin_section'); register_setting('hnp_mein_plugin_settings', 'hnp_mein_plugin_text_input', 'sanitize_text_field'); } add_action('admin_init', 'hnp_mein_plugin_settings_init'); // Callback-Funktion für die Sektionsüberschrift function hnp_mein_plugin_section_callback() { echo esc_html__('Hier können Sie Ihre Einstellungen vornehmen - HNP.', 'hnp'); } // Callback-Funktion für das Text-Input Feld function hnp_mein_plugin_text_input_callback() { $text_input = get_option('hnp_mein_plugin_text_input'); echo '<input type="text" name="hnp_mein_plugin_text_input" value="' . esc_attr($text_input) . '" />'; } // Shortcode-Funktion zum Anzeigen der gespeicherten Daten im Frontend function hnp_mein_plugin_shortcode() { $text_input = get_option('hnp_mein_plugin_text_input'); return '<p>' . esc_html($text_input) . '</p>'; } add_shortcode('hnp_mein_plugin', 'hnp_mein_plugin_shortcode'); // Prüfe auf Leerzeichen / Enter nach dem Abschluss-Tag ?>
current_user_can
Die Funktion ‘current_user_can(‘manage_options’)’ ist eine Berechtigungsprüfungsfunktion in WordPress. Mit dieser Funktion wird überprüft, ob der aktuelle angemeldete Benutzer die Berechtigung hat, auf eine bestimmte Funktion oder Seite zuzugreifen.
Im Kontext des gegebenen Codes wird ‘current_user_can(‘manage_options’)’ verwendet, um sicherzustellen, dass nur Benutzer mit ausreichenden Berechtigungen auf die Optionsseite des Plugins zugreifen können.
Sollte ein User nicht über die erforderlichen Berechtigungen verfügt, wird die Funktion ‘wp_die()’ aufgerufen. Diese Funktion zeigt eine Fehlermeldung an und bricht die weitere Ausführung des Codes ab. Dies hindert den Benutzer daran, auf die Optionsseite zuzugreifen. Und schützt somit vor unerwünschten Änderungen.
Durch die Verwendung von ‘current_user_can(‘manage_options’)’ wird also sichergestellt, dass nur berechtigte Benutzer Zugriff auf die Optionsseite des Plugins haben, was die Sicherheit und Integrität des Systems verbessert.
defined(‘ABSPATH’)
Die Zeile ‘defined(‘ABSPATH’) or die(‘Huh, are you trying to cheat?’);’ ist eine Sicherheitsmaßnahme, die sicherstellt, dass der direkte Zugriff auf die Plugin-Datei verhindert wird.
Indem ‘defined(‘ABSPATH’)’ überprüft wird, wird überprüft, ob die Konstante ‘ABSPATH’ definiert ist. Diese Konstante enthält den absoluten Pfad zum Hauptverzeichnis der WordPress-Installation. Sie wird meist in der ‘wp-config.php’-Datei definiert.
Wenn die Konstante ‘ABSPATH’ nicht definiert ist, deutet dies darauf hin, dass scheinbar die Plugin-Datei direkt aufgerufen wird. Also nicht über das WordPress-System. Und das könnte auf einen Versuch hinweisen, unberechtigten Zugriff oder Manipulation vorzunehmen.
In solch einem Fall wird ‘or die(‘Huh, are you trying to cheat?’);’ ausgeführt. Diese Anweisung bricht die Ausführung des Codes ab und gibt die angegebene Fehlermeldung aus. Dadurch wird verhindert, dass der restliche Code im Plugin ausgeführt wird.
Durch die Verwendung dieser Sicherheitsmaßnahme wird sichergestellt, dass das Plugin nur über das WordPress-System aufgerufen wird und nicht direkt über den Dateipfad. Dadurch wird das Risiko von potenziell unsicheren oder unerlaubten Zugriffen stark reduziert.
esc_html()
Die Funktion ‘esc_html()’ wird verwendet, um eine Zeichenkette (String) sicher für die Ausgabe im HTML-Code zu machen. Sie konvertiert bestimmte Zeichen in ihre entsprechenden HTML-Entitäten. Um potenziell unsicheren Code zu verhindern und Cross-Site Scripting (XSS) Angriffe zu vermeiden.
Durch die Anwendung von ‘esc_html()’ wird sichergestellt, dass Sonderzeichen wie ‘<‘, ‘>’, ‘&’, ‘”‘, ”’ usw. in HTML-Entitäten umgewandelt werden. Dadurch wird verhindert, dass unerwünschter Code ausgeführt oder HTML-Tags interpretiert werden, die potenziell schädlichen Code enthalten könnten.
Die Verwendung von ‘esc_html()’ ist eine wichtige Sicherheitsmaßnahme in der Webentwicklung, insbesondere bei der Verarbeitung von Benutzereingaben. Sie hilft dabei, die Integrität und Sicherheit von Webanwendungen zu gewährleisten, indem sie verhindert, dass bösartiger Code in die Ausgabe gelangt und potenzielle Schwachstellen ausnutzt.
Es ist eine bewährte Praxis, ‘esc_html()’ immer dann anzuwenden, wenn Benutzereingaben in HTML-Dokumente eingefügt werden, um das Risiko von XSS-Angriffen zu minimieren und eine sichere Ausgabe zu gewährleisten.
sanitize_text_field()
Die Funktion ‘sanitize_text_field()’ wird verwendet, um eine Zeichenkette (String) zu bereinigen. Also sicher, für die Verwendung in einer Datenbank oder als Ausgabe in HTML, zu machen. Sie entfernt potenziell schädlichen oder unerwünschten Code aus dem übergebenen Text und sorgt für eine sichere Aufnahme von Benutzereingaben.
Durch die Anwendung von ‘sanitize_text_field()’ werden unerwünschte Zeichen wie HTML-Tags, JavaScript-Code oder andere spezielle (XSS relevante) Zeichen entfernt oder in eine sichere Form umgewandelt. Dadurch wird das Risiko von Sicherheitslücken wie Cross-Site Scripting (XSS) minimiert.
Die Verwendung von ‘sanitize_text_field()’ ist besonders wichtig, wenn Benutzereingaben in Datenbanken gespeichert oder in HTML-Ausgaben verwendet werden. Denn sie hilft dabei, sicherzustellen, dass die Daten den erwarteten Formatierungsregeln entsprechen und keine potenziell schädlichen Inhalte enthalten.
Es ist empfehlenswert, ‘sanitize_text_field()’ einzusetzen, wenn Benutzereingaben verarbeitet werden, insbesondere wenn sie für Datenbankabfragen, dynamische Inhalte oder Ausgaben in HTML-Templates verwendet werden. Dies trägt dazu bei, die Sicherheit der Anwendung zu verbessern und das Risiko von Angriffen zu verringern, welche durch unsaubere oder unzureichend validierte Benutzereingaben ausgelöst werden könnten.
Plugin-Download:
Das fertige Muster-Plugin (mit Sicherheitsoptimierungen) kann hier runtergeladen werden:
Der Code / das Plugin darf frei genutzt werden, ob privat oder gewerblich. Der Code darf frei verändert / erweitert werden. Eine Urhebernennung ist nicht zwingend notwendig und auch die Authoren-Tags dürfen entfernt werden. Bitte beachten Sie, dass dieser Download keinerlei Gewährleistung oder Support beinhaltet. Jegliche Nutzung oder Installation erfolgt auf eigene Verantwortung.
↩ Zurück zur Blogübersicht