PHP防范應(yīng)對(duì)WEB輸入攻擊,必須應(yīng)用HTMLPurifier
當(dāng)前位置:點(diǎn)晴教程→知識(shí)管理交流
→『 技術(shù)文檔交流 』
之所以推薦使用HTMLPurifier,是因?yàn)樵趧倓傔^(guò)去的年度地區(qū)性網(wǎng)絡(luò)安全攻防演練中,我這邊的兩套PHP開(kāi)發(fā)的系統(tǒng)面對(duì)WEB輸入攻擊,使用HTMLPurifier與否的遭遇是冰火兩重天。 這兩套系統(tǒng)都有用WAF設(shè)備作為第一重屏障,其中在開(kāi)發(fā)中使用了HTMLPurifier的系統(tǒng),經(jīng)受了大量的各種WEB輸入攻擊嘗試依然不倒;而另外一套沒(méi)有用HTMLPurifier的系統(tǒng)則被各種注入,開(kāi)發(fā)商方面只能疲于奔命地救火。 很顯然這和該開(kāi)發(fā)商本身的安全能力存在不足是直接關(guān)系,甚至連WEB輸入需要集中過(guò)濾都沒(méi)有嚴(yán)格做好。不過(guò)這不在本次的討論內(nèi)。我們要關(guān)注的是在實(shí)現(xiàn)了集中的GET/POST輸入過(guò)濾的前提下,HTMLPurifier所能實(shí)現(xiàn)的關(guān)鍵作用。 HTMLPurifier,簡(jiǎn)單稱之為“HTML提純器”吧,是用PHP開(kāi)發(fā)、對(duì)標(biāo)兼容HTML標(biāo)準(zhǔn)的過(guò)濾功能函數(shù)庫(kù),通過(guò)LGPL v2.1+授權(quán)許可模式開(kāi)源。
HTML提純器基于經(jīng)過(guò)仔細(xì)審計(jì)、被動(dòng)式但確保安全的白名單,過(guò)濾刪除WEB輸入中夾雜的惡意代碼(XSS攻擊,SQL注入攻擊等等),并對(duì)WEB輸入內(nèi)容與HTML標(biāo)準(zhǔn)的符合性進(jìn)行修正。所以項(xiàng)目開(kāi)發(fā)者把它不叫過(guò)濾器,而是叫提純器。 與HTML提純器類似的而且是開(kāi)源的WEB輸入過(guò)濾解決方法(函數(shù)庫(kù))也有不少,但這些解決辦法很多沒(méi)有持續(xù)更新,對(duì)新的HTML/CSS標(biāo)準(zhǔn)的兼容性有缺陷,也對(duì)防御新的攻擊手段存在欠缺。 關(guān)鍵在于如何實(shí)現(xiàn)過(guò)濾的細(xì)節(jié)上。HTML提純器的安全性和可靠性在于它是基于白名單放行而不是基于黑名單攔截。網(wǎng)絡(luò)安全從業(yè)人員都知道,黑名單必然會(huì)過(guò)時(shí),而白名單基于良好審計(jì)的前提是完全可靠的。 XSS攻擊也好,SQL注入也好,這些攻擊手段的成功因素在于惡意利用了HTML規(guī)范中一些深層次的規(guī)范定義和瀏覽器實(shí)現(xiàn)的誤差。這些誤差導(dǎo)致惡意代碼非常容易變化,從而逃脫基于黑名單的過(guò)濾檢查。 而HTML提純器基于白名單過(guò)濾機(jī)制,對(duì)整個(gè)WEB輸入內(nèi)容按HTML規(guī)范進(jìn)行分解,檢查輸入內(nèi)容中的任何一項(xiàng)HTML/CSS屬性,刪除任何白名單之外的元素和屬性,最后按標(biāo)準(zhǔn)規(guī)范校驗(yàn)整理和重新格式化輸入內(nèi)容。 基于以上實(shí)現(xiàn)邏輯,HTML提純器的安全性和可靠性是充足可信的。 HTML提純器的使用方法很簡(jiǎn)單,尤其是對(duì)于全部環(huán)境都是基于UTF-8編碼的情況:
創(chuàng)建默認(rèn)配置,設(shè)置UTF-8編碼,按配置創(chuàng)建對(duì)象,調(diào)用對(duì)象方法執(zhí)行過(guò)濾得到凈化后的內(nèi)容,就這么簡(jiǎn)單。 如果WEB環(huán)境不是UTF-8而是其他編碼,比如使用GB2312或者GBK編碼,HTML提純器需要在調(diào)用前先進(jìn)行轉(zhuǎn)碼,然后完成執(zhí)行過(guò)濾純凈化后再轉(zhuǎn)回去原來(lái)的編碼:
經(jīng)過(guò)純凈化后的用戶輸入,就可以放心地用htmlspecialchars函數(shù)轉(zhuǎn)義保存到數(shù)據(jù)庫(kù),以及從數(shù)據(jù)庫(kù)調(diào)取對(duì)用戶重現(xiàn)了。 如果要說(shuō)本文的意義,那就是實(shí)證了DevSecOps,就是要把安全措施從運(yùn)維轉(zhuǎn)移到開(kāi)發(fā)環(huán)節(jié)。WAF設(shè)備始終只是一種輔助手段,并不是從根本上解決安全問(wèn)題的辦法。 該文章在 2023/10/30 9:27:42 編輯過(guò) |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |