it-swarm.com.de

Entziehen von Anführungszeichen aus Shortcode-Attributen

Ich habe versucht herauszufinden, wie man Anführungszeichen (einfach und doppelt) aus Shortcode-Attributen entfernt.

Grundsätzlich wird der Inhalt vom Benutzer geschrieben und kann daher möglicherweise "und" Anführungszeichen enthalten. Das Problem ist, dass mit "Anführungszeichen das Shortcode-Attribut nicht mehr funktioniert, z.

attibute = "hier Text mit" Anführungszeichen ", damit das Attribut gestoppt wird ...."

Anstatt die gesamte Zeichenfolge abzurufen, wird bei dem zweiten Paar von Anführungszeichen angehalten.

Jetzt weiß ich, dass es möglich sein könnte, es mit einfachen Anführungszeichen einzurichten, aber dasselbe Problem bleibt bestehen, wenn ein Benutzer einfache Anführungszeichen im Text verwendet.

Ich habe mir eine Vielzahl von PHP/WP-Auflösungen angesehen, aber ich kann scheinbar keine zum Laufen bringen, z. B. esc_html, htmlspecialchars, htmlentities.

Vielleicht habe ich es falsch eingestellt oder tippe nicht an der richtigen Stelle auf die Kodierung.

Dies ist derzeit das, was ich (ohne Kodierung) als Shortcode verwende (etwas gekürzt)

function aps_person_schema_shortcode( $atts, $content = null)   {

extract( shortcode_atts( array(     
            'aps_person_description' => ''
        ), $atts
    )
);

$aps_person_return = '<div class="aps_person_container aps_container">';
$aps_person_return .= '<p class="aps_person_description" itemprop="description">' . $aps_person_description . '</p>';
$aps_person_return .= '</div>';

return $aps_person_return;

}
add_shortcode('aps_person', 'aps_person_schema_shortcode');

Ich habe versucht, nach dem Auszug Array Dinge wie hinzuzufügen

$aps_person_description = esc_html($atts['aps_person_description']); 

da das Attribut jedoch bereits fehlerhaft ist (print_r zeigt an, dass die Zeichenfolge nach dem Anführungszeichen für jedes Wort in ein Array-Element getrennt ist), funktioniert es dort nicht, die Zeichenfolge zu maskieren.

Versuchte es vor dem Array und es funktioniert auch nicht Ich bekomme einen Hinweis: Undefinierter Index

Wie gehen Sie zur Verdeutlichung vor, um Benutzereingaben für Shortcode-Attributdaten zu bereinigen?

4
Apina

Anscheinend arbeiten Sie am falschen Ende.

Versuchen Sie, die Benutzereingabe zu bereinigen, z. B. mit sanitize_text_field , nicht mit der Shortcode-Ausgabe.

2
tfrommen

Es stellte sich heraus, dass das WordPress-Shortcode-System die Funktion shortcode_parse_atts($text); verwendet, um einen Shortcode-Eintrag zu analysieren, um die Namen und Werte der Attribute abzurufen und paarweise im Array $atts zu speichern, das dann an die Shortcode-Funktion übergeben wird. In deinem Fall fügst du also folgende Escape-Aktionen in die Shortcode-Funktion ein:

$aps_person_description = esc_html($atts['aps_person_description']); 

funktioniert nicht, da shortcode_parse_atts() die Namen und Werte der Attribute bereits abgerufen hat und möglicherweise Anführungszeichen in den Attributwerten falsch interpretiert hat.

Um genauer hinzuschauen, benutze function shortcode_parse_atts() dieses Regex-Muster:

/(\w+)\s*=\s*"([^"]*)"(?:\s|$)|(\w+)\s*=\s*\'([^\']*)\'(?:\s|$)|(\w+)\s*=\s*([^\s\'"]+)(?:\s|$)|"([^"]*)"(?:\s|$)|(\S+)(?:\s|$)/

so erkennen Sie die Namen und Werte von Attributen in den folgenden Formaten:

1. attr1="value1"
2. attr2='value2'
3. attr3=value3
4. "value4"
5. value5

Wenn ein Benutzer also Werte in Anführungszeichen setzt, kann dies leicht schief gehen. Zum Beispiel:

[my_shortcode dog='Santa's Little Helper' /]    
// $attr is Array ( [0] => dog='Santa's [1] => Little [2] => Helper' )
// should be Array ( [dog] => Santa's Little Helper )

Das Desinfizieren nach dem Parsen ist offensichtlich zu spät. Was ist mit dem Desinfizieren vor dem Parsen? Wir müssen den gesamten Eintrag bereinigen, da wir noch keine Attributwerte zum Bearbeiten haben. Dies führt aber auch zu Problemen, zum Beispiel:

html_entities("[my_shortcode dog='Santa's Little Helper' /]", ENT_QUOTES);
// now entry is [my_shortcode dog=&#039;Santa&#039;s Little Helper&#039; /]
// after parsing: 
Array
(
    [dog] => &#039;Santa&#039;s
    [0] => Little
    [1] => Helper&#039;
)

Das Paradoxe ist: Um sicherzustellen, dass die Parsing-Engine korrekt analysiert, müssen Sie die Attributwerte bereinigen. Dazu müssen Sie jedoch zuerst die Parsing-Engine ausführen, um die Werte abzurufen.

Zusammenfassend lässt sich sagen, dass der vernünftige Weg, um sicherzustellen, dass alles in Ordnung ist, darin besteht, sicherzustellen, dass Benutzer Attribute in geeigneten Formaten eingeben. Sobald Benutzer schlecht formatierte Attribute gepostet haben, wird dies große Kopfschmerzen verursachen. Meine Erfahrung ist es, $content zu verwenden. In deinem Fall würde ich aps_person_description in den $content einfügen, es könnte so aussehen:

[my_shortcode]some text here with "quotes" so it stops the attribute....[/my_shortcode]

und Anführungszeichen sind weniger ein Problem.

6
samluthebrave

Sie können esc_attr() auschecken

Kodiert die Zeichen <,>, &, "und '(kleiner als, größer als, kaufmännisches Und, doppelte Anführungszeichen und einfache Anführungszeichen). Kodiert Entitäten niemals doppelt.

http://codex.wordpress.org/Function_Reference/esc_attr

1
birgire