Mengapa saya harus menggunakan esc_url?

12

Hal ini membuat coding saya sulit. Codex Wordpress beralasan menggunakan esc_url dengan berbicara sedikit tentang keamanan. Tetapi apakah itu benar-benar sepadan dengan masalahnya?

Misalnya, apa manfaat keamanan praktis yang penting dengan menggunakan

<?php echo esc_url( home_url( '/' ) ); ?>

dari pada

<?php echo home_url() ?>

PS: Saya tidak berbicara tentang pengembangan tema, tetapi tentang situs tertentu.

IXN
sumber

Jawaban:

12

Jika Anda memeriksa dokumentasi tentang Validasi Data , berikut ini dikatakan tentang fungsi:

Selalu gunakan esc_url saat membersihkan URL (dalam simpul teks, simpul atribut atau tempat lain). Tolak URL yang tidak memiliki salah satu protokol daftar putih yang disediakan [...], menghilangkan karakter yang tidak valid, dan menghapus karakter berbahaya.

Itu dia - manfaat keamanan praktis. Protokol yang valid, tidak ada karakter keruh.

Jawaban tentang perlunya tegas ya . Menghindari output adalah praktik keamanan paling dasar.

Jarang
sumber
2
Dengan segala hormat, saya tidak dapat melihat bagaimana tautan rumah misalnya dapat menimbulkan risiko keamanan. Mungkin pedoman ini untuk pembuatan tema dan tidak berlaku untuk kode "pribadi"? Lagipula, mungkin lebih baik untuk meng-hardcode alamat rumah dan tautan lain dalam html dan tidak menggunakan php sama sekali jika ada risiko keamanan?
IXN
9
Jauh lebih produktif untuk menerapkan praktik keamanan secara konsisten dan universal, daripada berdebat jika masing-masing dan setiap kasus sepadan. :)
Rarst
7
Di sisi lain sumber daya yang disarankan oleh Codex menetapkan Peraturan No. 3: Trust WordPress . Ini tampaknya merekomendasikan terhadap oversanitizing fungsi inti wp seperti home_url(), jika digunakan dalam konteks yang tepat. Menurut rekomendasi ini, saya diharapkan home_urluntuk melakukan sanitasi sendiri.
Franco
3

well, semua input pengguna harus disanitasi ... Jika url yang Anda masukkan bukan input pengguna (mis. pengaturan situs oleh seseorang yang Anda percayai sepenuhnya, nilai-nilai yang di-hardcode) maka Anda dapat membebaskan diri dari esc-url.

tetapi jika saya bisa menyuntikkan url itu ke situs Anda, saya bisa dengan mudah menyuntikkan kode js, atau kode redirection ... atau bahkan kode sisi server dalam beberapa situasi.

ini dapat menyebabkan pembajakan sesi dan akun pengguna Anda dicuri dan opsi buruk lainnya.

Edit:

Dalam contoh Anda esc_url( home_url( '/' ) );
ini beroperasi pada nilai semi-hardcode! karena itu esc_urlbisa dihilangkan.
Yang mengatakan saya masih tidak melihat mengapa mengganggu perbedaan antara ketika ada ancaman dan ketika tidak ada dan umumnya menyarankan untuk menjaga esc_url () untuk setiap nilai.

Tomer W
sumber
3
"Pengaturan situs oleh seseorang yang Anda percayai" masih merupakan input pengguna secara harfiah . :)
Rarst
@ Pertama ya, aku bersamamu, tapi dia sangat "jijik" dengan menggunakan esc_url, aku sedikit lebih pemaaf.
Tomer W
2

Hal lain yang harus diingat esc_url()adalah untuk sesuatu seperti. <a href="SANITIZE_THIS_URL">your_text</a>Jika Anda akan menggunakan URL dalam output HTML Anda, seperti atribut href untuk tautan, atau atribut src untuk elemen gambar, Anda harus menggunakan esc_url().

esc_url_raw()untuk kasus lain di mana Anda ingin URL bersih, tetapi Anda tidak ingin entitas HTML dikodekan. Jadi setiap penggunaan non-HTML (DB, redirect) akan menggunakan ini.

The esc_url_raw()fungsi akan melakukan cukup banyak yang sama seperti esc_url(), tetapi tidak akan entitas decode, yang berarti tidak akan menggantikan & dengan & # 038 dan seterusnya. Seperti yang ditunjukkan oleh Mark, aman untuk digunakan esc_url_raw()dalam permintaan basis data, pengalihan dan fungsi HTTP, seperti `wp_remote_get () 'untuk info lebih lanjut tentang esc_url_raw ()

MD MUSA
sumber
1

esc_url digunakan untuk menghasilkan HTML yang valid (bukan untuk membersihkan input). Anda harus menggunakan ini kapan saja Anda tidak 100% yakin bahwa apa yang ingin Anda hasilkan adalah HTML yang valid untuk konteks itu.

matthew
sumber
Semua keluarga fungsi pelarian secara eksplisit untuk sanitasi.
Rarst