Was sind bewährte Sicherheitsmethoden für WordPress-Plugins und -Themen? [geschlossen]


22

Wie in dieser Frage vorgeschlagen , füge ich dieses Thema als neue Frage zur Diskussion / Abstimmung in Bezug auf Best Practices für die Plugin- / Themensicherheit hinzu.

Hier ist die Start-Checkliste, basierend auf meinen aktuellen (in Arbeit befindlichen) Einstellungen / der Datensicherheits-Checkliste, die zum Überprüfen von Themen verwendet wird (die Prinzipien sollten für Plugins nicht anders sein als für Themen).

Wenn Sie ein Thema mit einer sicheren und solide codierten Seite für Themaeinstellungen auschecken möchten, lesen Sie das folgende Thema:
http://wordpress.org/extend/themes/coraline


Wenn es jemandem mit den entsprechenden Privilegien nichts ausmachen würde, dies zu einem Community-Wiki zu machen?
Chip Bennett

Um eine Frage im Wiki-Modus zu bekommen, muss ein Mod die Frage entsprechend
kennzeichnen.

Was ist das Besondere an Coraline? Imo gibt es immer noch Möglichkeiten erreiche ich Link anons würde vorschlagen , A insted. Wordpress.stackexchange.com/questions/13539/...
kaiser

Es mag nichts Besonderes an Coraline geben. Es ist einfach diejenige, auf die wir Theme-Entwickler derzeit beim Überprüfen von Themes verweisen, da dies das Beispiel von Justin Tadlock war, der viele der anfänglichen sicherheitsspezifischen Theme-Überprüfungen durchgeführt hat. Ich würde die Önologie auch als gutes Beispiel anbieten, aber ich möchte nicht versuchen, mein eigenes Thema aufzupeppen. :)
Chip Bennett

Antworten:



12

Daten bereinigen, validieren und entziehen

Bereinigen Sie alles, was in (!) Die Datenbank sowohl im Front-End als auch im Back-End gelangen könnte!

Plugins und Themes sollten eine ordnungsgemäße Datenüberprüfung durchführen:

  1. Überprüfen und bereinigen Sie alle nicht vertrauenswürdigen Daten, bevor Sie Daten in die Datenbank eingeben
  2. Schließen Sie alle nicht vertrauenswürdigen Daten, bevor Sie in den Formularfeldern Einstellungen ausgegeben werden
  3. Escape alle nicht vertrauenswürdigen Daten vor der Ausgabe in den Theme-Vorlagendateien

Plugins und Themes sollten esc_attr()für Texteingaben und / esc_html()oder esc_textarea()für Textbereiche verwendet werden.

Ebenfalls erhältlich von dem Wordpress - API ist esc_url(), esc_url_raw(), esc_js()und wp_filter_kses().

Schlechtes Beispiel:

<?php $url = 'javascript:pwnd()'; ?>
<a href="<?php echo $url; ?>">anchor</a>

Gutes Beispiel:

<a href="<?php echo esc_url($url); ?>">anchor</a>

Hier ist ein großartiges Video von Mark Jaquith, das die Verwendung der Escape-Funktionen erklärt:


3
Auf dem Weg rein sanieren, auf dem Weg raus entkommen .. :)
t31os

9

Verwenden Sie $ _GET / $ _POST / $ _REQUEST nur dann, wenn keine besseren APIs verfügbar sind

Plugins und Themes sollten die Einstellungen API verwenden , zu erhalten und speichern Formulareingabedaten anstatt auf $_POSTund $_REQUESTDaten direkt.


3
Behandeln Sie $ _POST, $ _REQUEST und $ _GET immer als unsicher. Bereinigen Sie die Werte dieser Arrays und listen Sie sie auf, und fügen Sie sie in Ihre eigenen Variablen ein. Bereinigen Sie niemals Werte, die vom Benutzer stammen, und legen Sie sie wieder in $ _POST ab.
Goldenapples

2
Überprüfen Sie immer, ob der zu verwendende Schlüssel im entsprechenden Array festgelegt ist. isset () ist dein Freund :)
Mfields

