天天看點

如何建構你的安全php程式 PHP安全防範知識點滴分享

如何建構你的安全php程式 PHP安全防範知識點滴分享

2012-10-24 13:38:01 | 14次閱讀 | 評論:0 條 | itokit
如何建構你的安全php程式 PHP安全防範知識點滴分享
每個php開發人員都是從開始的安全白癡到經過慘痛經曆過,才會注意php安全,在這裡我們可以給php新手一些php安全方面的建議,由于所在公司對WEB應用程式性的重視,平台開發語言大部分也是PHP,以我在PHP開發上經驗列出幾項常見的PHP安全問題進行梳理或解決辦法。

每個php開發人員都是從開始的安全白癡到經過慘痛經曆過,才會注意php安全,在這裡我們可以給php新手一些php安全方面的建議,由于所在公司對WEB應用程式性的重視,平台開發語言大部分也是PHP,以我在PHP開發上經驗列出幾項常見的 PHP安全問題進行梳理或解決辦法。   跨站腳本攻擊(CSS or XSS, Cross Site Scripting)   這個是最常見的 POST 都要過濾可以使用   strip_tags, 删除string中所有html标簽   htmlspecialchars,隻對”<”,”>”,”;”,”’”字元進行轉義   htmlentities,對所有html進行轉義   使用者送出資料常見過程的處理流程

http://img1.itokit.com/uploadfile/2012/1024/20121024014504428.jpg

使用者送出處理過程可以從上面的連結圖檔裡詳細檢視到處理流程的。

  過濾輸入   把識别輸入做為第一步是因為如果你不知道它是什麼,你也就不能正确地過濾它。輸入是指所有源自外部的資料。例如,所有發自用戶端的是輸入,但用戶端并不是唯一的外部資料源,其它如資料庫和RSS推送等也是外部資料源。   1.永遠不要相信你的使用者。   2.Fliter input,Escape output.   由使用者輸入的資料非常容易識别,PHP用兩個超級公用數組$_GET 和$_POST來存放使用者輸入資料。其它的輸入要難識别得多,例如,$_SERVER數組中的很多元素是由用戶端所操縱的。常常很難确認$_SERVER數組中的哪些元素組成了輸入,是以,最好的方法是把整個數組看成輸入。   SQL注入問題   查詢條件盡量使用數組方式,這是更為安全的方式;   開啟資料字段類型驗證,可以對數值資料類型做強制轉換;   使用自動驗證和自動完成機制進行針對應用的自定義過濾;   會話劫持   最常見的針對會話的攻擊手段是會話劫持。它是所有攻擊者可以用來通路其它人的會話的手段的總稱。所有這些手段的第一步都是取得一個合法的會話辨別來僞裝成合法使用者,是以保證會話辨別不被洩露非常重要。   PHP自帶的函數使用注意事項   1.include(),require()和fopen(),include_once(),require_once()這些都可以遠端調用檔案:除了依靠php.ini裡的allow_url_fopen設為off禁止遠端使用檔案和open_base_dir禁止使用目錄以外的檔案外,你還得事先聲明好隻能包含哪些檔案   2.fopen(),file(),readfile(),openfile(),等也是該特别留意的地方。函數本身并沒什麼,它們的作用是去打開檔案,可是如果對變量過濾不徹底的話,就會洩露源代碼。   3.fwrite()和它的變體函數這種漏洞想想都想得出,對于使用者送出的字元沒過濾的話,寫入一段php後門又不是不可以。   4.unlink()函數,前段時間,phpwind裡任意删除檔案就是利用這個函數,對于判斷是否删除的變量沒過濾,變量可以指定為任意檔案,當然就可以删除任意檔案的變量。   5.eval(),preg_replace()函數,它們的作用是執行php代碼,如果字元串沒被經過任何過濾的話,會發生什麼呢,我就常看見一些cms裡面使用,想想,一句話的php木馬不就是根據eval()原理制作的嗎?   6.對于system()這些系統函數,你會說在php.ini裡禁止系統函數,對,這也是好辦法,可是象一些程式裡需要,那是不是就不用了呢?就像上次我看到的一套很漂亮的php相冊一樣。另外對于popen(),proc_open(),proc_close()函數你也得特别注意,盡管他們執行指令後并沒有直接的輸出,但你想這到底對黑客們有沒有用呢。再這裡php提供提供了兩個函數,escapeshellarg(),escapeshellcmd(),這兩個函數用來對抗系統函數的調用攻擊,也就是過濾。   7.禁用PHP.ini 中的register_globals。這可以防止攻擊者通行URL通路PHP指令或變量。   8.使用php.ini 裡的“安全模式”作為最終的錯誤捕捉方法,但是不能指望用它來得到充分的安全性。   9.不能依靠session.referrer_check 來進行錯誤檢查   10.使用者從應用程式 登出時,使用session_destroy 顯式地結束會話。   總之,要注意每一個細節   其他安全建議   1.有公共的操作方法做必要的安全檢查,防止使用者通過URL直接調用;   2.緩存需要使用者認證的頁面;   3.使用者的上傳檔案,做必要的安全檢查,例如上傳路徑和非法格式,官方的擴充類庫中的ORG.Net.UploadFile類提供了上傳類的安全解決方案。   4.非必要,不要開啟伺服器的目錄浏覽權限;   5.于項目進行充分的測試,不要生成業務邏輯的安全隐患(這可能是最大的安全問題);   6.保護模闆檔案,因為模闆檔案中可能會洩露資料表的字段資訊(如Smarty 裡template)源碼暴露 .inc 結尾的檔案 index.php.bak (如EditPlus等編輯器生的備份檔案)Require 或 include 的檔案使用不安全的資料   7.再次強調:不要相信不是你自己顯式聲明的資料。不要 Include 或 require 從$_GET, $_POST 或 $_COOKIE 中得到的檔案。   安全是一種相對的度量,而不是絕對的标準。   如果你在設計你的應用的時候沒有考慮安全,你命中注定将要堅持不懈的來尋找新的安全漏洞。仔細的寫程式并不能彌補糟糕的設計。     一個系統是否安全,很大程度上取決于開發人員是否關注安全。

php安全的其他方面推薦文章:

1、 PHP安全配置(1)

2、 確定PHP安全,不能違反的四條安全規則

3、 PHP安全基礎原則與方法