Typische wp_kses $ erlaubt

9

Ich habe ein benutzerdefiniertes Post-Textfeld, mit dem ich bereinigen möchte, wp_ksesbevor ich mein Post-Meta aktualisiere.

Ich habe nach Beispielen für allgemeine $allowedEinstellungen gesucht , aber ich habe nur dieses Beispiel gesehen:

$allowed = array(  
        'a' => array( // on allow a tags  
            'href' => array() // and those anchors can only have href attribute  
        )  
    );  

Was ist eine typische wp_kses $allowedEinstellung? Kann jemand ein Beispiel dafür geben, wonach er normalerweise filtert?

redconservatory
quelle
Diese Frage ist für die Website nicht relevant, da es mehr als eine richtige Antwort gibt. Wenn Sie den Umfang der Frage einschränken, stellen Sie einen Anwendungsfall vor und bitten Sie jemanden, Ihnen Dinge mitzuteilen, die Sie einbeziehen sollten, die viel besser wären.
Mor7ifer
Ich möchte ein Rich-Text-Feld haben, in dem der Benutzer einfach normalen Text, Fettdruck, Links, Kursivschrift
eingeben kann

Antworten:

7

Ich würde der von @JaredCobb veröffentlichten Lösung nicht zustimmen, sie wp_kses()ist viel flexibler als die von ihm vorgestellte Methode. Es kann unerwünschte Attribute aus Tags entfernen, ohne die Tags selbst zu zerstören. Wenn der Benutzer beispielsweise eingibt <strong class='foo'>, wird er wp_kses()zurückgegeben, <strong>wenn Sie die Klasse nicht zugelassen haben, während strip_tags()die <strong>vollständig entfernt wird.

@redconservatory: Folgende Attribute möchten Sie verwenden:

$args = array(
    //formatting
    'strong' => array(),
    'em'     => array(),
    'b'      => array(),
    'i'      => array(),

    //links
    'a'     => array(
        'href' => array()
    )
);

Dies ermöglicht Fett- und Kursivschrift ohne Attribute sowie Ankertags mit hrefAttributen ... und sonst nichts. Es verwendet das Whitelisting-Prinzip, das @jaredcobb zu Recht als den besseren Weg hierher bezeichnet.

mor7ifer
quelle
Können Sie Strip-Tags nicht mitteilen, welche Tags zulässig sind? php.net/manual/en/function.strip-tags.php
redconservatory
Obwohl ich immer noch sehen kann, wie besser wp_kses ist, jetzt wo ich sehen kann, wie es unerwünschte Klassen entfernt ...
redconservatory
Ich habe es wahrscheinlich nicht klar erklärt ... Aber ja, wp_kseserlaubt mehr Kontrolle als die nativen PHP-Optionen. Ich glaube, das habe ich gesagt. Ich habe auch das Wort "Attribute" verwendet. Ich sagte, es hängt von Ihrem Anwendungsfall ab. Jemand, der versucht, seine Daten vor allen Tags zu schützen, ist meiner Meinung nach besser dran, wenn Sie strip_tags verwenden, aber es ist mehr meine Präferenz als alles andere. Prost.
Jared Cobb
7

Ich würde mit dem gleichen $allowedtagsArray beginnen, das WordPress für ihre Kommentare verwendet. Sie finden ihr Array in der [wordpress directory]/wp-includes/kses.phpDatei. Diese scheinen mir vernünftige Standardeinstellungen zu sein und ein guter Ausgangspunkt. Hier ist ihre Anordnung ...

$allowedtags = array(
    'a' => array(
        'href' => true,
        'title' => true,
    ),
    'abbr' => array(
        'title' => true,
    ),
    'acronym' => array(
        'title' => true,
    ),
    'b' => array(),
    'blockquote' => array(
        'cite' => true,
    ),
    'cite' => array(),
    'code' => array(),
    'del' => array(
        'datetime' => true,
    ),
    'em' => array(),
    'i' => array(),
    'q' => array(
        'cite' => true,
    ),
    'strike' => array(),
    'strong' => array(),
);

Ich würde nicht von PHP verwenden , strip_tagsum als Ersatz wp_kses.

Sie sollten niemals strip_tags verwenden, um den Inhalt eines unbekannten Benutzers zu filtern!

Ich habe ein kurzes Video erstellt, in dem erklärt wird, warum wp_kses () von WordPress aus Sicherheitsgründen besser ist als strip_tags () von PHP .

Mikemick
quelle
Hallo, was ist mit & nbps
Latheesh VM Villa
2

