电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

PHP安全-過濾輸入

瀏覽:107日期:2022-09-12 10:00:05
過濾輸入

過濾是Web應(yīng)用安全的基礎(chǔ)。它是你驗證數(shù)據(jù)合法性的過程。通過在輸入時確認(rèn)對所有的數(shù)據(jù)進(jìn)行過濾,你可以避免被污染(未過濾)數(shù)據(jù)在你的程序中被誤信及誤用。大多數(shù)流行的PHP應(yīng)用的漏洞最終都是因為沒有對輸入進(jìn)行恰當(dāng)過濾造成的。

我所指的過濾輸入是指三個不同的步驟:

l識別輸入

l過濾輸入

l區(qū)分已過濾及被污染數(shù)據(jù)

把識別輸入做為第一步是因為如果你不知道它是什么,你也就不能正確地過濾它。輸入是指所有源自外部的數(shù)據(jù)。例如,所有發(fā)自客戶端的是輸入,但客戶端并不是唯一的外部數(shù)據(jù)源,其它如數(shù)據(jù)庫和RSS推送等也是外部數(shù)據(jù)源。

由用戶輸入的數(shù)據(jù)非常容易識別,PHP用兩個超級公用數(shù)組$_GET 和$_POST來存放用戶輸入數(shù)據(jù)。其它的輸入要難識別得多,例如,$_SERVER數(shù)組中的很多元素是由客戶端所操縱的。常常很難確認(rèn)$_SERVER數(shù)組中的哪些元素組成了輸入,所以,最好的方法是把整個數(shù)組看成輸入。

在某些情況下,你把什么作為輸入取決于你的觀點。例如,session數(shù)據(jù)被保存在服務(wù)器上,你可能不會認(rèn)為session數(shù)據(jù)是一個外部數(shù)據(jù)源。如果你持這種觀點的話,可以把session數(shù)據(jù)的保存位置是在你的軟件的內(nèi)部。意識到session的保存位置的安全與軟件的安全是聯(lián)系在一起的事實是非常明智的。同樣的觀點可以推及到數(shù)據(jù)庫,你也可以把它看成你軟件的一部分。

一般來說,把session保存位置與數(shù)據(jù)庫看成是輸入是更為安全的,同時這也是我在所有重要的PHP應(yīng)用開發(fā)中所推薦的方法。

一旦識別了輸入,你就可以過濾它了。過濾是一個有點正式的術(shù)語,它在平時表述中有很多同義詞,如驗證、清潔及凈化。盡管這些大家平時所用的術(shù)語稍有不同,但它們都是指的同一個處理:防止非法數(shù)據(jù)進(jìn)入你的應(yīng)用。

有很多種方法過濾數(shù)據(jù),其中有一些安全性較高。最好的方法是把過濾看成是一個檢查的過程。請不要試圖好心地去糾正非法數(shù)據(jù),要讓你的用戶按你的規(guī)則去做,歷史證明了試圖糾正非法數(shù)據(jù)往往會導(dǎo)致安全漏洞。例如,考慮一下下面的試圖防止目錄跨越的方法(訪問上層目錄)。

CODE:

<?php

$filename = str_replace(’..’, ’.’, $_POST[’filename’]);

?>

你能想到$_POST[’filename’]如何取值以使$filename成為Linux系統(tǒng)中用戶口令文件的路徑../../etc/passwd嗎?

答案很簡單:

.../.../etc/passwd

這個特定的錯誤可以通過反復(fù)替換直至找不到為止:

CODE:

<?php

$filename = $_POST[’filename’];

while (strpos($_POST[’filename’], ’..’) != = FALSE)

{

$filename = str_replace(’..’, ’.’, $filename);

}

?>

當(dāng)然,函數(shù)basename( )可以替代上面的所有邏輯,同時也能更安全地達(dá)到目的。不過重要點是在于任何試圖糾正非法數(shù)據(jù)的舉動都可能導(dǎo)致潛在錯誤并允許非法數(shù)據(jù)通過。只做檢查是一個更安全的選擇。

譯注:這一點深有體會,在實際項目曾經(jīng)遇到過這樣一件事,是對一個用戶注冊和登錄系統(tǒng)進(jìn)行更改,客戶希望用戶名前后有空格就不能登錄,結(jié)果修改時對用戶登錄程序進(jìn)行了更改,用trim()函數(shù)把輸入的用戶名前后的空格去掉了(典型的好心辦壞事),但是在注冊時居然還是允許前后有空格!結(jié)果可想而知。

