亚洲乱色熟女一区二区三区丝袜,天堂√中文最新版在线,亚洲精品乱码久久久久久蜜桃图片,香蕉久久久久久av成人,欧美丰满熟妇bbb久久久

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開(kāi)發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

PHP防范應(yīng)對(duì)WEB輸入攻擊,必須應(yīng)用HTMLPurifier

admin
2023年10月30日 9:27 本文熱度 1782

之所以推薦使用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)源。

http://htmlpurifier.org/

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編碼的情況:

<?php
require_once './HtmlPurifier/HTMLPurifier.auto.php';
$PurifierConfig = HTMLPurifier_Config::createDefault();
$PurifierConfig->set('Core.Encoding''utf-8');
$PurifierObj = new HTMLPurifier($PurifierConfig);
$PurifiedData = $PurifierObj ->purify($MaliciousData);

創(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)的編碼:

<?php
require_once './HtmlPurifier/HTMLPurifier.auto.php';
$PurifierConfig = HTMLPurifier_Config::createDefault();
$PurifierConfig->set('Core.Encoding''utf-8');
$PurifierObj = new HTMLPurifier($PurifierConfig);
// 如果輸入內(nèi)容不是UTF-8字符集則先進(jìn)行轉(zhuǎn)換,在凈化后再轉(zhuǎn)換回去
$DataCharset = mb_detect_encoding($MaliciousData);
if ($DataCharset!='UTF-8')
  $MaliciousData= mb_convert_encoding($MaliciousData, 'UTF-8', $DataCharset);
$PurifiedData = $PurifierObj ->purify($MaliciousData);
if ($DataCharset!='UTF-8')
  $PurifiedData = mb_convert_encoding($PurifiedData , $DataCharset, 'UTF-8');
必須說(shuō)明的是上面這只是一個(gè)很粗略的例子。因?yàn)閙b_detect_encoding和mb_convert_encoding實(shí)際都不能做到100%有效地檢測(cè)和轉(zhuǎn)換字符集。在應(yīng)用以上代碼時(shí),需要對(duì)輸入內(nèi)容的字符集先進(jìn)行假設(shè),比如假設(shè)為GB2312/GBK字符集。
由于mb_detect_encoding在判斷中文字符集時(shí)還存在一些誤判的情況,所以也有人是干脆按中文字符集編碼規(guī)范自己另外寫了一套判斷。不過(guò)這超越了本文主題,就不展開(kāi)了,如對(duì)此有興趣可以后臺(tái)留言。
下面是稍微復(fù)雜一些的使用例子:自選過(guò)濾保留的HTML標(biāo)記和CSS屬性,并強(qiáng)制所有鏈接都在新窗口打開(kāi):
<?php
require_once './HtmlPurifier/HTMLPurifier.auto.php';
$PurifierConfig = HTMLPurifier_Config::createDefault();
$PurifierConfig->set('Core.Encoding''UTF-8');

// 可通過(guò)參數(shù)設(shè)置有選擇性地過(guò)濾XSS,但會(huì)大幅度降低性能,除非必要不建議使用。
// 設(shè)置保留的HTML標(biāo)記,格式是:標(biāo)記名稱[屬性]
$PurifierConfig->set('HTML.Allowed','div,b,strong,i,em,a[href|title],ul,ol,li,p[style],br,span[style],img[width|height|alt|src]');
// 設(shè)置保留的CSS屬性
$PurifierConfig->set('CSS.AllowedProperties''font,font-size,font-weight,font-style,font-family,text-decoration,padding-left,color,background-color,text-align');
// 設(shè)置強(qiáng)制所有的鏈接在新窗口打開(kāi)
$PurifierConfig->set('HTML.TargetBlank'TRUE);
// 創(chuàng)建對(duì)象并執(zhí)行過(guò)濾
$PurifierObj = new HTMLPurifier($PurifierConfig);
$PurifiedData = $PurifierObj ->purify($MaliciousData);

經(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)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開(kāi)發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved