Perbedaan antara esc_url () dan esc_url_raw ()

9

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

Saya bingung kapan sebaiknya keduanya digunakan.

Dengan asumsi saya memiliki URL ini:, http://site.com/?getsomejavascript=1yang secara javascript dihasilkan secara dinamis:

  • jika saya memasukkan skrip dengan esc_url(add_query_arg('apples', 420)), saya dapatkan http://site.com/?getsomejavascript=1&apples=420dan itu rusak karena #038;referensi tersebut

  • jika saya menggunakan esc_url_raw(add_query_arg('apples', 420))saya mendapatkan URL yang benar:http://site.com/?getsomejavascript=1&apples=420

tetapi dalam dokumentasi saya menemukan bahwa esc_url_raw seharusnya hanya digunakan untuk menghindari URL yang dimasukkan ke dalam basis data ...

onetrickpony
sumber

Jawaban:

10

Dari entri Codex untuk Validasi Data: URL :

esc_url( $url, (array) $protocols = null ) (sejak 2,8)

Selalu gunakan esc_url saat membersihkan URL (dalam simpul teks, simpul atribut atau tempat lain). Tolak URL yang tidak memiliki salah satu protokol yang masuk daftar putih yang disediakan (default ke http, https, ftp, ftps, mailto, berita, irc, gopher, nntp, feed, dan telnet), menghilangkan karakter yang tidak valid, dan menghilangkan karakter berbahaya. Tidak digunakan lagi sejak 3.0: clean_url () Fungsi ini menyandikan karakter sebagai entitas HTML: gunakan saat membuat dokumen (X) HTML atau XML. Mengkodekan ampersand (&) dan tanda kutip tunggal (') sebagai referensi entitas numerik (&,').

esc_url_raw( $url, (array) $protocols = null ) (sejak 2,8)

Untuk memasukkan URL ke dalam basis data. Fungsi ini tidak menyandikan karakter sebagai entitas HTML: gunakan ketika menyimpan URL atau dalam kasus lain di mana Anda memerlukan URL yang tidak dikodekan. Fungsionalitas ini dapat direplikasi dalam fungsi clean_url yang lama dengan menetapkan $ context ke db.

Jadi, perbedaan utama tampaknya:

  1. esc_url()mengkodekan entitas HTML, sementara esc_url_raw()tidak
  2. esc_url()ditujukan untuk output , sementara esc_url_raw()ditujukan untuk penyimpanan basis data

EDIT:

Karena Anda salah satu pengkodean (atau menyimpan / menyimpan secara terpisah) URL sebenarnya dari string kueri, dan kemudian menambahkan string kueri melalui [add_query_arg()][2], mungkinkah lebih baik melepaskan diri dari string kueri yang ditambahkan melalui esc_js(), daripada esc_url()?

Sebagai contoh:

add_query_arg( esc_js( 'apples' ), esc_js( '420' ), $myurl )
Chip Bennett
sumber
2
ok, tetapi esc_url()tidak berfungsi dengan baik ketika Anda memiliki argumen permintaan di URL yang ingin Anda
hasilkan
Bagaimana dengan menggunakan esc_js()untuk melarikan diri hanya dengan data yang ditambahkan melalui add_query_arg()? Lihat edit dalam jawaban, di atas.
Chip Bennett
Saya tidak mencobanya, tetapi itu tidak masuk akal :) baik esc_js ('apel') atau 'apel' akan kembali apples. Masalahnya ada di add_query_arg ketika bergabung dengan 'apel' dengan argumen lain dengan&
onetrickpony
Lalu, jika datanya tepercaya (yaitu statis), mengapa harus melarikan diri?
Chip Bennett
Saya tidak sepenuhnya yakin aman untuk tidak menghindarinya. Saya pada dasarnya termasuk skrip menggunakan sesuatu seperti<script type="text/javascript" src="<?= $_SERVER['REQUEST_URI'] ?>'/?javascriptcode=1"></script>
onetrickpony