問題描述
我想確保我的外掛/主題中的所有資料在進入資料庫之前和輸出到瀏覽器之前被安全地處理。我的問題是,在某些情況下,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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。