CGI圖文說明教程(9)編寫安全的CGI腳本
發(fā)表時(shí)間:2024-05-15 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]編寫安全的CGI腳本 不管在什么時(shí)候,一個(gè)程序與網(wǎng)絡(luò)客戶端聯(lián)系的時(shí)候,就有可能客戶端會(huì)攻擊這個(gè)程序以獲得未授權(quán)的訪問。即使是無惡意地看看你的腳本也會(huì)你的系統(tǒng)的完整型構(gòu)成危險(xiǎn)。出于這種想法,本節(jié)教程將教你編寫安全的腳本以避免任何的攻擊。 首先要注意eval語句。PERL和Bourne shell...
編寫安全的CGI腳本
不管在什么時(shí)候,一個(gè)程序與網(wǎng)絡(luò)客戶端聯(lián)系的時(shí)候,就有可能客戶端會(huì)攻擊這個(gè)程序以獲得未授權(quán)的訪問。即使是無惡意地看看你的腳本也會(huì)你的系統(tǒng)的完整型構(gòu)成危險(xiǎn)。出于這種想法,本節(jié)教程將教你編寫安全的腳本以避免任何的攻擊。
首先要注意eval語句。PERL和Bourne shell語言為用戶提供了一個(gè)eval命令,它允許你構(gòu)造一個(gè)字符串并且有個(gè)注釋器來執(zhí)行這個(gè)字符串。這是一個(gè)不安全的隱患。我們來觀察一下以下的語句,它是用Bource shell編寫的:
eval `echo $QUERY_STRING awk 'BEGIN{RS="&"} {printf "QS_%s\n",$1}' `
這條語句將查詢字符串轉(zhuǎn)換未一系列的可變的設(shè)置命令。但是不幸的是,這個(gè)腳本可以通過發(fā)送給它一個(gè)以逗號(hào)”;”開頭的查詢字符串來攻擊?纯催@有多么的危險(xiǎn)!
其次,不要委任客戶端做任何事情。一個(gè)品德好的客戶端將會(huì)避免發(fā)送任何帶有攻擊性的查詢字符串給Bourne shell,這樣就會(huì)避免腳本錯(cuò)誤解釋字符串而導(dǎo)致一些不安全的事情。但是,”防人之心不可無”,對(duì)于哪些品德惡劣的客戶端可能就會(huì)使用一些特殊的字符串來混淆你的腳本以獲得未授權(quán)的訪問。所以一定不要委托客戶端做任何事情。
還要十分注意popen()和system()的使用。如果你使用任何來自客戶端的數(shù)據(jù)構(gòu)造一個(gè)命令行來調(diào)用popen()或者system(),要確信在任何字符之前加一個(gè)反斜桿,因?yàn)檫@樣會(huì)在調(diào)用函數(shù)之前給Bourne shell以特殊的意義。具體做法你可以利用簡(jiǎn)短的C函數(shù)來實(shí)現(xiàn)。
最后,為了安全起見,關(guān)閉服務(wù)端附件(SSI)。如果很不幸,你的服務(wù)器支持SSI,那么請(qǐng)一定要為你的腳本目錄關(guān)閉它!這個(gè)SSI可能被客戶端濫用,他們可以偷看到他們發(fā)送的字符串直接輸出的腳本。
本腳本只是概括性質(zhì)地介紹安全的措施,如果有知道關(guān)于安全和WWW的問題,你可以參見一些WWW安全常見問題文本(FAQ)。