問題描述
我一直在審查大量關於 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。