問題描述
我一直在審查大量關於 WP 主題和外掛安全性的資訊,並瞭解您應該在主題和外掛中轉義屬性和 HTML 值的概念。我已經看到 bloginfo()和 echo get_bloginfo()都使用標準和內部的 esc_html()或 esc_attr()功能。
創世紀和_s,Automattic 的基礎主題都逃避了這些價值觀,但 WP 自己的 codex 主題標準指南並沒有說出任何逃避這些價值觀。我已經研究了 WP 程式碼 (wp-includes/option.php),似乎有一些訊息從 get_option()傳遞的值,但它也看起來像一個外掛可以覆蓋某些值的過濾器。
這是事實,導致我認為它應該逃脫。任何人都可以啟發我嗎?
最佳解決方案
我們必須在這裡更深入瞭解您的問題的答案。
所以 bloginfo 是 get_bloginfo 的簡單包裝。
<?php
function bloginfo( $show='' ) {
echo get_bloginfo( $show, 'display' );
}
注意第二個引數 display 。讓我們看看這是做什麼的。
<?php
function get_bloginfo( $show = '', $filter = 'raw' ) {
// snip snip, $output is fetched somewhere in here
if ( 'display' == $filter ) {
if ( $url )
$output = apply_filters('bloginfo_url', $output, $show);
else
$output = apply_filters('bloginfo', $output, $show);
}
return $output;
}
如果過濾器設定為 display,則 get_bloginfo 的輸出透過過濾器執行。
WPA 使用它自己的鉤子系統來做某事,而不是像一個函式中的 esc_html 一樣呼叫。找到發生的地方在 wp-includes/default-filters.php 的地方。在該檔案中快速搜尋 bloginfo 顯示…
<?php
// Format strings for display.
foreach ( array( 'comment_author', 'term_name', 'link_name', 'link_description', 'link_notes', 'bloginfo', 'wp_title', 'widget_title' ) as $filter ) {
add_filter( $filter, 'wptexturize' );
add_filter( $filter, 'convert_chars' );
add_filter( $filter, 'esc_html' );
}
bloginfo 隱藏在 foreach 陣列中。您可以看到,bloginfo 的輸出使用 esc_html 進行轉義。
換句話說,這個:
<?php
bloginfo('name');
相當於:
<?php
echo esc_html(get_bloginfo('name'));
或這個:
<?php
echo get_bloginfo('name', 'display');
所以不,bloginfo 的輸出不需要轉義。只要第二個引數設定為 display,get_bloginfo 的輸出也不會。
但是,請注意,任何人都可以從 bloginfo 中刪除 esc_html 過濾器。因此,逃避輸出可能更安全。當然,如果您使用 bloginfo 的輸出,而不是 HTML 顯示 (例如,在影像的 alt 屬性中),您應該透過 esc_attr 來執行它。
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。