謹慎使用==比較運算符,因為PHP是無類型的,但底層的C實現引擎是有類型的。最終都有類型轉換,比如0==”abc”結果是true,這可能不是我們想要的
在語義上是某種明確類型的地方都要使用相關函數明確轉換一下:intval。。。
在一個地方統一定義PHP的文件包含路徑,這樣在項目的各個地方包含文件的時候不要帶上路徑,只要文件名就行了,便於文件的轉移
PHP應用問題還有一個就是不要直接在函數,類方法中使用PHP的全局變量,而應該是提供一個單獨訪問全局變量的代理,可以是對象,也可以只是一個簡單的函數,如果是在類中訪問全局變量,修改為使用代理全局變量的對象,這樣兩個對象之間有明確的依賴關系,不要在函數內部直接使用全局變量或者global 外面的變量,一個函數只應該使用函數參數傳遞進來的數據。自己盡量不要使用全局的變量然後到處global, 注意表單的重復提交。這可以采用令牌。
決定系統是單入口還是多入口
注意編碼:文件存儲編碼,頁面編碼,數據庫編碼,用戶的操作系統編碼(用戶直接在地址上輸入內容時FF,Opera會把內容根據操作系統的編碼urlencode編碼,而IE6原樣)
不要暴露文件的路徑
提交請求後用戶關掉浏覽器或者點擊浏覽器的停止或者其它原因網絡斷掉後PHP是要繼續處理還是停止處理,PHP如何知道以上情況:connection-handling(ignore_user_abort,register_shutdown_function,connection_status…)
時區問題,如果應用是分布式的話
explode應用在一個空值上將產生一個包含1項內容的數組:array(”"),但後者不是為false。也就是:null是假值,但explode(’,',null)後是真值,所以要小心if(explode(’,',$var))這種條件
$var = null;isset($var)結果為false。
PHP應用問題之安全問題
驗證輸入,不要相信來自用戶的數據(GET,POST,COOKIE),對於一個PHP應用,應該統一的對這些數據進行過濾處理,比如編碼html標簽防止XSS,防止sql注入。
同時對於需要驗證的內容,PHP要在驗證一次,因為客戶端的各種驗證都可以很容易的跳過(偽表單,禁用js及firebug這些可以隨便修改html的工具)。
要注意用戶提交的數據大小。比如post數據或者get數據太大可能會有緩沖溢出問題
小心服務器的非PHP文件。如果應用可以上傳或者下載文件,要避免直接通過文件名讀取文件而文件名是用戶提供的情況,可能用戶會提供一些自己不該看到的文件,但PHP程序卻讀出來了。同時不要在返回的html中顯示文件路徑,文件的保存路徑不應讓用戶看到,用戶可能會根據這些路徑猜出其它自己不該看到的文件
如果會話是保存在文件中的,並且web服務器上還有其它未知的用戶(比如出租的web主機),應該修改會話文件的保存位置,或者把會話通過PHP的會話handler寫到數據庫中,因為會話默認保存在臨時目錄中,其它人可以訪問到,如果會話中保存了密碼之類的信息就很危險。
以上就是PHP應用問題的相關解決辦法。