問題描述
我想確保我的插件/主題中的所有數據在進入數據庫之前和輸出到瀏覽器之前被安全地處理。我的問題是,在某些情況下,API 可以處理您的消毒,例如在保存後期元字段時,以及其他插件/主題作者完全負責的方式,例如保存自定義設置時。
對於這個問題的範圍,我不關心在域級驗證數據 – 例如,檢查表單上的 Age 字段是在 0 到 120 之間,還是 e-mail 地址是有效的。我只關心安全性 – 例如,轉義 SQL 查詢以避免在保存到數據庫時進行 SQL 注入,或者將輸出到 HTML 模板的數據進行消毒以避免 XSS 。
對於輸出消毒,我知道當將變量變回 HTML 模板時,您始終需要使用像 esc_html()和 esc_attr()這樣的功能。但是,當使用 template tags 時呢?他們是否已經對產品進行了消毒?如果是,對於哪個上下文 (一般的 HTML,標籤屬性等)?某些功能具有不同上下文的變體 (例如 the_title_attribute(),但絕大多數情況) 。
對於輸入消毒,我知道在進行手動查詢時需要使用 $wpdb->prepare(),但是當使用 Settings API 創建插件設置頁面或者為自定義帖子類型保存後期字段時呢?
現在我剛剛挖掘了 Core 和閲讀教程,每次我使用一個函數來確定它是否消毒,但這是 error-prone 和耗時。我希望找到一些全面的可能情況列表,以及 API 是否處理它。例如。,
API 驗證/消毒
-
使用
update_postmeta()保存後期元 -
使用
update_user_meta()保存用户元數據 -
輸出帖子標題 – 使用
the_title()的上下文相關變體 -
等等
您必須手動驗證/消毒
-
使用 Settings API 保存插件選項。將回調作為
register_setting()的第 3 個參數。 -
直接數據庫查詢:將查詢包裝在
$wpdb->prepare()中。 -
在 HTML 中輸出變量。使用
esc_attr(),esc_html()等 -
等等
我也有興趣瞭解 API 在某些情況下提供的原因,但不是其他的。我假設它與數據的未知性有關,但很樂意聽到一個徹底的解釋。
最佳解決方案
這裏有兩個概念:
-
驗證 – 確保數據有效,即整數為整數,日期為日期 (格式正確) 。這應該在保存數據之前完成。
-
衞生 – 使日期安全在當前上下文中使用 (例如轉義 SQL 查詢或在輸出中轉義 HTML) 。
幾乎普遍地,驗證完全歸功於你。你知道你正在向用户詢問什麼數據,並且知道你期望的數據 – WordPress 沒有。將在 save_post 鈎子上執行驗證,然後將其保存到具有 update_post_meta 的數據庫中,或者可以通過在設置 API 中指定回調函數來完成,即在 WordPress 保存數據之前調用。
三化有點混雜。當處理 WordPress 本身知道的數據 (例如一個帖子的圖塊) 時,您可以確保 WordPress 已經使數據安全。但是’safe’ 取決於上下文; 什麼是安全的在頁面上使用,不一定是安全的元素屬性。因此,WordPress 將為不同的上下文 (例如 the_title(),the_title_rss(),the_title_attribute()) 具有不同的功能,因此您需要使用正確的功能。
在大多數情況下,您的 plug-in 可能會處理自定義表格中的後期元數據或事件數據。 WordPress 不知道這些數據是什麼或是什麼,所以它肯定不知道如何使其安全。這取決於你這對於使用 esc_url(),esc_attr(),esc_textarea()等來防止惡意輸入能夠嵌入代碼尤其重要。由於 WordPress 知道 next_posts()是假設打印一個 url 到頁面,它適用於 esc_url() – 但是使用後期元,説,它不知道它存儲一個 url – 或者你想做什麼 (如果打印,esc_url(),如果重定向 esc_url_raw()。如果在 dobut – 錯誤的一面謹慎,並自行逃脱 – 並儘可能晚地做到這一點。
最後 – 如何保存數據?你需要安全嗎?如上所述,您需要確保數據有效。但是如果使用 WordPress API(wp_insert_post(),update_post_meta()等),那麼您不需要對數據進行清理 – 因為在保存數據時,您需要做的唯一的清理就是轉義 SQL 語句 – 而 WordPress 也會這樣做。如果您正在運行直接的 SQL 語句 (比如從定製表讀取/寫入數據),那麼您應該使用 $wpdb 類來幫助您清理查詢。
我寫了這本 blog post on data sanitisation and validation,你可能會發現有用的 – 在這裏我談到你在這方面的預期。
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。