Best Practices für die Sicherheit für WordPress-Plugin- und Theme-Entwickler
Veröffentlicht: 2020-12-09Als WordPress-Entwickler müssen Sie viele Entscheidungen darüber treffen, woran Sie arbeiten möchten. Ihr Hauptinteresse und Ihre Priorität sind es, ein erstaunliches Design oder Plugin zu erstellen, und Sicherheitsmaßnahmen treten oft in den Hintergrund, wenn Sie sich auf den Fahrersitz setzen, um am Code zu arbeiten. Wann haben Sie sich das letzte Mal hingesetzt und Ihren eigenen Code auf Sicherheitsprobleme überprüft? Nein, das dachte ich nicht
Diese Tipps basieren auf meiner Erfahrung sowohl bei der Entwicklung von Plugins bei CleverPlugins als auch bei der Unterstützung unzähliger Kunden, ihre Websites nach einem Hackerangriff wieder online zu bringen. Die Entwicklung eines Sicherheits-Plugins wie WP Security Ninja hat mich nicht weniger paranoid gegenüber dem Code anderer Leute gemacht.
Der häufigste Grund für gehackte Websites ist immer noch eine lausige Passwortverwaltung, aber das sollte keine Entschuldigung dafür sein, einige der einfachen Möglichkeiten zum Schutz Ihres Codes zu verwenden.
Wenn Sie ein Plugin oder Theme entwickeln, möchten Sie, dass es populär wird und auf so vielen Websites wie möglich installiert wird. Je größer Ihr Erfolg, desto größer ist die Wahrscheinlichkeit, dass Leute versuchen, Ihre Arbeit zu missbrauchen, um die Websites Ihrer Benutzer zu hacken.
Aufgrund der Popularität von WordPress ist es zu einem der häufigsten Ziele für Hacker geworden. Wenn eine Schwachstelle in einem Plugin oder einem Theme entdeckt wird, kann dies bedeuten, dass Tausende, wenn nicht Hunderttausende von Websites für Missbrauch geöffnet sind.
Leider kommt es regelmäßig vor, dass eine Schwachstelle in einem bekannten Produkt auftaucht, daher lohnt es sich, einige grundlegende Sicherheitsmaßnahmen zu ergreifen, um Ihren Code für Ihre Benutzer zu schützen.
Was ist mit dem Review-Team von WordPress.org?
Man könnte meinen, dass das Team, das Plugins und Themes vor der Veröffentlichung im offiziellen Repository überprüft, auf alle Arten von Sicherheitsproblemen prüft, aber das Team ist winzig und besteht nur aus wenigen Personen. Die Warteschlange der zu überprüfenden Plugins und Themen wächst ständig, sodass die Zeit, die sie zum Überprüfen der einzelnen Elemente haben, begrenzt ist.
Wenn sie jedoch etwas finden, schließen sie Ihr Plugin möglicherweise automatisch, bis Sie es beheben, oder senden Ihnen eine Warnung per E-Mail, dass Sie eine Schwachstelle vor einem bestimmten Zeitrahmen beheben müssen.
Der Punkt ist, dass Sie, sobald Ihr Plugin oder Thema im Repository aufgeführt ist, Updates ohne zusätzliches Screening über das Repository veröffentlichen können, sodass sich eine Schwachstelle jederzeit leicht einschleichen und für fast jeden Zeitraum unentdeckt bleiben kann.
Grundsätzlich liegt es an Ihnen, Ihre Plugin-Sicherheitsmaßnahmen zu verschärfen, also schauen wir uns einige Möglichkeiten an, wie Sie Ihr WordPress-Produkt schützen und sich vor vielen Kopfschmerzen und potenziell negativen Auswirkungen auf Ihre Marke schützen können.
Folgendes können Sie tun, um Ihr WordPress-Plugin oder -Design sicher zu entwickeln.
1. Denken Sie Sicherheit aus allen Perspektiven!
Sie wissen nie, wer Ihr Plugin oder Thema verwendet und wie viel Verständnis sie über Sicherheit haben, wenn überhaupt.
Sie wissen nie, wer Ihr Plugin oder Thema verwendet und wie viel Verständnis sie über Sicherheit haben, wenn überhaupt.Tweet
Administratoren, Redakteure oder normale Benutzer auf Kundenwebsites verwenden möglicherweise keine sicheren Passwörter, und ihre Konten könnten gehackt werden. Wenn Ihr Produkt nicht gesichert ist, könnten diese Konten missbraucht werden, um weiteren Zugriff zu erhalten, um bösartigen Code auf der Website Ihres Kunden zu installieren.
Sie sollten nicht erwarten, dass die Serveradministratoren, die den Server konfiguriert haben, auf dem die Website ausgeführt wird, genug darüber wissen, wie Sie Ihre Website vor anderen Websites auf demselben Server schützen können. Wenn die Website von einem großen Anbieter gehostet wird, können Sie davon ausgehen, dass die Website ordnungsgemäß „getrennt“ ist, aber Sie wissen nicht, wo Ihr Produkt installiert wird.
Klingt das paranoid? Vielleicht. Aber wenn Ihr Plugin oder Thema sehr beliebt wird, werden Sie froh sein, einen paranoiden Sicherheitsansatz gewählt zu haben.
Wenn Ihr Plugin oder Thema sehr beliebt wird, werden Sie froh sein, einen paranoiden Sicherheitsansatz gewählt zu haben. Twittern
2. Verhindern Sie XSS – Cross-Site-Scripting-Angriffe
Dieser wird immer wichtiger, da WordPress mit Gutenberg und ReactJS zu einem Frontend-gesteuerten Projekt wird.
Einer der häufigsten Fehler für WordPress-Entwickler ist das Vergessen, ihren Code zu validieren und zu bereinigen – wodurch er für XSS-Angriffe offen bleibt. Es gibt einige Variationen von XSS, aber im Allgemeinen tritt ein XSS-Angriff auf, wenn einem Hacker erlaubt wird, Code in den Server einzuschleusen und ihn dann im Browser eines Besuchers auszuführen.
Stellen Sie sich vor, Sie haben ein Eingabefeld. Nehmen wir der Einfachheit halber an, es handelt sich um ein Kommentarfeld, in dem Benutzer oder Besucher einen Kommentar zu einem Beitrag abgeben können.
Ein Hacker versucht, einen Kommentar mit "<script>alert('XSS');</script>"
zu übermitteln.
Nun, dies ist nur ein einfaches Beispiel, das eine Warnung auf dem Bildschirm des Benutzers anzeigt und sonst nichts. Ein echter Hacker verwendet das Kommentarfeld, um Code einzufügen, der Code von seiner Website lädt, der Informationen aus dem Browser des Besuchers stehlen kann und vieles mehr.
Wir können dies verhindern, indem wir validieren, bereinigen und entkommen.
Beim Validieren werden die übermittelten Daten überprüft, bevor etwas unternommen wird, z. B. um sie in der Datenbank zu speichern. Wann immer Daten übermittelt werden, können Sie sie überprüfen und sicherstellen, dass sie akzeptabel sind. Wenn es sich um ein Mengenfeld handelt, erwarten Sie eine Zahl. Wenn es sich nicht um eine Zahl handelt, können Sie dem Benutzer eine Fehlermeldung zurückgeben.
Bei der Datenbereinigung werden die übermittelten Informationen verarbeitet und sichergestellt, dass sie nichts enthalten, was wir nicht speichern möchten, z. B. das Entfernen unerwünschter Zeichen. WordPress hat mehrere Funktionen eingebaut, um dabei zu helfen. Mehr zur Desinfektion gleich.
Escaping verhindert, dass bösartiger Code tatsächlich in Ihrem Browser ausgeführt wird. Angenommen, Sie haben bereits bösartigen Code in Ihre Website eingeschleust, oder ein anderes Plugin oder Thema lässt Hacker Code in die von Ihnen verwendeten Daten einfügen – die Daten auf dem Bildschirm zu maskieren, bevor sie angezeigt werden, verhindert, dass dies ein Problem darstellt.
Sehen wir uns das gleiche einfache Beispiel an, das wir zuvor verwendet haben "<script>alert('XSS');</script>"
Wenn wir nichts mit diesem Code tun, wird der Browser denken, dass es sich um HTML-Code handelt. Das wichtige Detail hier sind die Zeichen < >, die verwendet werden, um HTML-Tags zu definieren. Indem wir diese maskieren, verwandeln wir <
in <
und >
in >
Der Browser versteht jetzt, dass dies kein echter HTML-Code ist und stattdessen nur ein Kleiner-als- und ein Größer-als-Zeichen anzeigen sollte.
Indem Sie alle Daten, die in Ihre Anwendung ein- und ausgehen, validieren, bereinigen und mit Escapezeichen versehen, schützen Sie Ihre Benutzer vor einer der häufigsten Angriffsmethoden.
3. Seien Sie vorsichtig mit SQL-Injections
Wie der Name schon sagt, kann ein Angreifer SQL-Injections verwenden, um Ihre Website dazu zu bringen, eine optimierte SQL-Abfrage zu verarbeiten, und diese verwenden, um Zugriff auf Ihre Datenbank zu erhalten.
Abhängig von den Daten, die Sie auf Ihrer Website speichern, kann das Durchsickern Ihrer Website-Daten durch einen SQL-Injection-Angriff von peinlich bis hin zu einem völligen Schaden für Ihren Ruf und Ihr Geschäft werden.
SQL-Injection ist eine alte Art, eine Website anzugreifen, aber sie ist immer noch sehr effektiv, und es gibt viele Leute, die nach Möglichkeiten suchen, diese Form des Angriffs zu nutzen. Im Oktober 2020 gab das beliebte Loginizer-WordPress-Plugin bekannt, dass es eine SQL-Injection-Schwachstelle hatte, die über eine Million Websites gefährdete.
Im Jahr 2019 stahlen unbekannte Hacker Millionen von Steuerdaten von Bulgaren über einen SQL-Injection-Angriff, und im Jahr 2016 extrahierte eine Gruppe russischer Hacker Wählerinformationen von etwa 500.000 Menschen in Ohio. Diese Art von Angriffen ist immer noch sehr effektiv, und Sie können viele Informationen darüber finden.
Quelle: https://xkcd.com/327/
Der häufigste Ort, an dem eine SQL-Injection stattfindet, ist ein Formularfeld, das Benutzereingaben akzeptiert – beispielsweise einen Namen. Der Angriff erfolgt durch die Eingabe von Teilen des SQL-Codes in die Eingabefelder, wodurch eine benutzerdefinierte Abfrage erstellt wird, die ein anderes Ergebnis liefert als erwartet.
Angenommen, Sie haben ein Formular, mit dem Benutzer nach einem bestimmten Namen suchen können.
SELECT * FROM wp_postmeta WHERE meta_value = 'Henry' AND meta_key = 'celebrity_name';
Dieses einfache Beispiel würde alle Zeilen aus der Post-Meta-Tabelle mit allen Zeilen aufnehmen, die den Namen Henry
und einen bestimmten Schlüssel, celebrity_name
, haben – auf diese Weise geben wir nicht die gesamte Datenbank und nur die bestimmten Zeilen zurück, die wir benötigen.
Ein Angreifer würde versuchen, einen anderen Wert zu analysieren – zum Beispiel 'Henry' OR 1=1--
Die Abfrage gibt jetzt alle Zeilen mit unserem spezifischen Wert oder irgendetwas anderem zurück – da OR 1=1
in SQL immer wahr ist.
Es kommt aber noch schlimmer. Unsere SQL-Abfrage hat nur nach Ergebnissen gefragt, bei denen der meta_key
mit dem bestimmten Wert übereinstimmt, nach dem wir suchen, also würden wir nicht alles zurückgeben. Dies sollte die Auswirkungen des SQL-Injection-Angriffs begrenzen, richtig?
Nun, nicht so. In SQL ist der doppelte Bindestrich ein Kommentarindikator, also wird alles, was danach kommt, kommentiert.
SELECT * FROM wp_postmeta WHERE meta_value = 'Henry' OR 1=1--' AND meta_key = 'celebrity_name';
Das heißt, die Abfrage sieht so aus:
SELECT * FROM wp_postmeta WHERE meta_value = 'Henry' OR 1=1
Die Abfrage gibt jetzt im Wesentlichen alles in dieser Datenbanktabelle zurück.
Dies war nur ein einfaches Beispiel. Es gibt viele kompliziertere Möglichkeiten, auf die meisten, wenn nicht alle Informationen in einer Datenbank zuzugreifen. Ein Angreifer könnte blinde SQL-Injection-Angriffe versuchen, was bedeutet, Code auf Ihrer Datenbank auszuführen – einen neuen Administrator hinzuzufügen, alle Ihre Daten zu entfernen und so weiter.
Die meisten Angriffe erfolgen in Form von zufälligen Abfragezeichenfolgen, die Teile von SQL enthalten, die an Ihre Website-Formulare gesendet werden. Die automatisierten Skripte würden alle Änderungen an Ihrer Website-Ausgabe erkennen und dann das Angriffspotenzial erkennen.
Eine einfache, effektive Möglichkeit besteht darin, ein Apostroph '
als Eingabe zu senden und zu sehen, ob es etwas ändert, ein Fehler auftritt oder mehr Ergebnisse zurückgegeben werden.
WordPress zur Rettung
Anstatt direkt mit der Datenbank zu interagieren, sollte jeder Entwickler die in WordPress integrierte Datenbank-Abstraktionsklasse $wpdb
.
Die $wpdb
-Klasse in WordPress verfügt über alle CRUD-Funktionen, die Sie benötigen, um sicher mit der Datenbank zu interagieren, und Sie können die Klasse sogar verwenden, um mit Ihren eigenen Datenbanktabellen zu interagieren, wenn Ihr Plugin oder Design dies erfordert.
Sie können das Problem lösen, indem Sie vorhersehen, welche Art von Daten sinnvollerweise in jedes Eingabeformular eingegeben werden sollten. In unserem vorherigen Beispiel haben wir nach einem Namen gesucht. Wir könnten die Eingabe bereinigen, um sicherzustellen, dass wir nur Briefe akzeptieren. Wenn Sie ein Auswahlfeld oder eine Optionsgruppe haben, die nur wenige Optionen enthält, können Sie die Daten überprüfen, um sicherzustellen, dass es sich nur um eine der Auswahlmöglichkeiten handelt, die Sie zulassen.
Das Wichtigste, was Sie tun können, um das Problem zu lösen, ist, Ihre Daten mit der Funktion $wpdb->prepare()
.
Diese Funktion nimmt eine vorbereitete Abfragezeichenfolge und ein Array der Argumente, die Sie der SQL-Abfrage hinzufügen möchten.
$meta_key = 'celebrity_name'; $meta_val = 'Henry' $allhenrys = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->postmeta WHERE meta_key = %s AND meta_value = %s", $meta_key, $meta_val ) );
Die gesamte Arbeit findet innerhalb der prepare()
Funktion statt. Der erste Parameter, die vorbereitete Abfrage, enthält anstelle der eigentlichen Werte den Platzhalter %s
. Dies wird durch die anderen geparsten Variablen $meta_key
und $meta_val
.
Hinweis – Es ist wichtig, dass in Ihrer Abfrage kein Apostroph die Platzhalter umgibt, da die Funktion diese für Sie hinzufügt.
Dies ist ein vereinfachtes Beispiel, aber derselbe Prozess kann für jede Datenbankabfrage verwendet werden, und Sie können %s
für Zeichenfolgen, %d
für Ganzzahlen und %f
für Gleitkommazahlen verwenden.
Es gibt auch Funktionen für bestimmte Situationen, z. B. das Hinzufügen einer neuen Zeile zur Datenbank. Zu diesem Zweck können Sie $wpdb->insert()
verwenden.
$wpdb->insert( "{$wpdb->prefix}my_custom_table", array( 'name' => 'Henry', 'userid' => 123, 'score' => 10, ), array( '%s', '%d', '%d', ) );
Die Verwendung der Vorbereitungsfunktion kann dazu beitragen, die meisten SQL-Einschleusungsversuche gegen Ihr Produkt zu verhindern.
Bitte denken Sie daran, die $wpdb-Dokumentation zu überprüfen. Einige Funktionen entkommen der Eingabe für Sie; andere erwarten, dass Sie die Eingabe selbst maskieren, bevor Sie die Daten für die Funktion parsen.
4. Verwenden Sie Nonces, um Ihre Anfragen zu schützen
Die Verwendung des Nonce-Systems in WordPress kann Ihnen helfen, viele Angriffe zu verhindern. Eine Nonce in Bezug auf die Sicherheit ist eine Nummer, die nur einmal verwendet wird. Die Idee ist, diese eindeutige Nummer allen Anfragen hinzuzufügen, die Sie von Ihrem Code an die WordPress-Installation stellen, um zu überprüfen, ob diese Anfrage legitim ist.
Es ist ein bisschen so, als hätte man ein geheimes Passwort, das man dem Türsteher geben muss, um in einen Club zu kommen
Allerdings sind Nonces in WordPress etwas anders – sie sind weder eine Zahl, noch wird die Nonce nur einmal verwendet.
Technisch gesehen können die Nonces in WordPress sowohl Kleinbuchstaben als auch Zahlen enthalten, und anstatt nur einmal verwendet zu werden, werden sie nach einer gewissen Zeit neu generiert.
Sie verwenden eine Nonce so, dass der PHP-Code, der Ihre JavaScript-Dateien registriert, eine kleine einzigartige Kombination aus Zahlen und Buchstaben generiert und diese zusammen analysiert, damit Ihr JS-Code sie lesen kann.
Jedes Mal, wenn der JavaScript-Code eine Anfrage an Ihre Website sendet, sendet er diesen Code mit, und wenn der Code nicht übereinstimmt, sollte Ihr Code die Anfrage vollständig ignorieren.
Mit einem Beispiel ist es immer etwas einfacher, also sehen wir uns eine einfache Möglichkeit an, eine .js-Datei in Ihr Plugin zu laden, indem Sie diesen Schritten folgen:
Nonces in einem WordPress-Plugin verwenden
add_action('wp_enqueue_scripts', 'load_my_plugin_script'); function load_my_plugin_script() { // Register the script with all details and ensures it is loaded after jQuery wp_register_script('secure-plugin', plugin_dir_url( __FILE__ ). 'js/secure-plugin.js', array( 'jquery' ) ); // Here happens the magic, we add some details to an object that we can later reference and read from in our JS code. wp_localize_script( 'secure-plugin', 'plugin_ajax_object', array( 'nonce' => wp_create_nonce('secure-plugin-nonce') ) ); // Once that is done, we can now enqueue the script wp_enqueue_script('secure-plugin'); }
In dieser Funktion weisen wir WordPress an, eine JavaScript-Datei zu laden. Zuerst registrieren wir die Datei, die wir laden möchten, mit wp_register_script()
.
Dann verwenden wir wp_localize_script()
, um ein Array von Daten zu analysieren, insbesondere „Nonce“, das die eindeutige Nonce enthält, die wir in unserem JS-Code verwenden möchten. Denken Sie daran, dass Sie in diesem Array auch alle möglichen anderen Informationen senden können, aber wir halten es in diesem Beispiel einfach.
Wenn Sie eine Anfrage aus Ihrer JavaScript-Datei senden, müssen Sie diese eindeutige Nonce einschließen. Das geht ganz einfach:
Verwenden von Nonce aus dem WordPress-Plugin in einer JavaScript-Datei
jQuery(document).ready(function($) { $.ajax({ url: ajaxurl, // WP variable, contains URL pointing to admin-ajax.php type: 'POST', data: { 'action': 'get_custom_data', '_ajax_nonce': plugin_ajax_object.nonce, 'user_data': 'Some input from a user' }, success: function( response ) { // Here we do what happens if all is good - update the interface with a success message!? }, error: function( response ) { // Whooops, something went wrong! // console.log(response); } }); });
Da wir wp_localize_script()
verwendet haben, können wir die Variable plugin_ajax_object in JavaScript verwenden. Wir senden die Nonce als Variable, _ajax_nonce
.
Überprüfen und verifizieren Sie eine Nonce in einem WordPress-Plugin aus JavaScript-Code
add_action('wp_ajax_get_custom_data', 'get_custom_data'); function get_custom_data() { // Ready for the magic to protect your code? check_ajax_referer('secure-plugin-nonce'); /** * That's it - the check_ajax_referer function verifies the nonce is correct or it dies and stops code execution if it fails. * * If you want to customize the error handling and perhaps return an error to your JS code, you could change the code to something like: * if ( ! check_ajax_referer( 'secure-plugin-nonce', false, false ) ) { * wp_send_json_error( 'Invalid nonce' ); * } */ $sanitized_user_data = sanitize_text_field( $_POST['user_data'] ); // ... continue with the rest of your plugin's function code ... }
Die Magie geschieht mit der Funktion check_ajax_referer()
, die die Nonce überprüft und einfach fehlschlägt und jede weitere Codeausführung stoppt, wenn die Nonce nicht mit dem übereinstimmt, was erwartet wurde.
Sie können den Code weiter anpassen, um dem Benutzer spezifische Informationen darüber zurückzugeben, was passiert ist.
Die Verwendung von Nonces in Ihrem Code ist eine schnelle, einfache und effektive Möglichkeit, viele Arten von Hacking-Versuchen zu verhindern. Das bedeutet nicht, dass Sie alle anderen Sicherheitsmaßnahmen überspringen können, aber es hilft, die schlimmsten Probleme zu reduzieren.
Erinnerst du dich, was ich darüber gesagt habe, niemandem zu vertrauen? Das bringt uns zu einer anderen Möglichkeit, Ihren Code zu schützen – der Bereinigung.
Abonnieren Sie unser Buch und sichern Sie sich ein kostenloses Exemplar
11 erprobte Techniken zur Steigerung Ihrer Erfolgsquote bei Kreditkartenstreitigkeiten um 740 %
Teilen Sie mit einem Freund
Geben Sie die E-Mail-Adresse Ihres Freundes ein. Wir schicken ihnen nur dieses Buch per E-Mail, Scout's Ehre.
Ich danke Ihnen für das Teilen
Genial – ein Exemplar von „11 erprobte Techniken zur Steigerung Ihrer Erfolgsquote bei Kreditkartenstreitigkeiten um 740 %“ wurde gerade an gesendet . Möchten Sie uns helfen, das Wort noch mehr zu verbreiten? Los, teilen Sie das Buch mit Ihren Freunden und Kollegen.
Danke fürs Abonnieren!
- wir haben gerade Ihr Exemplar von '11 erprobte Techniken zur Steigerung Ihrer Erfolgsquote bei Kreditkartenstreitigkeiten um 740 %' an gesendet .
Haben Sie einen Tippfehler in Ihrer E-Mail? Klicken Sie hier, um die E-Mail-Adresse zu bearbeiten und erneut zu senden.
5. Benutzereingaben bereinigen
Im vorherigen Beispiel haben wir ein zusätzliches Datenelement eingefügt, das von JS an PHP gesendet wurde. Jedes Mal, wenn Sie Daten in Ihren Code eingeben, sollten Sie damit rechnen, dass dieser unsicher ist.
'user_data':'Some input from a user'
In diesem Beispiel handelt es sich um eine einfache Zeichenfolge, aber da wir Daten an PHP zurücksenden, müssen wir sicherstellen, dass die Eingabe keinen Code enthält, der in unserer PHP-Umgebung ausgenutzt oder in der Datenbank gespeichert werden könnte, um weiteren Missbrauch zu ermöglichen.
Hinzu kommt die Desinfektion. WordPress verfügt über eine Reihe von Funktionen, die alle von Ihnen eingegebenen Eingaben entgegennehmen und die Daten bereinigen, bevor sie an Sie zurückgegeben werden.
In diesem Beispiel haben wir die Funktion sanitize_text_field()
verwendet, aber WordPress enthält viele Bereinigungsfunktionen, die für verschiedene Datentypen geeignet sind.
Es gibt viele andere großartige Funktionen und Methoden, die in WordPress integriert sind, die Sie verwenden können, um Ihren Code sicher zu halten und Missbrauch zu verhindern.
Sie sollten niemals Daten verwenden, die an Ihren Code gesendet werden, ohne sie vorher zu bereinigen. Lesen Sie diesen Artikel über häufige Fehler von WordPress-Entwicklern mit weiteren Details zur Bereinigung und anderen großartigen praktischen Tipps.
Und das bringt mich zum nächsten Tipp, den die meisten WordPress-Entwickler erlebt haben:
6. Denken Sie daran, dass is_admin()
nicht das ist, was Sie denken
Wenn Sie zum ersten Mal darüber nachdenken, Ihren Code vor Bösem zu schützen, werden Sie wahrscheinlich über die Funktion is_admin()
stolpern, und dem Namen nach scheint es alles zu sein, was Sie brauchen, und alles, was Sie tun müssen, ist, Ihren Code damit zu verpacken, und alles wird gut.
Nein, leider nicht. Die Funktion is_admin()
erkennt nur, ob der Code auf der Administrationsseite der Website ausgeführt wird. Es erkennt nicht, ob Ihr Code von einem normalen Benutzer oder Administrator ausgeführt wird.
Sie werden es nie bemerken, wenn Sie den Code einfach in Ihr Plugin eingeben, weil Sie den Code höchstwahrscheinlich in der Administrationsoberfläche ausführen, und das bedeutet, dass der Code nur als true
ausgewertet wird, und Sie werden aufhören, darüber nachzudenken und zu etwas übergehen anders.
Der richtige Weg, um zu überprüfen, ob ein Benutzer ein Administrator ist, besteht darin, die Benutzerberechtigung zu überprüfen:
if ( current_user_can( 'activate_plugins' ) ) { // Do your code here }
Es gibt verschiedene Funktionen für verschiedene Benutzerrollen, sodass Sie eine viel genauere Kontrolle haben. In den meisten Fällen ist 'activate_plugins'
das, was Sie nur für Administratoren benötigen.
Wenn Sie sowohl Administratoren als auch Redakteuren erlauben möchten, etwas zu tun, sollten Sie die Funktion 'edit_pages'
.
7. Fügen Sie rel=“noopener“ oder rel=“noreferrer“ zu Ihren Links hinzu
Das Verlinken auf externe Ressourcen ist ganz normal, und die Methode der alten Schule, target="_blank"
zu diesen Links hinzuzufügen, ist sinnvoll, da Sie nicht möchten, dass Ihre Benutzer Ihre Plugin-/Designseite verlassen.
Dies öffnet Sie jedoch für das, was Tabnabbing genannt wird. Dies ist ein Sicherheitsproblem, bei dem bösartiger JavaScript-Code Informationen von Ihren Benutzern stehlen kann, indem die JavaScript window.opener
Funktion missbraucht wird.
Dies zu verhindern kann so einfach sein wie das Hinzufügen von rel="noopener"
zu Ihren Links. Die Seite, auf die Sie heute verlinken, mag in Ordnung sein, aber das könnte sich in Zukunft ändern.
rel=noopener
bedeutet, dass die Seite, auf die Sie verlinken, nicht auf Informationen zugreifen oder die Kontrolle über Ihre Seite erlangen kann.
rel=noreferrer
tut dasselbe und weist den Browser außerdem an, keine Verweisinformationen über den Referrer-Header weiterzugeben. Das Hinzufügen rel="noreferrer"
bedeutet, dass die Seite, auf die Sie verlinken, nicht weiß, woher Ihr Besucher kommt.
Hinweis: Diese beiden Eigenschaften sollten nicht mit rel=nofollow
verwechselt werden, was mit SEO zusammenhängt.
8. Verwenden Sie HTTPS und sichere Token mit APIs von Drittanbietern
Als Entwickler müssen Sie häufig APIs integrieren, und es ist wichtig, dies sicher zu tun, um die Daten zu schützen, die Sie hin und her senden.
Glücklicherweise gibt es bereits Standards dafür, wie man dies sicher macht; einer davon ist HTTPS. Die Verwendung von HTTPS führt eine Sicherheitsebene ein, bei der alle übertragenen Daten verschlüsselt werden.
Um sicherzustellen, dass Ihre Daten vor neugierigen Blicken geschützt sind, reicht die Verwendung von HTTPS jedoch nicht aus.
Wie dieser Artikel von Ars Technica erklärt: „HTTPS bedeutet nicht, dass Ihre Daten sicher sind, es bedeutet nur, dass Ihre Verbindung sicher ist.“
Sichere Token – JWT
Ein sicherer Standard zur Abwicklung von Kommunikations- und API-Integrationen ist die Verwendung von JSON Web Tokens, JWT.
Ein sicheres Token wird erstellt, indem eine Anfrage an einen Server gestellt wird, der die Anmeldedaten eines Benutzers validiert und ein Token generiert, eine kleine Zeichenfolge, die Daten wie Benutzername, ID usw. enthält.
Wenn Sie nachfolgende Anforderungen an den Server senden, schließen Sie dieses Token in die Anforderung ein. Dieses Token beweist, dass Sie authentifiziert sind und Zugriff haben. Wenn das Token gültig und nicht abgelaufen ist, verwendet der Server die im Token enthaltenen Benutzerdetails und ruft die angeforderten Daten ab.
Der Server kann Anfragen auf diese Weise schnell verarbeiten, im Vergleich zur Verwendung eines API-Schlüssels, bei dem der Benutzer über diesen Schlüssel gesucht werden müsste, bevor entschieden wird, die Daten zu verarbeiten. Mit einem Token können Sie Daten über den Benutzer in das Token aufnehmen und mehrere Datenbankabfragen speichern.
Durch die Art und Weise, wie ein sicheres Token generiert und anschließend verwendet wird, ist es nicht möglich, gefälschte Token zu erstellen oder den Inhalt eines Tokens zu manipulieren. Es ist nur möglich, einen gültigen Token zu erstellen, wenn man einen geheimen Schlüssel kennt, den das Unternehmen hinter der Plattform gut versteckt hält.
Ein sehr wichtiger Hinweis ist, dass Daten in einem Token nicht verschlüsselt sind. Es ist unmöglich, den Token-Inhalt zu manipulieren, ohne ihn ungültig zu machen, aber die Daten in einem Token können leicht von jedem gelesen werden, daher ist es kein guter Ort, um sensible Daten zu speichern.
Eine gute Ressource, wenn Sie mehr über Token und ihre Funktionsweise erfahren möchten, ist die Einführung in JSON-Webtoken.
9. Verwenden Sie keine externen Bibliotheken von CDNs
Obwohl es verlockend sein kann, alle Bibliotheken, die Sie möglicherweise benötigen, über cdnjs.com oder andere kostenlose globale CDNs einzubinden, gibt es einige Nachteile.
Zunächst einmal haben Sie keine Kontrolle über die Bibliotheken und jeglichen bösartigen Code, der sich in die von Ihnen eingebundenen Dateien einschleicht.
Obwohl CDNs per Definition im Allgemeinen stabil und schnell sind, sind sie auch mehr Angriffen ausgesetzt. Wenn Ihr Code auf einer JS-Bibliothek auf einem angegriffenen CDN basiert, werden Ihr Plugin und Ihr Design entweder sehr langsam oder gar nicht geladen.
Dies geschah bei einer Kundenwebsite, bei der das öffentliche CDN, das ein Plug-in zu diesem Zeitpunkt verwendete, für Benutzer in einigen Regionen ablief, wodurch die Benutzeroberfläche unbrauchbar wurde. Am Ende musste ich das Plugin ändern, um stattdessen eine lokale Kopie des JS-Skripts als schnelle Lösung zu verwenden.
Die Verwendung einer externen Quelle von Drittanbietern könnte auch die Privatsphäre gefährden. Es wird dem CDN möglich sein, alle Ihre Benutzer-IPs zu protokollieren – überprüfen Sie unbedingt die DSGVO-Richtlinie und informieren Sie Ihre Kunden.
Wenn Sie seriöse CDN-Drittanbieter verwenden, werden Sie im Allgemeinen keine Probleme haben, aber der einfachste und zuverlässigste Ansatz besteht darin, die in Ihrem Produkt enthaltene JS-Bibliothek zu verteilen.
Wusstest du schon? WordPress enthält mehrere JS-Bibliotheken. Viele der gebräuchlicheren JS-Bibliotheken, die Sie vielleicht verwenden möchten, sind in WordPress enthalten. Diese Bibliotheken decken die meisten Ihrer Grundbedürfnisse ab.
Entwicklertipp: Bitte laden Sie die zusätzlichen JS- und CSS-Dateien nur auf den Seiten, die Sie benötigen. Als Entwickler und Benutzer mag ich keine Plugins, die den Administrator verlangsamen, indem sie unnötige JS- und CSS-Dateien auf jeder Seite laden. Es verlangsamt nicht nur andere Admin-Seiten, sondern kann auch das visuelle Layout durcheinander bringen und einige Admin-Seiten fast unbrauchbar machen. Bitte
Es gibt auch einige Tools, die Ihnen helfen können, Ihren Code zu schützen, und ein großartiges Tool, das Sie kostenlos verwenden können, ist Coderisk.
10. Verwenden Sie Tools und Dienste, um Ihren Code zu analysieren
Coderisiko
Es gibt viele automatisierte Dienste, die helfen, Codeprobleme zu identifizieren. Exakat, SonarSource und PHPStan, um nur einige zu nennen, und einer meiner Favoriten – Coderisk.com – Eine einfache Möglichkeit, einige der offensichtlicheren Sicherheitsfehler in Ihrem Code zu finden.
Dieses Unternehmen scannt alle WordPress-Plugins aus dem öffentlichen WordPress.org-Repository. Ihre Software ist in der Lage, Hunderte verschiedener Arten von Sicherheitsproblemen basierend auf verschiedenen Codierungsstandards zu scannen und zu identifizieren.
Laut eigenen Statistiken haben sie bisher über 4 Milliarden Zeilen öffentlichen Codes gescannt, und selbst mit den Top-Plugins gibt es ziemlich viele Probleme.
Sich für ihren kostenlosen Service anzumelden ist ganz einfach – Sie können ein kostenloses Konto erstellen und dann damit beginnen, Ihre Plugins zu beanspruchen. Das Beanspruchen eines Plugins ist so einfach wie das Nehmen einer einzelnen Codezeile, die Sie in Ihre readme.txt einfügen, wenn Sie das nächste Mal eine neue Version bereitstellen.
Auf diese Weise können Sie auf den neuesten Scan Ihres Plugins zugreifen, und darin enthalten sie spezifische Informationen und Details zu jedem Problem mit direkten Links zu Ihrem Code.
Denken Sie daran, dass dies ein kostenloser Service ist, daher aktualisieren sie ihren Scan Ihres Plugins möglicherweise nicht so oft, aber sobald Sie eine Benachrichtigung erhalten, lohnt es sich, Ihren Code zu überprüfen, da Sie seit der letzten Überprüfung möglicherweise einen Fehler gemacht haben dein Code.
Die Benutzeroberfläche ist ziemlich einfach zu navigieren, sobald Sie den Dreh raus haben, und das System ist sehr nützlich, da es Ihnen sehr leicht verständliche Anweisungen zu den Fehlern gibt, die Ihnen helfen, den Fehler zu finden.
Es gibt auch viele Möglichkeiten, Fehler zu filtern, und Sie können jedes Problem als behoben markieren oder viele andere Optionen, die Ihnen helfen, schnell einen Überblick über alle Probleme zu erhalten.
Hinweis: Wenn Sie Coderisk (oder ein anderes Tool in seiner Kategorie) nie für Ihren Code ausführen, machen Sie sich keine Sorgen über die Anzahl der vermuteten Probleme, vor denen Sie gewarnt werden. Diese Tools können eine Menge falsch positiver Ergebnisse generieren, da sie nur den Code analysieren, ohne die Geschäftslogik zu verstehen. Verwenden Sie die Ausgabe des Tools als solide Ausgangsliste der zu überprüfenden Elemente.
PHP_CodeSniffer
Ein weiteres großartiges Tool zum Überprüfen Ihres Codes ist PHP_CodeSniffer. Das PHPCS besteht aus zwei Skripten, dem PHPCS, das Ihren Code überprüft und Ihnen Fehler meldet, und dem PHPCBF, das eine Vielzahl der von PHPCS identifizierten Probleme automatisch beheben kann.
Die Verwendung von PHPCS ist sehr einfach über die Befehlszeile zu verwenden, sobald Sie es installiert haben. Dieses Tool verhindert nicht, dass Sicherheitsprobleme in Ihrem Code auftauchen, aber Sie können einfache Codierungsfehler beseitigen, was es viel schwieriger macht, größere Probleme zu missbrauchen.
Es ist auch möglich, PHPCS direkt in Ihren Editor zu integrieren, z. B. Sublime Text und Visual Code. Auf diese Weise können Sie Fehler leicht erkennen und schnell in Ihrer IDE beheben.
Egal, ob Sie in einem Team oder als einzelner Entwickler arbeiten, es lohnt sich, ein automatisiertes System zu verwenden, da es eine einfache Möglichkeit ist, grundlegende Sicherheitsprobleme zu beseitigen, die Sie sonst übersehen könnten.
Die Verwendung eines automatisierten Systems zum Scannen Ihres Codes auf Sicherheitsprobleme ist keine sichere Catch-all-Bugs-Methode, aber es kann Ihnen helfen, die offensichtlichsten Fehler zu lokalisieren.
11. Kopieren Sie keinen Code aus dem Internet ohne eine ordnungsgemäße Überprüfung
Ihr WP-Produkt so sicher wie möglich zu halten, sollte ein fortlaufender Prozess sein, nicht nur hin und wieder. Wenn Sie neue Funktionen einführen oder Code entfernen, können Sie auch neue Sicherheitsprobleme einführen.
Google ist nicht immer dein Freund. Als Entwickler sind Sie es gewohnt, das große weite Internet nach Codebeispielen zu durchsuchen, um Sie zu inspirieren – oder einfach hier und da Bits und Stücke umzuschreiben, wenn Sie faul sind.
Die meisten Codeteile, die Sie im Internet finden, sind selten für die Verwendung in einer sicheren Produktionsumgebung bereit und dienen als Beispiel für das Codierungsproblem, das Sie zu beheben versuchen. Die blinde und ungeprüfte Verwendung dieser Codeteile kann sehr schnell zu Problemen führen.
Als WordPress-Entwickler gibt es viel zu tun, und das Beheben eines dringenden Sicherheitsproblems in Ihrem Plugin mit Tausenden von Installationen sollte nicht dazu gehören.
Denken Sie daran, dass Ihr Ruf auf dem Spiel steht
Wenn Sie nicht auf die Sicherheit Ihres Plugins oder Themes achten, setzen Sie Ihre Benutzer, deren Unternehmen, Ihr Unternehmen und Ihren Ruf aufs Spiel. Das ist viel potenziell verschwendete Zeit und Geld!
Sicherheitslücken können massive Auswirkungen auf das Vertrauen haben, das Kunden Ihrer Marke oder Ihren Produkten entgegenbringen. Das obige Loginizer-Beispiel zeigt, dass selbst die peinlichsten Sicherheitslücken den Entwicklern von Sicherheits-Plugins selbst passieren können! Und die anderen Beispiele zu Wahlbetrug und Regierungshacks zeigen uns, dass jeder angreifbar ist.
Wenn Sie eine Schwachstelle entdecken, handeln Sie schnell, um sie zu beheben, und befolgen Sie Best Practices für die öffentliche Ankündigung des Problems (falls erforderlich) zusammen mit der Veröffentlichung eines Fixes.
Wenn Sie in Bezug auf Kommunikation und die Probleme der „Öffentlichkeitsarbeit“, die sich aus einer Schwachstelle ergeben können, immer einen Schritt voraus sind, können Sie einige riesige Kopfschmerzen vermeiden und Ihre Reputation steigern, anstatt sie zu beschädigen.
Danke fürs Lesen!
Es kann entmutigend sein, sich mit all den Dingen zu befassen, die Sie tun müssen, wenn Sie nicht wissen, wonach Sie suchen sollen, und es kann schwierig sein, die richtigen Informationen zu finden. Wenn Sie keine Ahnung haben, wo Sie anfangen sollen, sollten Sie Ihr Produkt von einem WP-Sicherheitsexperten überprüfen lassen (ich mache auch Sicherheitsüberprüfungen).
Es ist verlockend, das Geld oder die Zeit für eine Sicherheitsüberprüfung zu sparen, aber die Kosten, wenn Sie Ihr Produkt nicht so gut wie möglich sichern, können auf lange Sicht noch höher sein.
Dies sind nur einige der Möglichkeiten, wie Sie Ihr WordPress-Produkt vor Missbrauch schützen können und sollten. Wenn Sie irgendwelche Zweifel haben, denken Sie einfach daran – vertrauen Sie niemandem