Bereinigen Sie den Inhalt von wp_editor

8

Ich habe einen benutzerdefinierten Beitragstyp erstellt, in dem wir einen Standard-Textbereich / Tinymce finden, der von generiert wurde, wp_editor()und ich habe ein Problem mit dem Speicherteil.

Wenn ich den Inhalt mit folgendem Code speichere:

update_post_meta( $post_id, $prefix.'content', $_POST['content'] );

Alles funktioniert gut, aber es gibt keine Sicherheit (Desinfektion, Validierung usw.)

Wenn ich den Inhalt mit folgendem Code speichere:

update_post_meta( $post_id, $prefix.'content', sanitize_text_field($_POST['content']) );

Ich löse das Sicherheitsproblem, aber ich verliere den gesamten Stil, die Medien usw. im Inhalt.

Was könnte ein guter Weg sein, um den Inhalt mit dem gesamten angewendeten Stil, den eingelegten Medien, aber einschließlich einer Bereinigung zu speichern?

Ich habe ein bisschen darüber gelesen, wp_kses()aber ich weiß nicht, wie ich einen guten Filter anwenden kann. (Allgemeine Tags zulassen, welche sollte ich blockieren? Usw.)

Gio
quelle
Im Allgemeinen wird eine zufällige Anwendung der Funktion mit "sanitize" im Namen möglicherweise nicht bereinigt und trägt möglicherweise nicht zur Sicherheit bei. Es ist unmöglich, über Sicherheit ohne vollständigen Kontext zu sprechen, aber im Allgemeinen sollten Sie wahrscheinlich einen aus der wp_ksesFamilie verwenden.
Mark Kaplun
Versuchen Sie es mit der Funktion wp_slash ($ value), bevor Sie den Wert konvertieren.
Ravi Patel

Antworten:

4

Kurz gesagt: Es hängt von Ihrem Kontext ab, welche Daten sich in Ihrem Editor befinden.

wp_kses()ist sehr hilfreich und Sie können Ihr benutzerdefiniertes zulässiges HTML definieren. Alternativ können Sie die Standardfunktionen wie wp_kses_postoder verwenden wp_kses_data. Diese Funktionen sind hilfreich, um sicherzustellen, dass vom Benutzer empfangenes HTML nur Elemente auf der weißen Liste enthält. Siehe https://codex.wordpress.org/Data_Validation#HTML.2FXML_Fragments

WordPress definiert viel mehr Funktionen zum Bereinigen der Eingabe, siehe https://codex.wordpress.org/Validating_Sanitizing_and_Escaping_User_Data und https://codex.wordpress.org/Data_Validation Diese Seiten sind wirklich hilfreich.

In Ihrem Kontext sollte die wp_kses_postFunktion jedoch die richtige Wahl sein.

bueltge
quelle
2

Versuchen

//save this in the database
$content=sanitize_text_field( htmlentities($_POST['content']) );

//to display, use
html_entity_decode($content);
  1. htmlentities() konvertiert alle Zeichen mit HTML-Zeichenentitätsäquivalenten in ihre Entsprechungen.
  2. sanitize_text_field()prüft dann auf ungültige UTF-8-Zeichen und entfernt sie. Dies kann nun in der Datenbank gespeichert werden.
  3. html_entity_decode() konvertiert HTML-Entitäten in ihre HTML-Tag-Entsprechungen
Melch Wanga
quelle
2
Bitte erläutern Sie, warum das Originalposter diese Funktionen verwenden sollte.
Max Yudin
Wenn Sie wp_editor () verwenden und $ _POST ['youreditor'] mit einer Reihe weiterer Optionen in Ihrer eigenen Datenstruktur speichern möchten, ist dies der Weg. Ich habe auch wp_kses_post () hinzugefügt
Nissar
1

Sie könnten so etwas tun:

/ **
 * Die meisten 'Post'-HTML-Dateien akzeptieren <textarea> selbst.
 * @link https://codex.wordpress.org/Function_Reference/wp_kses_allowed_html
 * /
$ allow_html = wp_kses_allowed_html ('post');

// '<textarea>' Tag entfernen
unset ($ allow_html ['textarea']);

/ **
 * wp_kses_allowed_html gibt die falschen Werte für wp_kses zurück.
 * muss "true" ändern -> "array ()"
 * /
array_walk_recursive (
    $ allow_html,
    Funktion (& $ Wert) {
        if (is_bool ($ value)) {
            $ value = array ();
        }}
    }}
);
// Desinfektion ausführen.
$ value = wp_kses ($ value, $ allow_html);

@fuxia: wie OP schrieb:
"Ich habe ein bisschen über wp_kses () gelesen, aber ich weiß nicht, wie ich einen guten Filter anwenden kann. (Erlaube allgemeine Tags, welche sollte ich blockieren? etc ..)"

wp_kses führt Folgendes aus:
"Diese Funktion stellt sicher, dass nur die zulässigen HTML-Elementnamen, Attributnamen und Attributwerte sowie nur vernünftige HTML-Entitäten in $ string vorkommen. Sie müssen alle Schrägstriche aus den magischen Anführungszeichen von PHP entfernen, bevor Sie diese Funktion aufrufen. ""
https://codex.wordpress.org/Function_Reference/wp_kses

Mein Code wird wp_ksesmit "Allgemeine Tags zulassen" verwendet. Was sind die häufigsten Tags? Die Liste zum Lesen unter dem angegebenen Link. Es ist eine lange Liste, deshalb habe ich sie hier nicht eingefügt.
https://codex.wordpress.org/Function_Reference/wp_kses_allowed_html

Ich denke, Textarea selbst sollte in Textarea nicht erlaubt sein.

@bueltge
wp_kses_post macht dasselbe, außer dass das Tag '<textarea>' zugelassen wird, was - glaube ich - nicht sein sollte.
https://core.trac.wordpress.org/browser/tags/4.9.8/src/wp-includes/kses.php#L1575

Funktion wp_kses_post ($ data) {
    return wp_kses ($ data, 'post');
}}
Joe
quelle
0

wp_slash Weitere Informationen.

update_post_meta( $post_id, $prefix.'content',wp_slash($_POST['content']) );
Ravi Patel
quelle
Dies sollte nicht verwendet werden, um Daten zu maskieren, die direkt in eine SQL-Abfrage gelangen. Von Wordpress.
Bilimokur