Sicherheit in WordPress Plugin-Entwicklung

Mein Plugin ist Mailer.app für WordPress, ich bin zu 85% fertig und ich konzentriere mich auf die Sicherheit vor der Veröffentlichung. Vor den Fragen sollte ich die Plugins-Architektur skizzieren:

Jetzt zu den Sicherheitsfragen von WordPress. Ich arbeite seit 3 ​​Jahren mit WP und kann diese nicht verstehen, um irgendwelche Informationen über sie zu finden:

  • Können andere Plugins auf meinen Plugin-Code zugreifen? zB require("../plugins/mail/class.client.php') und call new Client() ? Wenn ja, wie verhindere ich das und warum ist das erlaubt?
  • Kann ein anderes Plugin den Inhalt der Datei lesen, während ich den Verschlüsselungsschlüssel in der class Client speichere? Wenn ja, können Sie einen Platz zum Speichern empfehlen, so dass nur die Client() -class dieses Plugins darauf zugreifen kann?
  • Ich benutze current_user_can() und nonces aber reicht das, um AJAX genügend Sicherheit zu geben? Können Nonces abgelaufen sein? und wo lese ich mehr über sie in Bezug auf Sicherheit, Ajax und Web-Apps.
  • Kann multisite irgendwelche Zusatzprobleme von meinem Szenario verursachen?

Schauen wir uns ein Beispiel für meinen Code an:

class.client.php

 final class Client { const SALT = "bsas8D889b8989sHBsd"; // hash salt const EKEY = "23123asdas9dsbbad96"; // db encryption key const CKEY = "b797a78skj15hjhHJDa"; // cookie encryption key private static function GetUserData(){ return $this->decrypt_data() } public static function StoreUserData($data){ return $this->validate_and_store(); } public static function GetEmails(){ return $this->show_emails($this->GetUserData()); } } 

class.admin.php

 final class Admin { public function __construct(){ add_menu_page('mlr', 'mlr', 'manage_options', 'mlr', array($this,'admin_page')); } public function admin_page(){ $user = new Client(); echo $user->GetEmails(); } } 

Was mein ultimatives Ziel ist, andere Plugins, die infiziert sind (Backdoor usw.) oder nicht, können nicht auf den username / das password / die mail meiner Email zugreifen, das ist der Hauptteil der Frage. Die Benutzerdaten, die verschlüsselt und in der database gespeichert wurden, können nur mithilfe von Cookie und $key entschlüsselt werden. $key ist der anfällige Gegenstand.

Sorry für den extra langen Post, aber ich muss diese Fragen meiner Brust und hoffentlich einige Einblicke und Hilfe bekommen.

Vielen Dank

Solutions Collecting From Web of "Sicherheit in WordPress Plugin-Entwicklung"

Was mein ultimatives Ziel ist, andere Plugins, die infiziert sind (Backdoor usw.) oder nicht, können nicht auf den username / das password / die mail meiner Email zugreifen, das ist der Hauptteil der Frage.

Die einzige Möglichkeit, dies sicherzustellen, besteht darin, sie nicht in einer Weise zu speichern, die automatisch in der database / dem Dateisystem entschlüsselt werden kann – das heißt, sie nicht im Klartext oder überhaupt automatisch entschlüsselbar zu speichern.

Ich würde empfehlen, Ihre eigenen Sicherheitssalze und -schlüssel mit denen zu kombinieren, die für WordPress selbst konfiguriert sind – Sie sollten niemals ein Plugin verteilen, das hartcodierte Salze verwendet, da jeder mit dem Plugin im Grunde die Schlüssel zu dem bekommt, was für jede Installation hasiert wurde. Wenn Sie bei der Installation der WordPress-Installation feststellen, dass Ihr Plug-in verwundbar ist, können Sie die Salze aktualisieren und die Anmeldeinformationsspeicher aller Installationen ungültig machen, wenn das Plugin-Update durchgeführt wird. Wenn eine einzelne Installation kompromittiert wird, kann ein Benutzer seine WordPress-Salze ändern und ebenfalls ihre Anmeldeinformationen ungültig machen, ohne das Plugin zu ändern.

Können andere Plugins auf meinen Plugin-Code zugreifen? zB require("../plugins/mail/class.client.php') und new Client() aufrufen?

Ja.

Wenn ja, […] warum ist das erlaubt?

Es ist nicht “erlaubt”, sondern ist eine Folge von interpretierten Skriptumgebungen. “Erweitern von WordPress” mit Themes und Plugins ist genau das. Es ändert die Ausführung von WordPress mit roher Quelle, um das gewünschte Ergebnis zu erzielen. Ich kenne keine interpretierte Sprache, die tatsächlich zuverlässige Mechanismen bietet, um Teile des Quellskripts von anderen Teilen derselben Codebasis zu “sperren”. Betriebssysteme, sicher.

Vielmehr fällt diese Verantwortung auf die Ausführungsumgebung und auf den, der sie kontrolliert.

Wie verhindere ich das?

Es kann möglich sein, einige sehr komplexe Sandboxing zu verwenden und verschiedene Teile von WordPress in verschiedenen Threads auszuführen – aber das ist nicht so, wie WordPress entworfen wurde, und würde eine Neukonfiguration der schweren Umgebung erfordern. Selbst dann wäre es immer noch anfällig für eine Vielzahl von Angriffen – trotz des Google Chrome-Sandkasten-JavaScript ist der bösartige Code immer noch in der Lage, die Maßnahmen zu vereiteln.

Wie bei jeder Informationssicherheit sollte davon ausgegangen werden, dass bei kompromittierter Umgebung auch alles in und aus sich herausgeht, unabhängig von Sicherheitsmaßnahmen. Sogar binäre Viren in Sandbox-Umgebungen und solche, die in virtuellen Betriebssystemen ausgeführt werden, können aus ihren Grenzen ausbrechen, um das Host-System zu beschädigen, wenn sie mit solchen Szenarien entworfen werden.

Wenn die Konsumenten Ihres Plugins ihre WordPress-Installationen nicht ordnungsgemäß sichern oder kompromittierten Code installieren, gibt es keinen Teil des Dateisystems oder der database, der als “sicher” für kritische Informationen betrachtet werden kann. Genauso, als würde ein Virus auf Ihren Computer gelangen, kann kein Programm oder Dokument vertrauenswürdig bleiben, wenn es unverfälscht oder unbelichtet bleibt. Wenn Sie Kennwörter in einer Nur-Text-Datei speichern, müssen Sie davon ausgehen, dass alle relevanten Konten kompromittiert oder gefährdet sind. Hier wie überall in der IT-Sicherheitswelt sollten Benutzer keine ausführbaren Dateien installieren, denen sie nicht vertrauen oder die sie nicht verstehen – diejenigen, die keine gute Grundlage haben, um zwischen vertrauenswürdigen oder gut implementierten Programmen zu unterscheiden, sollten eine begrenzte Fähigkeit haben, zu erwerben und / oder Installieren Sie solche Gegenstände.

Kurz gesagt, wenn Sie selbst die WordPress-Installationen, auf denen Ihr Plugin installiert ist, nicht direkt kontrollieren, können Sie nicht verhindern, dass Ihr Plugin kompromittiert wird, wenn Sie nicht den guten Sicherheitsvorkehrungen in Ihrer Implementierung folgen.

Kann ein anderes Plugin den Inhalt der Datei lesen, während ich den Verschlüsselungsschlüssel in der class Client speichere?

Ja. Tatsächlich könnte jedes Plugin die wp-config.php Datei der WordPress-Installation parsen und die databaseinformationen und Salze erhalten, wenn es der Autor wünscht. Die Sache ist, ein Plugin muss nicht einmal das tun, um eine Installation zu kompromittieren, da die PHP- und WordPress-Umgebung bereits Plugins zur freien Verfügung über die database und das Dateisystem gibt, um ihre Ziele zu erreichen, soweit die database und das Dateisystem es erlauben. Ohne diese Fähigkeiten wären Plugins extrem begrenzt.

Wenn ja, können Sie einen Platz zum Speichern empfehlen, so dass nur die Client () -class dieses Plugins darauf zugreifen kann?

Nein. Anmeldeinformationen, die als Klartext gespeichert und / oder übertragen werden, sind niemals vollständig “sicher”, Punkt.

Wenn Ihre Anwendung eine solche Speicherung / Übertragung erfordert, können die Anmeldeinformationen nur so sicher sein wie die Umgebung, in der sie gespeichert sind. Sie können zusätzliche Ringe hinzufügen, um die Anmeldeinformationen zu verschleiern, aber die Tatsache bleibt, dass, wenn Ihr Code alles hat, was er benötigt, um die Anmeldeinformationen zu entschlüsseln, dann auch jeder andere Code in der Umgebung. Es ist im Wesentlichen das Gleiche wie das Speichern einer verschlüsselten Datei mit Kennwörtern auf Ihrem Computer neben einem Shell-Skript, das die Datei sofort nach der Ausführung entschlüsselt. Der beste Weg, sie zu schützen, ist die Umwelt zu schützen.

Ich benutze current_user_can() und nonces, aber reicht das, um AJAX genügend Sicherheit zu geben?

Es hängt von den Besonderheiten Ihrer Anwendung ab und was über AJAX übertragen wird. Im Allgemeinen reichen diese Mechanismen bei korrekter Implementierung aus, um zu bestätigen, dass AJAX-Anforderungen aus einer konsistenten Quelle stammen. Sie sind jedoch nur ein Bestandteil der AJAX-Sicherheit. Als allgemeine Faustregeln:

  • Nehmen Sie keine Maßnahmen vor, bis die Anfrage “ausreichend” verifiziert wurde, einschließlich der Verwendung von current-user_can() , check_ajax_referer()
  • Escape, validieren und bereinigen Sie alle Dinge , die dynamische Daten umfassen. Diese Praktiken sind unerlässlich, um SQL-Injektionen, willkürliche Ausführung von PHP und die Übermittlung von schädlichem JavaScript an Besucher zu verhindern. Dazu gehören $_GET , $_POST und $_COOKIE Daten sowie alle aus der database abgerufenen Daten, die als PHP ausgewertet oder an den Browser gesendet werden. Erfahren Sie, welche WordPress-functionen die Aufgaben für Sie erledigen. Führen Sie diese im Zweifelsfall selbst aus, bis Sie sicher sind.
  • Wenn Sie die Serverumgebung kontrollieren, sichern Sie Ihre Site mit einem SSL-Zertifikat und arbeiten Sie über das HTTPS-Protokoll, um die Gefahr von Man-in-the-Middle-Angriffen zu verringern ( das Let’s Encrypt-Projekt ist auf dem besten Weg, vertrauenswürdige Zertifikate kostenlos anzubieten) ).
  • Stellen Sie sicher, dass Ihre Fehlerbehandlung so implementiert ist, dass, wenn Ihr Server-Skript von einem Client gedrosselt wird oder direkt darauf zugegriffen wird, keine vertraulichen Daten an den Browser zurückgegeben werden.

Können Nonces abgelaufen sein?

Ja – WordPress stellt zu diesem Zweck den nonce_lifetime Filter zur Verfügung. Standardmäßig ist eine WordPress Nonce für 12-24 Stunden gültig.

Kann Multisite irgendwelche Zusatzprobleme von meinem Szenario verursachen?

Es hängt davon ab, wie Ihr Plugin installiert ist und Sie beabsichtigen, es in einer Umgebung mit mehreren Standorten zu verwenden – die möglichen “Probleme”, die auftreten könnten, könnten tatsächlich wünschenswerte Ergebnisse sein, je nachdem, wonach Sie suchen.

Möglicherweise möchten Sie E-Mail-Anmeldeinformationen als benutzer- oder standortspezifische Daten speichern, je nachdem, wer auf welche E-Mails zugreifen darf. Möglicherweise möchten Sie sogar benutzerdefinierte Rollen und functionen implementieren, um feineren Zugriff auf Postfächer zu ermöglichen.