廣告廣告
  加入我的最愛 設為首頁 風格修改
首頁 首尾
 手機版   訂閱   地圖  簡體 
您是第 2547 個閱讀者
 
發表文章 發表投票 回覆文章
  可列印版   加為IE收藏   收藏主題   上一主題 | 下一主題   
t0306894 手機
個人文章 個人相簿 個人日記 個人地圖
特殊貢獻獎
頭銜:
版主
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片
推文 x0
[PHP][教學] PHP和網路安全組織(OWASP)十大安全漏洞
PHP和網路安全組織(OWASP)十大安全漏洞
網絡安全組織--開放網絡應用安全計劃發布一個有用的檔案,列舉了他們認為的網絡應用程式十大安全漏洞
這些漏洞能夠,當然也包含在PHP應用程式中。這裡是關於如何避免它們的一些提示。我將包含相關鏈接及參考出處。

1、未經認證的參數
最重要的是,關閉register_globals.在PHP4.2.0或者更新的版本中,這個配置設置預設的是關閉的。通過全域的陣列($_GET、$_POST和 $_COOKIE),從URL、表單和cookie(個人隱密資料)存儲數值。
在你通過全域的陣列使用數值之前,驗證他們以確認他們沒有包含非預期的輸入。如果你已經知道你需要何種類型的數值,還要確信它符合預期格式。例如,如果你期望一個美國郵政編碼,就要確信你的數值是五位數或一個五位數字、連字符(-)和四位附加數字。一般,正規表達式最容易驗證這樣的數據。
如果你期待從cookie(個人隱密資料)或者隱藏表單接收數據,在發送到一個客戶端之前,請通過發送這個數據的hash(大陸一般譯為“哈希”或“散列”)值和一個加密字連同數據一起的方式,以確信它沒有被篡改。將hash連同數據一起放在一個隱藏的表單(或者放在cookie裡面)。當你接收到數據和hash時,重新hash數據並確定新的hash匹配舊的hash。
如果用戶改變cookie裡的帳號值,這兩個hash就不匹配。這種方法的成功顯然取決於保持保密數據的保密,所以把它放在一個任何人都不能讀的文件裡並周期性地改變它。(但是記住,如果你改變了它,分布在cookie裡的老的hash也許不再有效。)

2、不健全的訪問控制
使用PEAR模塊代替你自己的訪問控制策略。對於你來說,Auth是基於cookie的認證,而Auth_HTTP是基於瀏覽器的認證。

3、不健全的帳號和session(交談期,大陸譯為“會話”)管理
  為了安全,使用PHP內置的session管理函數,即標准session管理。不管怎樣,注意你的服務器被如何配置去存儲session信息。例如,如果session內容存儲在/tmp目錄下任何人都可讀的文件中,這樣任何登錄該服務器的用戶能夠看到所有session的內容。請存儲該session在一個數據庫裡面,或者文件系統裡面只有指定的用戶可以訪問的地方。
  為了防止網絡嗅探器探查出session序號,可以使用透過SSL來傳送session。當你使用SSL連接時,你不需要做任何其他對PHP的特殊操作,但是你需要另外配置你的WEB服務器。

4、跨平台執行腳本的瑕疵(Cross-Site Scripting 簡稱XSS)
對於來自你的程式外部,過濾它們之前,不要顯示任何信息,在隱藏表單區域、查詢字串或普通頁面輸出中內包含變數之前,先過濾它們。
PHP提供了許多工具過濾不可信數據:
htmlspecialchars()   轉換& > " < 到他們的等價的HTML代碼,通過使用 ENT_QUOTES 作為第二個參數還能夠轉換單引號'。

strtr()過濾你想要過濾的任何字符。通過strtr()實現過濾和替換字符陣列。把( 和 )轉換為他們等價的HTML代碼,作為防止XSS攻擊的辦法
$safer = strtr($untrusted, array('(' => '(', ')' => ')'));

strip_tags()從一個字串中移除HTML和PHP標記。

utf8_decode()把一個字串中的 ISO-8859-1 字符集改成使用Unicode UTF-8方式編碼為單字節ASCII字符。一些XSS攻擊者嘗試隱藏他們的攻擊代碼為Unicode編碼。你能使用utf8_decode() 去除這些Unicode編碼。

5、緩衝區溢出

You can't allocate memory at runtime in PHP and their are no pointers like in C so your PHP code, however sloppy it may be, won't have any buffer overflows.(這個地方可能翻譯不對)

