Datenbereinigung: Best Practices mit Codebeispielen

15

Ich versuche, die Datenbereinigung (nicht die Datenvalidierung) zu verstehen, um sichere Designs für WordPress schreiben zu können. Ich habe im Internet nach einem umfassenden Leitfaden für Themenentwickler gesucht, in dem Best Practices aufgeführt sind. Es gab einige Ressourcen, auf die ich gestoßen bin, einschließlich der Codex-Seite mit dem Titel Datenüberprüfung, obwohl keine für mich nützlich war. Auf der Codex-Seite werden die verfügbaren Desinfektionsfunktionen, ihre Verwendung und ihre Funktionsweise aufgelistet, es wird jedoch nicht erläutert, warum Sie eine Funktion übereinander verwenden oder in welcher Situation Sie eine bestimmte Desinfektionsfunktion verwenden würden. Der Zweck dieses Beitrags besteht darin, alle aufzufordern, Beispiele für fehlerhaften / nicht bereinigten Code beizutragen und anzugeben, wie er für eine ordnungsgemäße Bereinigung umgeschrieben werden soll. Dies kann allgemeiner Code zur Bereinigung des Posttitels oder des Post-Thumnails-Quellcodes oder komplexerer Codes zur Bereinigung von sein$_POST Daten für Ajax-Anfragen.

Außerdem möchte ich wissen, ob WordPress-Funktionen zum Hinzufügen / Aktualisieren der Datenbank (z. B. die im folgenden Codeblock genannten) die Desinfektionsarbeiten automatisch für Sie erledigen. Wenn ja, gibt es dann Ausnahmen, wenn Sie zusätzliche Maßnahmen ergreifen würden, um an diese WordPress-Funktionen gesendete Daten zu bereinigen?

add_user_meta
update_user_meta
add_post_meta
update_post_meta
//just to name a few

Muss die Bereinigung auch anders erfolgen, wenn HTML in PHP als Inline-HTML in PHP wiedergegeben wird? Um klarer zu sein, was ich frage, hier ist der Code:

<?php echo '<div class="some-div ' . $another_class . '" data-id="' . $id . '" >' . $text . '</div>'; ?>

<div class="some-div <?php echo $another_class; ?>" data-id="<?php echo $id; ?>"><?php echo $text; ?></div>

Beide obigen Aussagen erreichen dasselbe. Aber müssen sie anders beschenkt werden?

John
quelle
1
Es könnte helfen, wenn wir wissen, was Sie versuchen zu sanieren. Themen dienen der Präsentation von Daten. Sie müssen nur die Daten bereinigen, die der Benutzer Ihnen übermittelt. Die Übermittlung erfolgt normalerweise über Plugins.
EAMann
@EAMann Escaping-Funktionen wie esc_attr, esc_html usw. sind so aufgebaut, dass sie der Ausgabe entgehen. Korrigiere mich, wenn ich falsch liege. Das Präsentieren von Daten bedeutet, dass Sie Daten ausgeben. Daher ist ein Escape-Befehl auch für Themen erforderlich. Andernfalls wären die ESC-Funktionen nicht erforderlich gewesen. Ich möchte die Bereinigung in WordPress-Designs als Ganzes verstehen und mich nicht auf die Bereinigung von ein oder zwei Codefragmenten beschränken.
John
"Das Präsentieren von Daten bedeutet, dass Sie Daten ausgeben, so dass auch innerhalb von Themen ein Escape-Befehl erforderlich ist" - nein. Auch hier müssen Sie nur Daten entkommen, denen Sie nicht vertrauen
onetrickpony
@OneTrickPony Für mich wird es klarer. Nur um absolut sicherzugehen, dass ich das verstehe - ich würde den Kommentarinhalt, aber nicht die Kommentar-ID oder die Beitrags-ID umgehen, wenn ich diese in HTML ausgeben würde. Es tut mir leid, Sie wirklich mit Fragen nacheinander zu nerven.
John
2
"Sie müssen nur Daten entkommen, denen Sie nicht vertrauen" - da stimme ich voll und ganz zu. Das einzige, was ich hinzufügen möchte, ist, dass Sie niemals Daten vertrauen sollten;)
Ian Dunn

Antworten:

12

Diese Codex-Seite erklärt es ziemlich gut, denke ich.

Die wichtigste und am häufigsten verwendete Funktion ist wahrscheinlich esc_attr. Nehmen Sie dieses Beispiel:

<a href="<?php print $author_url; ?>" title="<?php print $author_name; ?>"> 
  <?php print $author_name; ?>
</a>

Wenn $author_nameein "Zeichen enthalten ist, wird das Attribut geschlossen, und wenn dieses Zeichen gefolgt wird, kann onclick="do_something();"es schlimmer werden :)

Dadurch wird print esc_attr($author_name)sichergestellt, dass solche Zeichen codiert werden und der Browser keine Aktionen ausführt, die er nicht ausführen soll.

Es gibt einen Fall, in dem Sie ihn nicht benötigen: Wenn Sie eine Zahl erwarten, können Sie die Eingabedaten einfach in eine Ganzzahl umwandeln. Beispiel:

print (int)$_POST['some_number'];


Die Meta * -Funktionen, die Sie dort aufgelistet haben, kümmern sich bereits darum, die Eingabe für den Datenbankspeicher zu bereinigen, sodass Sie sich darüber keine Gedanken machen müssen.

Die wpdb->prepare()Methode muss verwendet werden, wenn Sie die DB-Abfragen selbst durchführen. Hier ist ein Beispiel:

$sql = $wpdb->prepare('
    UPDATE wp_posts SET post_title = %s WHERE ID = %d', 
      $_POST['title'], $_POST['id']);

$wpdb->query($sql);

Die Schlüsselwörter %sund %dwerden durch Ihre bereinigten $ _POST-Werte ersetzt.

Ein sehr häufiger Fehler, den ich in vielen Plugins im WP.org-Repository sehe, besteht darin, eine bereits vorbereitete (und schlecht vorbereitete) Abfrage an das Repository zu übergeben.

$wpdb->prepare('UPDATE wp_posts SET post_title = \''.$_POST['title'].' WHERE ...

Mach das nicht :)

Muss die Bereinigung auch anders erfolgen, wenn HTML in PHP als Inline-HTML in PHP wiedergegeben wird?

Beide obigen Aussagen erreichen dasselbe. Aber müssen sie anders beschenkt werden?

Nein.

ein Trickpony
quelle
Danke für eure Eingaben. Ihre Erklärung macht die Dinge für mich klarer.
John
Eine kleine Klarstellung ist weiterhin erforderlich. Wenn ich einen String in eine Variable (zB $ var = 'string';) in PHP übergebe und ihn als HTML-Attribut zurückgebe, muss ich $ var beim Zurückgeben bereinigen. Oder ist die Bereinigung nur erforderlich, wenn ich den Wert $ var aus der Datenbank gezogen habe.
John
Bei der Wiedergabe auf dem Bildschirm, auf die eine oder andere Weise
onetrickpony
Wenn ich Sie also richtig verstanden habe, ob ich die Zeichenfolge im PHP-Code an $ var übergeben oder Daten aus der Datenbank abgerufen und an $ var übergeben habe, muss ich beide die Ausgabe esc. Richtig?
John
Ja, wenn diese Daten Benutzereingaben sind, wie zum Beispiel der Name des Autors eines Kommentars. Wenn Sie mit "die Zeichenkette in $ var innerhalb des PHP-Codes übergeben" meinen, dass Sie einer Variablen einen Wert zugewiesen haben, den Sie kennen, dann müssen Sie diese Variable natürlich nicht
bereinigen