Unterschied zwischen esc_url () und esc_url_raw ()

9

http://core.trac.wordpress.org/browser/trunk/wp-includes/formatting.php#L2239

Ich bin verwirrt darüber, wann einer von beiden verwendet werden soll.

Angenommen, ich habe diese URL : http://site.com/?getsomejavascript=1, die dynamisch generiertes Javascript ist:

  • Wenn ich das Skript mit einbeziehe esc_url(add_query_arg('apples', 420)), bekomme ich http://site.com/?getsomejavascript=1&apples=420und es bricht aufgrund dieser #038;Referenzen

  • Wenn ich benutze, esc_url_raw(add_query_arg('apples', 420))bekomme ich die richtige URL:http://site.com/?getsomejavascript=1&apples=420

aber in der Dokumentation finde ich heraus, dass esc_url_raw nur verwendet werden sollte, um in die Datenbank eingefügte URLs zu umgehen ...

Onetrickpony
quelle

Antworten:

10

Aus dem Codex-Eintrag für die Datenvalidierung: URLs :

esc_url( $url, (array) $protocols = null ) (seit 2.8)

Verwenden Sie immer esc_url, wenn Sie URLs bereinigen (in Textknoten, Attributknoten oder anderswo). Lehnt URLs ab, die nicht über eines der bereitgestellten Whitelist-Protokolle verfügen (standardmäßig http, https, ftp, ftps, mailto, news, irc, gopher, nntp, feed und telnet), entfernt ungültige Zeichen und entfernt gefährliche Zeichen. Veraltet seit 3.0: clean_url () Diese Funktion codiert Zeichen als HTML-Entitäten: Verwenden Sie sie beim Generieren eines (X) HTML- oder XML-Dokuments. Codiert kaufmännisches Und (&) und einfache Anführungszeichen (') als numerische Entitätsreferenzen (&,').

esc_url_raw( $url, (array) $protocols = null ) (seit 2.8)

Zum Einfügen einer URL in die Datenbank. Diese Funktion codiert keine Zeichen als HTML-Entitäten: Verwenden Sie sie beim Speichern einer URL oder in anderen Fällen, in denen Sie die nicht codierte URL benötigen. Diese Funktionalität kann in der alten Funktion clean_url repliziert werden, indem $ context auf db gesetzt wird.

Die Hauptunterschiede scheinen also zu sein:

  1. esc_url()codiert HTML-Entitäten, esc_url_raw()nicht jedoch
  2. esc_url()ist für die Ausgabe vorgesehen , während esc_url_raw()es für die Datenbankspeicherung vorgesehen ist

BEARBEITEN:

Da Sie entweder die tatsächliche URL aus der Abfragezeichenfolge fest codieren (oder separat speichern / speichern) und dann die Abfragezeichenfolge über anhängen [add_query_arg()][2], ist es möglicherweise besser, die angehängte Abfragezeichenfolge über zu esc_js()maskieren, als esc_url()?

Zum Beispiel:

add_query_arg( esc_js( 'apples' ), esc_js( '420' ), $myurl )
Chip Bennett
quelle
2
ok, aber das esc_url()funktioniert nicht richtig, wenn Sie Abfrageargumente in einer URL haben, die Sie ausgeben
möchten
Was ist mit der Verwendung esc_js(), um nur den Daten zu entkommen, die über hinzugefügt wurden add_query_arg()? Siehe oben in Antwort bearbeiten.
Chip Bennett
Ich habe es nicht ausprobiert, aber das macht keinen Sinn :) Sowohl esc_js ('Äpfel') als auch 'Äpfel' werden zurückkehren apples. Das Problem ist in add_query_arg, wenn 'Äpfel' mit anderen Argumenten mit&
onetrickpony
Wenn die Daten dann vertrauenswürdig sind (dh statisch), warum überhaupt entkommen?
Chip Bennett
Ich bin mir nicht ganz sicher, ob es sicher ist, ihm nicht zu entkommen. Ich schließe im Grunde Skript mit so etwas wie<script type="text/javascript" src="<?= $_SERVER['REQUEST_URI'] ?>'/?javascriptcode=1"></script>
onetrickpony