除了把過濾做為一個檢查過程之外,你還可以在可能時用白名單方法。它是指你需要假定你正在檢查的數(shù)據(jù)是非法的,除非你能證明它是合法的。換而言之,你寧可在小心上犯錯。使用這個方法,一個錯誤只會導(dǎo)致你把合法的數(shù)據(jù)當(dāng)成是非法的。盡管不想犯任何錯誤,但這樣總比把非法數(shù)據(jù)當(dāng)成合法數(shù)據(jù)要安全得多。通過減輕犯錯引起的損失,你可以提高你的應(yīng)用的安全性。盡管這個想法在理論上是很自然的,但歷史證明,這是一個很有價值的方法。

如果你能正確可靠地識別和過濾輸入,你的工作就基本完成了。最后一步是使用一個命名約定或其它可以幫助你正確和可靠地區(qū)分已過濾和被污染數(shù)據(jù)的方法。我推薦一個比較簡單的命名約定,因為它可以同時用在面向過程和面向?qū)ο蟮木幊讨小N矣玫拿s定是把所有經(jīng)過濾的數(shù)據(jù)放入一個叫$clean的數(shù)據(jù)中。你需要用兩個重要的步驟來防止被污染數(shù)據(jù)的注入:

l經(jīng)常初始化$clean為一個空數(shù)組。

l加入檢查及阻止來自外部數(shù)據(jù)源的變量命名為clean,

實際上,只有初始化是至關(guān)緊要的,但是養(yǎng)成這樣一個習(xí)慣也是很好的:把所有命名為clean的變量認(rèn)為是你的已過濾數(shù)據(jù)數(shù)組。這一步驟合理地保證了$clean中只包括你有意保存進(jìn)去的數(shù)據(jù),你所要負(fù)責(zé)的只是不在$clean存在被污染數(shù)據(jù)。

為了鞏固這些概念,考慮下面的表單,它允許用戶選擇三種顏色中的一種;

CODE:

<form action='process.php' method='POST'>

Please select a color:

<select name='color'>

<option value='red'>red</option>

<option value='green'>green</option>

<option value='blue'>blue</option>

</select>

<input type='submit' />

</form>

在處理這個表單的編程邏輯中,非常容易犯的錯誤是認(rèn)為只能提交三個選擇中的一個。在第二章中你將學(xué)到,客戶端能提交任何數(shù)據(jù)作為$_POST[’color’]的值。為了正確地過濾數(shù)據(jù),你需要用一個switch語句來進(jìn)行:

CODE:

<?php

$clean = array( );

switch($_POST[’color’])

{

case ’red’:

case ’green’:

case ’blue’:

$clean[’color’] = $_POST[’color’];

break;

}

?>

本例中首先初始化了$clean為空數(shù)組以防止包含被污染的數(shù)據(jù)。一旦證明$_POST[’color’]是red, green, 或blue中的一個時,就會保存到$clean[’color’]變量中。因此,可以確信$clean[’color’]變量是合法的,從而在代碼的其它部分使用它。當(dāng)然,你還可以在switch結(jié)構(gòu)中加入一個default分支以處理非法數(shù)據(jù)的情況。一種可能是再次顯示表單并提示錯誤。特別小心不要試圖為了友好而輸出被污染的數(shù)據(jù)。

上面的方法對于過濾有一組已知的合法值的數(shù)據(jù)很有效,但是對于過濾有一組已知合法字符組成的數(shù)據(jù)時就沒有什么幫助。例如,你可能需要一個用戶名只能由字母及數(shù)字組成:

CODE:

<?php

$clean = array( );

if (ctype_alnum($_POST[’username’]))

{

$clean[’username’] = $_POST[’username’];

}

?>

盡管在這種情況下可以用正則表達(dá)式,但使用PHP內(nèi)置函數(shù)是更完美的。這些函數(shù)包含錯誤的可能性要比你自已寫的代碼出錯的可能性要低得多,而且在過濾邏輯中的一個錯誤幾乎就意味著一個安全漏洞。