Ich habe es nur verwendet, wp_kseswenn ich speziell Attribute von HTML-Tags zulassen / filtern musste (zum Beispiel möchte ich, dass sie ein <image>Tag mit einem src=""Attribut haben dürfen, aber ich möchte nicht, dass sie es können, aber href=""oder style=""oder irgendetwas anderes auf dem Bild-Tag. In diesem Fall ist es wp_ksespraktisch, weil Sie (wie Sie in dem von Ihnen erstellten Beispiel sehen können) sehr spezifisch filtern können. Ich habe es jedoch selten verwendet, wp_ksesweil ich nur ein paar native PHPs finde Funktionen (unten) machen den Trick und sind leichter zu verstehen, wenn ich mir den Code einige Monate später ansehe.

Wenn Sie HTML-Tags vollständig entfernen möchten (außer vielleicht ein paar zulassen), verwende ich immer strip_tags. Sie können eine Reihe zulässiger Tags (wie <p> <br> <strong>) oder andere harmlose Tags, die Sie mögen, übergeben. Dadurch kann der Benutzer in der Lage sein zu haben einige Kontrolle über die Formatierung, wenn das für Ihren Anwendungsfall anwendbar ist. Ich mag es, strip_tagsweil es einen Whitelist- Ansatz zur Bereinigung Ihrer Daten erfordert. (Dies bedeutet, dass alles entfernt wird, außer was Sie explizit auf die Whitelist setzen).

Wenn Ihr Ziel darin besteht, ihnen das Einfügen von HTML in den Inhalt zu ermöglichen, Sie jedoch nur ihren Text bei der Eingabe anzeigen möchten (wie Codebeispiele), verwenden Sie htmlspecialchars. Dadurch werden HTML-Zeichen in ihre codierten Gegenstücke konvertiert, sodass Sie sie sicher auf der Seite ausgeben können.

Möglicherweise stoßen Sie auf Code, str_replaceder nach schlechten Tags wie oder oder was auch immer "sucht". Ich empfehle diesen Ansatz wirklich nicht, da für die Bereinigung von Daten ein Blacklist- Ansatz erforderlich ist und Sie ständig sicherstellen müssen, dass Ihre Blacklist auf dem neuesten Stand ist.

Zusammenfassend lässt sich sagen, dass es davon abhängt, wofür Ihre Metaboxen verwendet werden. Wenn Sie sich vor Eingaben von Benutzern schützen (die möglicherweise böswillig sind), würde ich strip_tagseinige der harmlosen Tags empfehlen und nur zulassen. Wenn Sie ein gutes Geschäftsmodell haben, um die Tags und spezifischen Attribute des Benutzerinhalts wirklich mikromanagen zu können , use wp_kses.

Jared Cobb
quelle
Tut nicht wp_kses()alles strip_tags()und noch mehr? Ich bin alles dafür, die Dinge einfach zu halten, aber ich denke auch, dass es ein Argument dafür gibt, niemanden "zu überraschen". wp_kses()ist "der Wordpress-Weg", und da wir Wordpress-Code schreiben, gibt es ein Argument, dass es wahrscheinlich die bessere Wahl ist. Wenn wir zu einem späteren Zeitpunkt bestimmte Tag / Attribut-Kombinationen auf die Whitelist setzen möchten, ist für die Verwendung wp_kses()von Anfang an kein Refactor erforderlich.
Rinogo
2

Los geht's. Dies funktioniert sowohl in WordPress als auch außerhalb von WordPress.

<?php

$str = '     I am <strong>stronger</strong> and cooler every single day <aaaaa>.    ';
echo orbisius_html_util::strip_tags($str);

/**
 * Util HTML class
 * @author Svetoslav Marinov (SLAVI) | http://orbisius.com
 */
class orbisius_html_util {
    /**
     * Uses WP's wp_kses to clear some of the html tags but allow some attribs
     * usage: orbisius_html_util::strip_tags($str);
     * uses WordPress' wp_kses()
     * @param str $buffer string buffer
     * @return str cleaned up text
     */
    public static function strip_tags($buffer) {
        static $default_attribs = array(
            'id' => array(),
            'class' => array(),
            'title' => array(),
            'style' => array(),
            'data' => array(),
            'data-mce-id' => array(),
            'data-mce-style' => array(),
            'data-mce-bogus' => array(),
        );

        $allowed_tags = array(
            'div'           => $default_attribs,
            'span'          => $default_attribs,
            'p'             => $default_attribs,
            'a'             => array_merge( $default_attribs, array(
                'href' => array(),
                'target' => array('_blank', '_top'),
            ) ),
            'u'             =>  $default_attribs,
            'i'             =>  $default_attribs,
            'q'             =>  $default_attribs,
            'b'             =>  $default_attribs,
            'ul'            => $default_attribs,
            'ol'            => $default_attribs,
            'li'            => $default_attribs,
            'br'            => $default_attribs,
            'hr'            => $default_attribs,
            'strong'        => $default_attribs,
            'blockquote'    => $default_attribs,
            'del'           => $default_attribs,
            'strike'        => $default_attribs,
            'em'            => $default_attribs,
            'code'          => $default_attribs,
        );

        if (function_exists('wp_kses')) { // WP is here
            $buffer = wp_kses($buffer, $allowed_tags);
        } else {
            $tags = array();

            foreach (array_keys($allowed_tags) as $tag) {
                $tags[] = "<$tag>";
            }

            $buffer = strip_tags($buffer, join('', $tags));
        }

        $buffer = trim($buffer);

        return $buffer;
    }
}
Svetoslav Marinov
quelle
Hallo, Herr Svetoslav, ist das heute noch sicher? Ich habe nach einer einfachen, aber sicheren Möglichkeit gesucht, Benutzereingaben in mein Backoffice zu bereinigen (kein Wordpress). Ich möchte nur die Verwendung grundlegender HTML-Formatierungen zulassen, wie sie in Ihrem Code enthalten sind, <b>, <I>, < u>. Glaubst du, ich kann dies als strip_tags ($ _ POST ['myDoc']) verwenden oder denkst du, ich sollte etwas anderes tun, um sicher zu gehen? Danke für die Hilfe!
Pluda
Hallo, benutze meinen Code. Es prüft, ob es im WordPress-Kontext ausgeführt wird, verwendet die WP-Funktion, andernfalls wird auf php strip_tags zurückgegriffen. Es ist auch besser, $ _REQUEST anstelle von $ _POST zu verwenden, da Sie irgendwann Daten als GET-Parameter übergeben können.
Svetoslav Marinov
danke für die Antwort :-). Ich habe jetzt Probleme mit einem Problem ... Wenn ich formatierten HTML-Code oder beispielsweise Code aus erhabenem Text 3 einfüge, fehlt der größte Teil des Textes, und es muss versteckter formatierter Code vorhanden sein, der das Skript beschädigt.
Pluda
könnte ein utf8-Codierungsproblem sein
Svetoslav Marinov
Es kann sein, dass ich HTML bereinige, wie ich in der obigen Antwort gepostet habe, nach \ n, \ r usw. suche, aber das Problem ist immer noch da :-(. Das Bereinigen eingefügter Daten kann ein großes Problem sein, einige Vor Jahren habe ich Copy Paste für Textedit verwendet, um die kopierten Zeichenfolgen zu bereinigen, aber ich kann nicht erwarten, dass meine Benutzer dasselbe tun würden.
Pluda
0

@ Swetoslav Marinov

Ich habe diesen Code direkt nach $ buffer = trim ($ buffer) hinzugefügt.

    $string_limpa = array(
                '<div><p><\/div>' => '<br>',
                '<div><br><\/div>'=> '<br>',
                '<div align="left"><br><\/div>' => '<br>',
                '<div align="center"><br><\/div>' => '<br>',
                '<div align="right"><br><\/div>' => '<br>',
                '<div style="text-align: left;"><br><\/div>' => '<br>',
                '<div style="text-align: center;"><br><\/div>' => '<br>',
                '<div style="text-align: right;"><br><\/div>' => '<br>',
                '<div style="text-align: justify;"><br><\/div>' => '<br>',
                'class="Apple-style-span"' => '<br>',
                '<p><br></p>' => '<br>',
                '<p><b></p>' => '<br>',
                '<p><i></p>' => '<br>',
                '<p><u></p>' => '<br>',
                '\r' => '<br>',
                '\n' => '<br>',
                '\t' => ' ',
                '\0' => ' ',
                '\x0B' => '<br>',
                '<p style="text-align: center;"><br></p>' => '<br>'
            );
    return strtr($buffer, $string_limpa);

Um zu versuchen, HTML zu bereinigen und zu vermeiden, dass eingefügte versteckte Zeichen den Code beschädigen, funktioniert dies nicht. Es bereinigt das HTML, aber versteckte Zeichen bleiben weiterhin erhalten.

Pluda
quelle