永远不要相信用户的输入
生活随笔
收集整理的這篇文章主要介紹了
永远不要相信用户的输入
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
| “永遠(yuǎn)不要相信用戶(hù)的輸入”是對(duì)設(shè)計(jì)人員和編碼人員說(shuō)的,是進(jìn)行安全設(shè)計(jì)和安全編碼的重要準(zhǔn)則。換句話(huà)說(shuō),任何輸入數(shù)據(jù)在證明其無(wú)害之前,都是有害的。許多危險(xiǎn)的漏洞就是因?yàn)檫^(guò)于相信用戶(hù)的輸入是善意的而導(dǎo)致的。 ????文章“我的網(wǎng)絡(luò)安全觀點(diǎn)之六:漏洞無(wú)處不在”中的例子中,程序直接引用輸入數(shù)據(jù)作為頁(yè)面模板文件名裝載并顯示處理,這是一個(gè)典型的信息泄漏的漏洞。還有一種常見(jiàn)的漏洞是直接引用輸入數(shù)據(jù)構(gòu)造查詢(xún)數(shù)據(jù)庫(kù)的SQL語(yǔ)句,下面舉一個(gè)例子(稍有黑客常識(shí)的人都應(yīng)該熟悉這個(gè)例子): ????以下是一段驗(yàn)證用戶(hù)密碼的程序: =========================================================================== ... q.SQL.Clear; q.SQL.Add('SELECT?COUNT(*)?FROM?EMP?' ??+?'?WHERE?CODE?=?'''?+?Request.ContentFields.Values['UserCode']?+?'''' ??+?'?AND?PASSWORD?=?'''?+?Request.ContentFields.Values['Password']?+?''''); q.Open; if?q.Fields[0].AsInteger?>?0?then ??//合法用戶(hù) else ??//非法用戶(hù); q.Close;? ... =========================================================================== ????攻擊者不需要知道合法用戶(hù)的密碼就能直接進(jìn)入系統(tǒng),攻擊方法是在登錄頁(yè)面的用戶(hù)名輸入框中隨便輸入一個(gè)字符串例如aaa,在密碼輸入框中輸入 1'?or?'1'='1 按照此輸入,程序中的SQL語(yǔ)句變?yōu)?br /> SELECT?COUNT(*)?FROM?EMP WHERE?CODE?=?'aaa' AND?PASSWORD?=?'1'?or?'1'='1' 查詢(xún)條件變成了恒等式,于是通過(guò)了驗(yàn)證。造成這個(gè)漏洞的原因在于程序?qū)斎霐?shù)據(jù)未作處理直接將其用于SQL語(yǔ)句。如果程序中某個(gè)UPDATE語(yǔ)句或DELETE語(yǔ)句存在類(lèi)似漏洞,則有可能造成數(shù)據(jù)丟失。為修補(bǔ)以上漏洞,應(yīng)該對(duì)用戶(hù)輸入數(shù)據(jù)進(jìn)行規(guī)范性檢查和過(guò)濾。然后以如下方式進(jìn)行驗(yàn)證: =========================================================================== ... sUserCode?:=?對(duì)Request.ContentFields.Values['UserCode']進(jìn)行規(guī)范后的結(jié)果; sPassword?:=?對(duì)Request.ContentFields.Values['Password']進(jìn)行規(guī)范后的結(jié)果; q.SQL.Clear; q.SQL.Add('SELECT?PASSWORD?FROM?EMP?' ??+?'?WHERE?CODE?=?'?+?QuotedStr(sUserCode)); q.Open; if?q.FieldByName('PASSWORD')?=?sPassword?then ??//合法用戶(hù) else ??//非法用戶(hù); q.Close;? ... =========================================================================== ????以上程序中,QuotedStr實(shí)際上也是對(duì)數(shù)據(jù)的一種規(guī)范處理。 ????(注:我會(huì)制訂關(guān)于用戶(hù)輸入數(shù)據(jù)檢查和處理的規(guī)范,加進(jìn)我們的詳細(xì)設(shè)計(jì)規(guī)范和編碼規(guī)范) ???? ????如果我們能對(duì)所有用戶(hù)輸入進(jìn)行詳細(xì)的檢查,那么軟件中的漏洞就會(huì)大大減少。因?yàn)闊o(wú)論是什么樣的漏洞,攻擊者要利用此漏洞實(shí)施攻擊,總要向系統(tǒng)輸入一些數(shù)據(jù)才能實(shí)施攻擊,堵住了非法和惡意的輸入,就堵住了很多類(lèi)型的攻擊。 ???? ????對(duì)于WEB程序開(kāi)發(fā)人員來(lái)說(shuō),“永遠(yuǎn)不要相信用戶(hù)的輸入”這條準(zhǔn)則可以引申為“永遠(yuǎn)不要相信客戶(hù)端信息”,客戶(hù)端信息包括請(qǐng)求的URL、cookie、提交的表單等,總之TWebRequest的所有屬性都不要相信。例如,有的設(shè)計(jì)者期望通使用客戶(hù)端的JavaScript腳本進(jìn)行輸入數(shù)據(jù)檢查,在服務(wù)端就省略了檢查,這種做法是錯(cuò)誤的。因?yàn)镴avaScript可能被瀏覽器禁用,或者被客戶(hù)端防火墻禁用,或者某種特殊的瀏覽器忽略了你的JavaScript,這些都會(huì)使客戶(hù)端JavaScript失效或部分失效。正確的做法是在客戶(hù)端和服務(wù)端都作相同的檢查,客戶(hù)端的檢查的目的是為了界面的友好、節(jié)省用戶(hù)的時(shí)間,服務(wù)端的檢查才是為了數(shù)據(jù)的完整和安全。 ????有些開(kāi)發(fā)人員會(huì)說(shuō)對(duì)輸入數(shù)據(jù)進(jìn)行如此多的檢查會(huì)影響性能,實(shí)際上,大多數(shù)輸入檢查并不對(duì)性能造成大的損害,即使有損害,一個(gè)稍慢但是相對(duì)安全的系統(tǒng)也比一個(gè)快速但容易受到攻擊的系統(tǒng)要好。如果客戶(hù)對(duì)你的系統(tǒng)性能不滿(mǎn)意,應(yīng)尋找其它途徑提高性能,不要通過(guò)減少安全檢查來(lái)提高性能,因?yàn)楫?dāng)客戶(hù)的系統(tǒng)因?yàn)槁┒幢还テ埔院?#xff0c;你面臨的就不是幾句抱怨,而是一場(chǎng)災(zāi)難了。 ????對(duì)待用戶(hù)輸入,實(shí)際上也是一個(gè)轉(zhuǎn)變觀念的問(wèn)題,就像我在“我的網(wǎng)絡(luò)安全觀點(diǎn)之五:敵人無(wú)處不在”中描述的,周?chē)氖澜绮豢伤甲h的充滿(mǎn)了敵意,我們必須懷疑一切,以前那種充滿(mǎn)善意和無(wú)知的程序運(yùn)行環(huán)境一去不復(fù)返了,取而代之的是惡意和數(shù)不清的黑客工具。 |
總結(jié)
以上是生活随笔為你收集整理的永远不要相信用户的输入的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 个简单C++程序反汇编解析 (Rev.
- 下一篇: Java过滤特殊字符的正则表达式