Wie kann verhindert werden, dass beim Speichern von HTML-Code in einem Optionswert ein Escapezeichen entsteht?


9

Ich habe eine Seite mit Themenoptionen, auf der der Benutzer bestimmte Optionen wie Facebook-Links usw. hinzufügen kann. Eine der Optionen ist für einen Anzeigencode, und wenn er als Option gespeichert wird, wird er immer wieder maskiert.

Was ist der beste Ansatz Code in einer Admin - Seite eingefügt zum Speichern <textarea>verwenden update_option( 'sidebar_code', $_POST['sidebar_code'] );?

Antworten:


8
stripslashes(wp_filter_post_kses(addslashes($_POST['sidebar_code'])));

Sie sollten jedoch wissen, dass der kses-Filter nicht 100% sicher ist.


2
Was meinst du mit nicht 100% sicher?
Amit

Ich meine, jemand könnte Ihre Site immer noch XSS, wenn er wirklich gut darin ist. Wenn ich mich nicht irre, hat der letzte wp-Patch eine xss-Schwachstelle in den kses-Funktionen
behoben

kses entfernt alle zusätzlichen Klassen- und HTML-Attribute (z. B. class = "classname" width = "100"). Gibt es eine Möglichkeit, dies zu umgehen?
Talon

11

Ich habe einen anderen Ansatz gewählt. Ich habe meine Optionen mit HTML-Entitäten codiert und decodiert. Eine Sache, bei der ich mir nicht sicher bin, ist, ob dies eine böse Hintertür für Leute öffnet, durch die man kompromittierendes HTML durchfahren kann. Ich verlasse mich auf die Tatsache, dass sowieso nur Administratoren Themenoptionen bearbeiten, aber vielleicht bin ich naiv?

So sieht es aus, wenn ich eine Option speichere:

update_option('my_option', htmlentities(stripslashes($_REQUEST['my_option'])));

Und so sieht es aus, wenn ich eine Option abrufe:

html_entity_decode(get_option('my_option',htmlentities($my_default_value)));

2

Dies ist keine vollständige Antwort auf Ihre Frage, weist Sie jedoch möglicherweise in die richtige Richtung: Sie können versuchen <?php esc_textarea( $text ) ?>, wie im Codex hier beschrieben: http://codex.wordpress.org/Function_Reference/esc_textarea .

Meine eigenen Metabox-Textbereich-Snippets sehen folgendermaßen aus:

<?php 
  if ( $meta_box['type'] == "textarea" ) {
    $meta_box_value = esc_textarea( get_post_meta($post->ID, $meta_box['name'].'_value', true) );
    echo '<textarea class="meta-textarea" style="width: 100%;" cols="20" rows="2" name="' . $meta_box['name'] . '_value">' . $meta_box_value . '</textarea><br />';
  }
?>

Kommt darauf an, was du tust. esc_textarea konvertiert alle HTML-Codes in HTML-Entitätscodes, sodass Sie sie nicht mit einem Richtext-Bereich wie tinyMCE verwenden können.
Jake
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.