[英]How sanitize and store user input, that contains HTML regex pattern in WordPress
我正在研究某些WordPress插件,該插件的功能之一是能夠將用戶輸入的HTML regex模式存儲到DB,然后將其顯示在設置頁面上。
我的方法實際上是可行的,但是我想知道代碼是否足夠安全:
這是用戶輸入的模式:
<div(.+?)class='sharedaddy sd-sharing-enabled'(.*?)>(.+?)<\div><\div><\div>
這就是我在數據庫中存儲HTML模式的方式:
$print_options['custom_exclude_pattern'] = htmlentities(stripslashes($_POST['custom_exclude_pattern']),ENT_QUOTES,"UTF-8");
這就是它實際存儲在WordPress DB中的方式:
s:22:"custom_exclude_pattern";s:109:"<div(.+?)class="sharedaddy sd-sharing-enabled"(.*?)>(.+?)<\div><\div><\div>";
這就是輸出在設置頁面上顯示的方式:
<input type="text" name="custom_exclude_pattern" value="<?php echo str_replace('"',"'",html_entity_decode($print_options['custom_exclude_pattern'])); ?>" size="30" />
感謝幫助 :)
我希望我明白了,如果不能的話,請糾正我:您正在嘗試根據存儲在數據庫中的相同模式為輸入字段動態插入模式,對嗎? 好吧,我個人認為模式對可用性很有幫助,因為用戶知道他的輸入格式不正確,而無需每次都提交和刷新。 模式的最大問題是,可以在客戶端修改HTML代碼。 我相信唯一安全的解決方案是檢查服務器端輸入的正確性……客戶端程序絕對不可能比服務器端程序更安全!
好吧,如果您要讓用戶輸入一個正則表達式,則可以執行諸如預處理語句+ htmlentities($input, ENT_COMPAT, "UTF-I");
清理輸入,然后執行相反的操作,即html_entity_decode($dataFromDb, ENT_COMPAT, " UTF-8");
。 必須准備好的語句,解決惡意輸入的所有其他方法都可以通過許多不同的方式組合起來!
從評論中看來,您似乎在擔心兩個獨立的問題(並且可能沒有意識到我將在一分鍾內提到的第三個問題),並且正在為這兩個問題尋找一種解決方案: SQL Injection和Cross-Site Scripting 。 您必須分別對待每個人。 我懇請您閱讀Defuse Security的這篇文章 。
通常,在StackOverflow上已經針對PHP應用程序回答了這一問題。 WordPress的$wpdb
支持准備好的語句,因此您不必一定弄清楚如何使用PDO或MySQLi。 (然而,在他們的驅動程序的任何漏洞會影響你的插件。請務必閱讀$wpdb
徹底文檔。
在將參數傳遞給准備好的語句之前, 請勿轉義參數 。 最后,您將得到的數據雜亂無章。
在撰寫本文時(2015年6月),您需要考慮兩種一般情況:
第一個問題很簡單,可以解決:
echo htmlentities($dbresult['field'], ENT_QUOTES | ENT_HTML5, 'UTF-8');
第二個問題有些棘手。 它涉及只允許某些標記,而不是偶然地允許其他標記,這些標記可被利用來使Javascript在用戶的瀏覽器中運行。 目前允許XHTML防御的黃金標准是HTML Purifier 。
無論您有什么要求,都應始終對輸出應用XSS防御,而不是在將內容插入數據庫之前 。 最近,Wordpress核心存在一個存儲的跨站點腳本漏洞 ,該漏洞是由決定在存儲前轉義而不是在渲染前轉義而導致的。 通過提供足夠長的注釋,攻擊者可以在轉義的文本上觸發MySQL截斷錯誤,從而使他們繞過防御。
unserialize()
PHP對象注入 這就是它實際存儲在WordPress DB中的方式:
s:22:"custom_exclude_pattern";s:109:"<div(.+?)class="sharedaddy sd-sharing-enabled"(.*?)>(.+?)<\\div><\\div><\\div>";
看起來您在存儲此數據時正在使用serialize()
,並且在檢索數據時可能正在使用unserialize()
。 小心unserialize()
; 如果讓用戶對字符串有任何控制權,則他們可以將PHP對象注入代碼中,這也可以導致遠程執行代碼。
作為記錄,遠程執行代碼意味着它們可以接管您的整個網站,也可以接管托管您的博客的服務器。 如果用戶有可能直接更改此記錄,我強烈建議改用json_encode()
和json_decode()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.