- 最後登錄
- 2012-8-5
- 在線時間
- 978 小時
- UID
- 275
- 閱讀權限
- 140
- 精華
- 71
- 帖子
- 3799
- 日誌
- 0
- EXP
- 6040 點
- 金幣
- 4990 個
- 註冊時間
- 2008-3-27
- 帖子
- 3799
- EXP
- 6040 點
- 金幣
- 4990 個
- 好友
- 0
- 註冊時間
- 2008-3-27
|
Discuz! 插件代碼的安全規範總的來說 PHP 還是相對安全的 Web 程序,但是由於一些代碼在處理方式上的不成熟導致了安全隱患.由於這個議題範圍太廣,所以推薦 PHPCHINA 的 Essential PHP Security -PHP安全基礎 一書給大家,希望對大家有幫助。更詳細的 PHP 安全信息可以登錄 php.net 查找。
那麼,對於插件安全究竟我們要做些什麼怎麼做?
1、變量的初始化這裡不討論 magic_quotes_gpc 和 register_globals 的設置情況,大家只要注意不要“無中生有”變量,每個變量的得到都是自己初始化過的。
2、邏輯關系清楚對於邏輯的判定不是一句話能夠說明白的,舉個簡單的例子,在判斷上傳文件的時候,我們判斷的依據是他的後綴是否在我們允許的後綴裡面,如果是允許的就執行上傳,反之就提示上傳文件後綴不對,但是如果用戶上傳的文件名是 webshell.xxx.mht(允許mht 文件上傳,mht 是一種網頁存儲格式),於是文件上傳了,在 apache 系統的默認配置下,這個文件是會用 PHP 來解析的,利用這個算是 BUG 的問題吧,小版本人就曾伙同PHP安全界知名人士(幫他匿了)對我們學校的服務器完成了入侵,並最終取得了 root 權限(目前俺們學校的服務器已經修正此問題),舉這個例子是為了說明程序處理的重要性,如果當時多一步判斷上傳的文件,也許這個安全問題就不再存在,其實這個例子來說明邏輯關系並不是很合適,但是程序處理真的是一個非常重要的部分。
3、' '與" "的區別運用單引號中,任何變量($var)、特殊轉義字符(如“\t \r \n”等)不會被解析,因此PHP的解析速度更快,轉義字符僅僅支持“\’”和“\\”這樣對單引號和反斜杠本身的轉義;
雙引號中,變量($var)值會代入字符串中,特殊轉義字符也會被解析成特定的單個字符,還有一些專門針對上述兩項特性的特殊功能性轉義,例如“\$”和“{$array[‘key’]}.這樣雖然程序編寫更加方便,但同時PHP的解析也很慢;
數組中,如果下標不是整型,而是字符串類型,請務必用單引號將下標括起,正確的寫法為 $array[‘key’],而不是 $array[key],因為不正確的寫法會使PHP解析器認為key是一個常量,進而先判斷常量是否存在,不存在時才以“key”作為下標帶入表達式中,同時出發錯誤事件,產生一條 Notice 級錯誤。
因此,在絕大多數可以使用單引號的場合,禁止使用雙引號.依據上述分析,可以或必須使用單引號的情況包括但不限於下述:
字符串為固定值,不包含“\t”等特殊轉義字符;
數組的固定下標,例如$array[‘key’];
表達式中不需要帶入變量,例如$string = ‘test’;而非$string = “test$var”;
4、數據的過濾與處理對於任何得到的數據在不能確定或者不能充分確定其來路的時候一定要進行過濾與處理,在數據進入程序運行處理階段之前,一定要保證它的準確性和正確性。
5、不要相信任何數據的準確性和正確性這條視乎是和上面一條雷同,但是即使是從數據庫中查出來的數據也一樣不能確定,比如生成 cache 文件,如果用戶 POST 的數據錯誤不是我們期望的數據,而“恰巧”生成到文件中,於是一個webshell產生了,同樣這個例子也不是很合適,我只是希望大家明白這麼一點,如果我們沒有一個很好的處理數據的方式,那麼代碼的安全崩潰也就指日可待。
6、不要妄圖直接把低版本的 Discuz! 插件直接運行由於每個大版本的升級都會帶來系統構架的一些變化,可能舊版本的插件仍然可以使用,但是或許一些不可預料的問題正在隱藏中,所以建議任何低版本的 Discuz! 插件最好是經過仔細研究之後再公告說可以適用新版本 Discuz! 插件。 |
|