Saya sebenarnya seorang insinyur di VIP yang melakukan banyak review kode :) Saya menandai banyak yang hilang.
tetapi tidak luput output
Tidak cukup, itu tidak luput pada output, yang mengejutkan bagi kebanyakan orang. Ini karena jika Anda seorang admin super Anda memiliki unfiltered_html
kemampuan, sehingga tidak dapat lepas pada output. Sebaliknya itu dijalankan melalui wp_kses_post
input. Idealnya Anda akan menghapus kemampuan itu.
Berikut adalah implementasinya saat ini:
function the_content( $more_link_text = null, $strip_teaser = false ) {
$content = get_the_content( $more_link_text, $strip_teaser );
/**
* Filters the post content.
*
* @since 0.71
*
* @param string $content Content of the current post.
*/
$content = apply_filters( 'the_content', $content );
$content = str_replace( ']]>', ']]>', $content );
echo $content;
}
Mekanisme ideal untuk lolos dari segala sesuatu yang melewati the_content
filter adalah:
echo apply_filters( 'the_content', wp_kses_post( $content ) );
Dengan cara ini kami membuat konten aman, kemudian menjalankannya melalui filter, menghindari embed dll dilucuti.
Jadi Kenapa Kabur
Inti dari melarikan diri adalah untuk menghasilkan HTML yang valid, keamanan tambahan yang diberikannya hanya efek samping yang bagus.
Untuk mencegah pengguna secara tidak sengaja merusak markup
Ada banyak alasan untuk melarikan diri, tetapi pada dasarnya, Anda menegakkan harapan. Ambil kode berikut:
<a href="<?=$url?>">
Kami berharap $url
berisi URL yang cocok untuk href
atribut, tetapi bagaimana jika bukan? Nah mengapa biarkan saja, mari kita menegakkannya:
<a href="<?=esc_url( $url )?>">
Sekarang akan selalu menjadi URL. Tidak masalah jika seorang hacker memasukkan gambar $url
, atau jika pengguna mengetik di bidang yang salah, atau ada skrip berbahaya. Itu akan selalu menjadi URL yang valid karena kami mengatakan itu akan menjadi URL. Tentu itu mungkin URL yang sangat aneh, tetapi akan selalu memenuhi harapan bahwa URL akan ada di sana. Ini sangat berguna, baik untuk validasi markup, untuk keamanan, dll
Karena itu, melarikan diri bukanlah validasi, melarikan diri bukanlah sanitasi. Itu adalah langkah terpisah yang terjadi pada titik yang berbeda dalam siklus hidup. Lolos memaksa hal-hal untuk memenuhi harapan, bahkan jika itu membuat mereka melakukannya.
Kadang-kadang saya suka berpikir untuk melarikan diri sebagai salah satu gameshow Jepang dengan dinding busa raksasa dengan potongan. Kontestan harus sesuai dengan bentuk anjing atau mereka dibuang, hanya untuk keperluan kita ada laser dan pisau di sekitar lubang. Apa pun yang tersisa pada akhirnya akan berbentuk anjing, dan itu akan menjadi tidak memaafkan dan ketat jika Anda belum berbentuk anjing.
Ingat:
- membersihkan awal
- validasi lebih awal
- melarikan diri terlambat
- sering melarikan diri
Keamanan adalah langkah ganda, pertahanan berlapis-lapis, pertahanan adalah salah satu lapisan luar pertahanan pada keluaran. Itu dapat memotong kode serangan pada situs yang disusupi sehingga tidak berguna, menggagalkan eksploit terbuka, dan memastikan klien Anda tidak merusak situs dengan meletakkan tag di bidang yang tidak seharusnya. Ini bukan pengganti untuk hal-hal lain, dan sejauh ini merupakan alat keamanan yang paling tidak digunakan dalam buku pegangan pengembang.
Adapun mengapa harus melarikan diri jika the_content
tidak? Jika Anda memiliki banjir, dan 5 lubang di dinding, tetapi hanya waktu untuk memperbaiki 3, apakah Anda mengangkat bahu dan tidak memperbaiki? Atau apakah Anda mengurangi risiko dan mengurangi area serangan?
Mungkin saya dapat membantu memperbaiki 2 lubang terakhir dengan potongan ini:
add_filter( 'the_content' function( $content ) {
return wp_kses_post( $content );
}, PHP_INT_MAX + 1 );
Di sini kita menetapkan prioritas ke angka tertinggi di PHP, lalu tambahkan 1 sehingga meluap ke angka serendah mungkin yang dapat direpresentasikan. Dengan cara ini semua panggilan ke the_content
akan luput dari nilai sebelum filter lainnya. Cara ini menanamkan dll masih berfungsi, tetapi pengguna tidak dapat menyelinap dalam HTML berbahaya melalui database. Selain itu, coba hapus unfiltered_html
kemampuan dari semua peran
wp_kses_post