問題描述
我正在努力瞭解資料清理 (而非資料驗證),以幫助我為 WordPress 編寫安全的主題。我搜尋了網際網路,試圖找出詳細說明最佳實踐的主題開發者的綜合指南。有幾個資源我遇到包括 codex 頁面的資料驗證,雖然沒有對我有用。 codex 頁面列出了可用的消毒功能,它們的用途以及它們的作用,但是沒有解釋為什麼你會使用一個或另一個使用特定的消毒功能的情況。這篇文章的目的是要求每個人都提供不良/未經授權的程式碼示例,以及如何使用 re-written 進行適當的消毒。這可以是消除郵政標題或 post thumnails src 或更精細的程式碼來處理 $_POST 資料的 Ajax 請求的訊息的一般程式碼。
另外,我想知道是否新增/更新資料庫的 WordPress 功能 (例如下面的程式碼塊中提到的) 是否會自動為您處理消毒工作?如果是,那麼當您採取其他措施來清理傳送到這些 WordPress 功能的資料時,是否有例外?
add_user_meta
update_user_meta
add_post_meta
update_post_meta
//just to name a few
另外,在 PHP 中回顯 HTML 時,需要做不同的消毒處理,而不是 PHP 內聯 HTML?為了更清楚我在問什麼,這裡是程式碼:
<?php echo '<div class="some-div ' . $another_class . '" data-id="' . $id . '" >' . $text . '</div>'; ?>
<div class="some-div <?php echo $another_class; ?>" data-id="<?php echo $id; ?>"><?php echo $text; ?></div>
上述宣告都是一樣的。但是他們需要不同的方式呢?
最佳解決方案
這個 codex page 很好地解釋了我的想法。
最重要和最常用的功能可能是 esc_attr 。舉個例子:
<a href="<?php%20print%20$author_url;%20?>" title="<?php print $author_name; ?>">
<?php print $author_name; ?>
</a>
如果 $author_name 包含"字元,您的屬性關閉,如果該字元後跟 onclick="do_something();"它可能會更糟糕:)
做 print esc_attr($author_name)確保這樣的字元被編碼,並且瀏覽器不做它不應該做的事情。
有一種情況,你不需要它:當你期待一個數字,在這種情況下,你可以投入輸入資料為整數,例如:
print (int)$_POST['some_number'];
您列出的 meta *函式已經在保護資料庫儲存的輸入消毒,所以你不需要擔心。
當您自己進行 DB 查詢時,需要使用 wpdb->prepare()方法。以下是一個例子:
$sql = $wpdb->prepare('
UPDATE wp_posts SET post_title = %s WHERE ID = %d',
$_POST['title'], $_POST['id']);
$wpdb->query($sql);
%s 和%d 關鍵字將被您的消毒 $ _POST 值所取代。
在 WP.org 資訊庫中的許多外掛中看到的一個非常常見的錯誤是將已準備好的查詢傳遞給它 (並且準備不充分),如:
$wpdb->prepare('UPDATE wp_posts SET post_title = ''.$_POST['title'].' WHERE ...
不要這樣做:)
Also, does sanitization needs to be done differently when echoing HTML in PHP as against PHP inline of HTML?
Both the above statements achieve the same thing. But do they need to be santized differently?
沒有。
次佳解決方案
馬克·賈基斯 (Mark Jaquith) 的這部錄影讓我清楚了。 http://wordpress.tv/2011/01/29/mark-jaquith-theme-plugin-security/
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。