Apa perbedaan antara filter esc_html vs filter atribut_escape?

8

Apa perbedaan yang tepat antara esc_htmldan attribute_escapefilter?

esc_html()menggunakan esc_html filterdan esc_attr()menggunakan attribute_escape filter. Keduanya mengkodekan <> & "'(kurang dari, lebih besar dari, ampersand, kutipan ganda, kutipan tunggal).

Saya tertarik untuk mengetahui apa sebenarnya yang membuat mereka berbeda dalam hal keamanan (melarikan diri).

djadmin
sumber
baik, jika mereka tidak berbeda, tidak akan ada kebutuhan untuk memiliki keduanya .... pertanyaan IMO tidak jelas, itu seperti menanyakan apa perbedaan antara filter the_content dan the_excerpt
Mark Kaplun
1
Saya pikir itu yang dia tanyakan, apa bedanya dan mengapa?
Tom J Nowell
@ TomJNowell, well satu dipanggil untuk keluar atribut dan yang lainnya untuk menghindari HTML umum. Itu menjelaskan alasannya, dan sebagian besar menjelaskan caranya juga;) Di mana jawaban harus dimulai di sini, dengan menjelaskan perbedaan antara karakter yang diizinkan dalam atribut dan html umum? ini kedengarannya agak terlalu mendasar (tapi mungkin apa yang ditanyakan OP tentang saya kira)
Mark Kaplun
2
Itu bagus, tapi contoh dari sesuatu yang esc_attrlolos esc_htmltidak akan berguna, setelah semua mengapa tidak digunakan di esc_htmlmana-mana? Jika itu jelas bagi Anda, itu mungkin tidak tampak seperti pertanyaan yang bagus tetapi tidak jelas bagi penanya bagaimana 2 fungsi ini berbeda mengingat keduanya sama-sama lolos dari karakter yang diharapkan
Tom J Nowell

Jawaban:

8

Akan muncul bahwa di luar kotak, tidak ada perbedaan

function esc_html( $text ) {
    $safe_text = wp_check_invalid_utf8( $text );
    $safe_text = _wp_specialchars( $safe_text, ENT_QUOTES );
    /**
     * Filters a string cleaned and escaped for output in HTML.
     *
     * Text passed to esc_html() is stripped of invalid or special characters
     * before output.
     *
     * @since 2.8.0
     *
     * @param string $safe_text The text after it has been escaped.
     * @param string $text      The text prior to being escaped.
     */
    return apply_filters( 'esc_html', $safe_text, $text );
}
function esc_attr( $text ) {
    $safe_text = wp_check_invalid_utf8( $text );
    $safe_text = _wp_specialchars( $safe_text, ENT_QUOTES );
    /**
     * Filters a string cleaned and escaped for output in an HTML attribute.
     *
     * Text passed to esc_attr() is stripped of invalid or special characters
     * before output.
     *
     * @since 2.0.6
     *
     * @param string $safe_text The text after it has been escaped.
     * @param string $text      The text prior to being escaped.
     */
    return apply_filters( 'attribute_escape', $safe_text, $text );
}

Satu-satunya perbedaan antara 2 fungsi adalah filter yang diterapkan di bagian akhir. WordPress tidak menambahkan apa-apa ke filter ini, jadi dalam instalasi WP standar tidak berfungsi. Mereka disediakan di tepi kasus bahwa seseorang mungkin membutuhkannya.

T&J cepat

Jadi secara default mereka identik?

Iya! Fungsi esc_attrdan esc_htmlmemiliki implementasi yang sama

Apakah filternya identik?

Satu-satunya perbedaan adalah mereka memiliki nama yang berbeda, mereka bekerja dengan cara yang sama, mereka menggunakan cara yang sama, dan tidak ada filter yang digunakan dalam inti.

Apakah filter melakukan sesuatu?

Tidak! Semua pelarian dilakukan dalam fungsi kapan wp_check_invalid_utf8dan _wp_specialcharsdipanggil.

Filter tidak melakukan pelarian, itu adalah peluang bagi plugin untuk melakukan pemeriksaan dan pemrosesan tambahan.

Apakah ada kasing tepi?

Hanya jika Anda menggunakan filter, katakan Anda terhubung esc_htmltetapi tidak attribute_escape, atau sebaliknya. Untuk instalasi WP standar, 2 fungsi identik, tanpa perbedaan.

Kenapa attribute_escapedan tidak esc_attr?

Kompatibilitas mundur. Dulu ada attribute_escapefungsi, yang sekarang ditandai sebagai usang setelah esc_fungsi gaya ditambahkan.

Mengapa saya menggunakan filter ini?

¯\_(ツ)_/¯ini akan menjadi situasi yang langka. Beberapa orang mungkin menyalahgunakannya dengan cara yang sama dengan API terjemahan disalahgunakan untuk mencari teks pengganti. Ini sudah praktik yang buruk karena filter-filter itu disebut banyak, kehilangan kecepatan kecil diperbesar ribuan kali

Tetapi pertimbangkan bahwa jika Anda tidak berhati-hati, Anda dapat membahayakan keamanan fungsi-fungsi ini dengan membatalkan pelolosan yang mereka tambahkan, atau menambahkan konten yang tidak terhindar di akhir. Karena itu filternya berbahaya.

Apakah Saya Perlu Khawatir tentang Ini?

Tidak. Anda hanya perlu khawatir jika Anda menggunakan filter-filter itu, yang dengan sendirinya akan memicu alarm merah besar bahwa ada sesuatu yang salah dalam pengembangan Anda.

Fungsi esc_attrdan esc_htmlaman digunakan, dan melarikan diri konten. Anda memiliki kewajiban etis dan moral untuk menggunakannya jika Anda menghargai keamanan kode Anda

Apakah ini berarti saya hanya harus menggunakan esc_html?

Tidak, melarikan diri adalah tentang menetapkan harapan. Jika Anda mengharapkan atribut, gunakan esc_attr. Hanya karena secara fungsional sama saat ini, tidak berarti itu tidak akan berubah di masa depan dengan rilis keamanan

Tom J Nowell
sumber
Terima kasih atas jawabannya. Mungkin saya perlu mengulangi pertanyaan saya. Saya lebih tertarik untuk mengetahui apakah ada perbedaan dalam implementasi inti dari dua filter yang disebutkan di atas. Ini akan sangat membantu kami (pengembang) untuk mengetahui bagaimana melarikan diri berfungsi dalam atribut dan HTML.
djadmin
Filter tersebut tidak digunakan oleh Core, disediakan untuk plugin jika perlu. Namun saya sangat menyarankan untuk tidak menggunakannya karena alasan keamanan
Tom J Nowell
"Filter esc_html dan atribut_escape sangat berbahaya." Saya benar-benar tidak mengerti poin ini. Jika kita tidak menggunakan ini, lalu bagaimana kita bisa keluar dari input pengguna untuk mencegah XSS?
djadmin
Seperti yang Anda katakan, mereka melewati filter sebelum keluar. Pertanyaan asli saya adalah bagaimana kedua filter ini berbeda dalam hal implementasi. Saya percaya akan ada beberapa kasus tepi yang esc_htmlmenyaring melarikan diri dan attribute_escapemenyaring tidak atau sebaliknya.
djadmin
Mereka tidak melakukannya. Filter disediakan untuk kode pihak ketiga dan tidak digunakan oleh Core. Core tidak terhubung ke filter, juga tidak melakukan apa pun dengan mereka. Casing tepi tersebut harus ditulis oleh pengembang tema atau pengaya, pada titik mana akan menjadi jelas karena Anda akan menjadi orang yang menulisnya
Tom J Nowell