標(biāo)簽: PHP
相關(guān)文章:
主站蜘蛛池模板: 复合土工膜厂家|hdpe防渗土工膜|复合防渗土工布|玻璃纤维|双向塑料土工格栅-安徽路建新材料有限公司 | 论文查重_免费论文查重_知网学术不端论文查重检测系统入口_论文查重软件 | 广州冷却塔维修厂家_冷却塔修理_凉水塔风机电机填料抢修-广东康明节能空调有限公司 | 液压压力机,液压折弯机,液压剪板机,模锻液压机-鲁南新力机床有限公司 | 常州律师事务所_常州律所_常州律师-江苏乐天律师事务所 | 房车价格_依维柯/大通/东风御风/福特全顺/江铃图片_云梯搬家车厂家-程力专用汽车股份有限公司 | 流水线电子称-钰恒-上下限报警电子秤-上海宿衡实业有限公司 | 江门流水线|江门工作台|江门市伟涛行工业设备有限公司 | bng防爆挠性连接管-定做金属防爆挠性管-依客思防爆科技 | 武汉高低温试验机-现货恒温恒湿试验箱-高低温湿热交变箱价格-湖北高天试验设备 | 粉末包装机,拆包机厂家,价格-上海强牛包装机械设备有限公司 | 温州食堂承包 - 温州市尚膳餐饮管理有限公司 | 中宏网-今日新闻-财经新闻| Brotu | 关注AI,Web3.0,VR/AR,GPT,元宇宙区块链数字产业 | 最新电影-好看的电视剧大全-朝夕电影网 | 泰来华顿液氮罐,美国MVE液氮罐,自增压液氮罐,定制液氮生物容器,进口杜瓦瓶-上海京灿精密机械有限公司 | 鹤壁创新仪器公司-全自动量热仪,定硫仪,煤炭测硫仪,灰熔点测定仪,快速自动测氢仪,工业分析仪,煤质化验仪器 | IP检测-检测您的IP质量 | 承插管件_不锈钢承插管件_锻钢高压管件-温州科正阀门管件有限公司 | 高压包-点火器-高压发生器-点火变压器-江苏天网 | 全自动翻转振荡器-浸出式水平振荡器厂家-土壤干燥箱价格-常州普天仪器 | 酒精检测棒,数显温湿度计,酒安酒精测试仪,酒精检测仪,呼气式酒精检测仪-郑州欧诺仪器有限公司 | 烘干设备-热泵烘干机_广东雄贵能源设备有限公司 | 圆窗水平仪|伊莉莎冈特elesa+ganter | 气动机械手-搬运机械手-气动助力机械手-山东精瑞自动化设备有限公司 | 找培训机构_找学习课程_励普教育 | 成都亚克力制品,PVC板,双色板雕刻加工,亚克力门牌,亚克力标牌,水晶字雕刻制作-零贰捌广告 | GEDORE扭力螺丝刀-GORDON防静电刷-CHEMTRONICS吸锡线-上海卓君电子有限公司 | 武汉森源蓝天环境科技工程有限公司-为环境污染治理提供协同解决方案 | 武汉高温老化房,恒温恒湿试验箱,冷热冲击试验箱-武汉安德信检测设备有限公司 | 篮球地板厂家_舞台木地板品牌_体育运动地板厂家_凯洁地板 | 海水晶,海水素,海水晶价格-潍坊滨海经济开发区强隆海水晶厂 | 托盘租赁_塑料托盘租赁_托盘出租_栈板出租_青岛托盘租赁-优胜必达 | 色油机-色母机-失重|称重式混料机-称重机-米重机-拌料机-[东莞同锐机械]精密计量科技制造商 | 金属抛光机-磁悬浮抛光机-磁力研磨机-磁力清洗机 - 苏州冠古科技 | 石家庄律师_石家庄刑事辩护律师_石家庄取保候审-河北万垚律师事务所 | 浙江工业冷却塔-菱电冷却塔厂家 - 浙江菱电冷却设备有限公司 | 拉卡拉POS机官网 - 官方直营POS机办理|在线免费领取 | 北京律师咨询_知名专业北京律师事务所_免费法律咨询 | 河南空气能热水器-洛阳空气能采暖-洛阳太阳能热水工程-洛阳润达高科空气能商行 | 亚克力制品定制,上海嘉定有机玻璃加工制作生产厂家—官网 |