9

Verwenden $wpdb->prepare

Wenn Sie benutzerdefinierte Abfragen über das $wpdbObjekt $wpdb->prepareerstellen, füllen Sie Platzhalter immer mit Werten, anstatt die Abfragen mit Daten zu schreiben, die mit SQL-Code gemischt sind, da die mysql_*Familienfunktionen alle falsch gelehrt haben.


$wpdb->prepareist nicht dasselbe wie vorbereitete Aussagen.
Hakre

8

Seien Sie vorsichtig mit PHP-Funktionen, mit denen möglicherweise schädlicher Code ausgeführt wird

Eine gute Lektüre für alle, die PHP schreiben: Ausnutzbare PHP-Funktionen auf StackOverflow.

Verwenden Sie die Theme Modification API

Themen sollten set_theme_mod()und verwandte Funktionen nicht ein selbst erfundenes Namensschema verwenden.
Die theme_mod-API ist eine spezielle Ebene für die Einstellungs-API. Es garantiert eindeutige Namen, verschiebt alle Optionen in ein Array und ist nach meiner Erfahrung viel einfacher zu handhaben. Darüber hinaus bietet es standardisierte Filter für Plugins - was sich positiv auf die Interoperabilität auswirkt.

Vermeiden Sie aktiviert register_globals

Verlasse dich nicht auf register_globals = on. Ein Pro Theme, das mein letzter Kunde gekauft hat, macht genau das. Ich könnte jede Site mit diesem Thema in 5 Minuten
hacken ... ThimbThumb hat dies auch getan (und tut es immer noch?).

Erstellen Sie keine Dateien mit unnötigen Zugriffsrechten

Erstellen Sie keine Dateien mit zu freien Zugriffsberechtigungen.

Verwenden Sie SSL, sofern verfügbar

Zeigen Sie mit Ihrem Link auf Twitter / Facebook / Anything auf die HTTPS-URI, falls verfügbar. Die Sicherheit Ihres Lesers ist ebenfalls wichtig.


2
Können Sie insbesondere erläutern set_theme_mod(), wie Sie es richtig mit der Verwendung der Einstellungs-API kombinieren können?
Chip Bennett

@Chip Bennett Ich habe meiner Antwort einige Informationen hinzugefügt.
fuxia

Können Sie diese Miniliste in kleinere, spezifischere Antworten aufteilen? Einfachere Verwaltung des Community-Wikis in kleineren Blöcken. TIA
Rarst

3
Chip: Das Theme-Mod-System lässt sich nicht gut in die Settings-API integrieren. Ich schreibe einen Beitrag, in dem ich erkläre, wie ich es bald richtig mache.
Otto

7

Speichern Sie die Daten in einem einzigen Array

Plugins und Designs sollten Optionen in einem einzigen Array speichern, anstatt mehrere Optionen für die Einstellungsseite zu erstellen. Die Verwendung der Einstellungs-API würde dies handhaben.


6

Prüfen Sie beim Hinzufügen und Ausgeben von Einstellungsseiten, ob die entsprechenden Funktionen vorhanden sind

Plugins sollten eine geeignete Funktion (z. B. manage_options) zum Hinzufügen der Einstellungsseite verwenden.

Themen sollten edit_theme_optionsals geeignete Funktion zum Hinzufügen der Einstellungsseite verwendet werden.


1
Kleiner, aber wichtiger Hinweis: Sie können edit_theme_optionsdie Einstellungs-API jedoch nicht verwenden. Die Übermittlung von Optionen ist fest codiert manage_options, um Aktualisierungen übermitteln zu können. Zugehöriges Trac-Ticket finden Sie hier .
t31os

Richtig, aber 1) das wirkt sich nur auf die Redakteure aus, nicht auf die Administratoren. und 2) hoffentlich wird dies bald über das verknüpfte Trac-Ticket behoben.
Chip Bennett