你不能在PHP的執行期間配置其記憶體,在PHP程式中,也沒有像C語言一樣的指標。然而可能會有些些弱點,將不會有任何的緩衝區溢出。
你需要密切注意什麼?不管怎樣,是PHP自身和它的擴展緩衝區溢出.訂閱PHP-announce郵件列表以保證你的PHP為最新版本和打了最新補丁。

6、被植入命令的缺陷
  當你顯示未過濾的、未被脫逸過的(逃逸,意為把特殊字符轉換成HTML方式表示,如'表示為'(譯者注))惡意的內容到用戶的瀏覽器時,XSS(跨站腳本)缺陷就會產生。未過濾的、未被脫逸過的命令到一個外部進程或者數據庫。要防止被植入命令的缺陷,除確認輸入數據之外,同樣要在傳送它到一個擴展進程或數據庫裡之前脫逸用戶的輸入。
  如果你要傳遞用戶輸入到shell(操作系統裡的命令解釋程式--譯者注)(經過一個像exec()、system()或者其反向操作),首先,問你自己是否真的需要它。PHP自身函數就可以完成大多數的文件操作。如果你絕對地、一定地需要運行一個名字和參數來源於可信的輸入的外部程式,請使用escapeshellcmd()脫逸程式名,用escapeshellarg()脫逸參數。

  在執行一個外部程式或操作下個外部文件之前,你也必須使用realpath()規範它的路徑名。它展開所有符號鏈接,翻譯“.”為當前目錄,“..”為上一層目錄,以及移除重復的路徑分隔符。一旦一個路徑名被規範,你能夠測試它以保證它滿足確定的條件,比如要求在WEB服務器檔案根目錄或者用戶的主目錄中。
  如果你通過用戶輸入一個SQL查詢,在放入查詢中之前,用addslashes()脫逸其輸入。用mysql_real_escape_string()脫逸字串, 如果是PHP4.3.0以前版本則使用mysql_escape_string()。
如果你使用PEAR DB 數據庫抽象層,你能夠使用DB::quote()方法或者使用像?這樣的查詢佔位符號,自動地脫逸該值替代佔位符號。

7、關於錯誤處理的問題
如果用戶(或者攻擊者)能夠看到PHP返回的原始錯誤信息(包含你的數據庫、或者外部程式),他們便能夠推測你的系統結構以及你使用的軟體。這些有根據的推測使攻擊者更容易入侵你的系統。錯誤信息不能包含任何描述性的系統信息。使用下列配置指令,告訴PHP將錯誤信息在你服務器的錯誤日誌裡而不是將它們顯示給用戶:

log_errors = On
display_errors = Off

8. 不可信的用戶和密碼
mcrypt擴展提供了許多流行的加密算法。使用mcrypt代替你自己的加密方案。同樣,注意你的加密密碼存放地點。如果一個攻擊者能夠容易輕易地獲得解密密碼,那麼世界上最健壯的算法也是沒有意義的。如果不管怎樣,你一定需要存儲你的密碼,讓它們和解密數據分開存放。更好的辦法是,如果一些東西被解密,不要存儲密碼和提示用戶(當然,如果你提示一個網上用戶一些敏感數據(比如加密密碼),在SSL裡面那個提示和用戶的確認都能夠省略)。

9、遠程管理缺陷
如果可能的話,使用一個SSL連接以運行遠程管理工具,以防止對密碼和內容的監聽。
如果你安裝了有一個遠程管理組件的第三方軟件,修改缺省的用戶名和密碼。如果可能,最好改變管理URL。用這個管理工具進行管理,在另一個不同的WEB服務器上運行比在公共的WEB服務器運行將是一個更好的主意。

10 網站和應用服務器錯誤配置
在訂閱的php-announce(PHP通告)郵件列表中,保持PHP修補和安全問題在最上面。自從讓攻擊者看到你的代碼之後,停止使用自動PHP資源顯示管理器(AddType application/x-httpd-php-source .phps)。關於分布在PHP中的兩個示例php.ini文件(php.ini-dist和php.ini-recommended),
使用php.ini-recommended作為你的網站配置的樣本。



介紹大家一個透過facebook來玩的網頁遊戲 : 海盜王
獻花 x0 回到頂端 [樓 主] From:台灣中華電信 | Posted:2005-02-14 14:53 |

首頁  發表文章 發表投票 回覆文章
Powered by PHPWind v1.3.6
Copyright © 2003-04 PHPWind
Processed in 0.069453 second(s),query:15 Gzip disabled
本站由 瀛睿律師事務所 擔任常年法律顧問 | 免責聲明 | 本網站已依台灣網站內容分級規定處理 | 連絡我們 | 訪客留言