Es gibt immer die Möglichkeit, einer benutzerdefinierten Rolle oder einer regulären Rolle die Obergrenze edit_theme_optionszuzuweisen. Ich dachte, es wäre praktisch, darauf hinzuweisen, dass die Einstellungs-API in ihrem aktuellen Status nur von Rollen mit der manage_optionsFähigkeit verwendet werden kann.
t31os

5

Verwenden Sie aktuelle Tutorials und Informationen

Plugins und Designs sollten die Seiten Optionen und Einstellungen bewusst implementieren und sich nicht auf Lernprogramme zum Kopieren und Einfügen von Websites stützen, die veraltet sind und keine ordnungsgemäße Datensicherheit bieten, wie die unten aufgeführten.

Beispiele, was nicht zu tun ist :


1
Ich habe einen kleinen hervorgehobenen Text hinzugefügt, um darauf hinzuweisen, dass die Links Beispiele dafür sind, was nicht zu tun ist, da es einfach ist, durch die Informationen zu blättern und auf die Links zu klicken, ohne den vorhergehenden Absatz zu lesen. Auch machte die Antwort ein wenig schöner, während ich dort war ...;)
31.03.11

2
Dies könnte ein bisschen Erklärung gebrauchen, was genau die Beispiel-Tutorials falsch und / oder alt machen.
Rarst

4

Verwenden Sie die Einstellungs-API

Plug-ins und Designs sollten die Einstellungs-API verwenden, die benutzerfreundlicher und sicherer ist und einen Großteil der harten Arbeit der Einstellungsseiten erledigt:

Eine gute Anleitung zur Verwendung der Einstellungs-API finden Sie unter:


Siehe meinen Kommentar zu dieser Antwort in Bezug auf die Einstellungs-API und die Designoptionen.
t31os

1

Für Kontrollkästchen und wählen Sie die Optionen, Plugins und Themes sollten die Verwendung checked()und selected()Funktionen zur Ausgabe checked="checked"und selected="selected"jeweils.


Nicht wirklich eine Sicherheitssache, es sei denn, ich vermisse etwas. Immer noch sehr praktisch und gut zu bedienen. :)
Rarst

Na ja, vielleicht und vielleicht auch nicht. Ich habe eine Menge benutzerdefinierten Code gesehen, um das Gleiche zu erreichen. Mehr Code-Spaghetti = mehr Möglichkeiten, Sicherheitsrisiken einzuführen. :)
Chip Bennett

Bennet - vom Mailing mit toscho vor einigen Tagen - ich denke, ich kann es für uns beide sagen - die einfachsten Funktionen dafür sind viel einfacher zu lesen und zu verstehen als diese Funktionen. Ich bin das nicht down-, aber auch nicht upvotings. Imo sollte dies nicht Teil des Kerns sein, da es keinen Wert hinzufügt.
Kaiser

2
Ich bin gespannt, was euch einfällt, das ist einfacher als checked( $theme_options['whatever_option'] )oder checked( 'some_value' == $theme_options['whatever_option'] ). Ich weiß nicht, wie es prägnanter wird?
Chip Bennett

1

Präfixfunktion und Variablennamen

Plugins sollten allen Optionen, benutzerdefinierten Funktionen, benutzerdefinierten Variablen und benutzerdefinierten Konstanten plugin-slug voranstellen.

Themen sollten allen Optionen, benutzerdefinierten Funktionen, benutzerdefinierten Variablen und benutzerdefinierten Konstanten Theme-Slug voranstellen.


Ich würde dies auf alle Klassennamen sowie Namen von benutzerdefinierten Objekten wie post_types und Taxonomien ausweiten.
Mfields


0

Fügen Sie den entsprechenden Abschnitten des Admin-Menüs Einstellungsseiten hinzu

Plugins sollten die add_options_page()Funktion verwenden, um die Plugin-Einstellungsseite zum SettingsMenü add_menu_page()hinzuzufügen , anstatt ein Menü der obersten Ebene hinzuzufügen.

Themen sollten die add_theme_page()Funktion verwenden, um die Seite mit den Themaeinstellungen zum AppearanceMenü add_menu_page()hinzuzufügen , anstatt ein Menü der obersten Ebene hinzuzufügen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.