1 全局變量
PHP中的許多預定義變量都是“超全局的”,這意味着它們在一個腳本的全部作用域中
都可用。在函數或方法中無需執行 global $variable; 就可以訪問它們。
超全局變量都如下:
$GLOBALS
$GLOBALS 超級全局變量數組可以認爲是超級全局變量的超集,包含全局作用域
內的所有變量。$GLOBALS這種全局變量用於在PHP腳本中的任意位置訪問全局變
量(從函數或方法中均可),PHP在名爲$GLOBALS[index] 的數組中存儲了所有
全局變量。變量的名字就是數組的鍵。執行下面的代碼可以查看$GLOBALS中所有
的變量。
print ' <pre>' ;
print_r ($GLOBALS);
print ' </pre>' ;
$_SERVER
$_SERVER 這種超全局變量保存關於報頭、路徑和腳本位置的信息。比如:
$_SERVER['PHP_SELF'] 返回當前執行腳本的文件名。
$_SERVER['GATEWAY_INTERFACE'] 返回服務器使用的 CGI 規範的版本。
$_SERVER['SERVER_ADDR'] 返回當前運行腳本所在的服務器的 IP 地址。
$_SERVER['SERVER_NAME'] 返回當前運行腳本所在的服務器的主機名(比如 www.xxx.com)。
$_SERVER['SERVER_SOFTWARE'] 返回服務器標識字符串(比如 Apache/2.2.24)。
$_SERVER['SERVER_PROTOCOL'] 返回請求頁面時通信協議的名稱和版本(例如,“HTTP/1.0”)。
$_SERVER['REQUEST_METHOD'] 返回訪問頁面使用的請求方法(例如 POST)。
$_GET
$_GET 也可用於收集提交 HTML 表單 (method="get") 之後的表單數據。
$_GET 也可以收集 URL 中的發送的數據。
$_POST
$_POST 廣泛用於收集提交 method="post" 的 HTML 表單後的表單數據。
$_POST 也常用於傳遞變量。
$_FILES
$_FILES超級全局變量包含通過POST方法向服務器上傳的數據的有關信息。
$_COOKIE
$_COOKIE超級全局變量存儲了通過HTTP cookie傳遞到腳本的信息。
$_SESSION
$_SESSION 超級全局變量包含與所有會話有關的信息。註冊會話信息能爲
你提供便利,這樣就能在整個網站中引用這些會話信息,而無需通過GET
或POST顯示的傳遞數據。
$_REQUEST
$_REQUEST 用於收集 HTML 表單提交的數據。
$_ENV
$_ENV超級全局變量提供PHP解析所在服務器環境的有關信息。此數組中的變
量包括:
$_ENV[ 'HOSTNAME' ] 服務器的主機名
$_ENV[ 'SHELL' ] 系統 shell
regeister_globals=off
register_globals 是php中的一個控制選項,可以設置成off或者on ,默認爲off
決定是否將 EGPCS(Environment,GET,POST,Cookie,Server)變量註冊爲全局變量。
如果 register_globals打開的話, 客戶端提交的數據中含有GLOBALS變量名,就會覆蓋服務器上的
$GLOBALS變量.所以這段代碼, 就是判斷, 如果提交的數據中有GLOBALS變量名, 就終止程序。
由此引起的安全問題成爲PHP的“自動全局變量漏洞”,所以我們要堅決把register_globals關掉。
並且使用 $_GET, $_POST, $_COOKIE 而非 $_REQUEST 。
gpc[$_GET,$_POST,$_COOKIE]
magic_quotes_gpc函數在php中的作用是判斷解析用戶提示的數據,如包括有:
post、get、cookie過來的數據增加轉義字符“\”,以確保這些數據不會引起程
序,特別是數據庫語句因爲特殊字符引起的污染而出現致命的錯誤
2 危險函數
extract()
extract(array,extract_rules,prefix)
extract函數用來將一個數字分解成多個變量直接使用。PHP extract() 函數從
數組中把變量導入到當前的符號表中。對於數組中的每個元素,鍵名用於變量
名,鍵值用於變量值。第二個參數type用於指定當某個變量已經存在,而數組
中又有同名元素時,extract() 函數如何對待這樣的衝突。EXTR_OVERWRITE 默認。
如果有衝突,則覆蓋已有的變量。
如何防止這種漏洞,可以在使用的時候加上參數EXTR_SKIP,這個參數表示如果有衝突,不覆蓋已有的變量或者還有EXTR_PREFIX_SAME - 如果有衝突,在變量名
前加上前綴 prefix。
parse_str() 函數把查詢字符串解析到變量中,主要用於頁面之間傳值,參數。
它在註冊之前不進行驗證當前變量是否已經存在,因此將會出現變量覆蓋漏洞。
import_request_variables 函數可以在register_global = off 時,把 GET/POST/
Cookie變量導入全局作用域中。不管當前變量是否已經存在,因此可能出現變量
覆蓋漏洞。
stripslashes() 函數刪除由 addslashes() 函數添加的反斜槓。
函數可用於清理從數據庫中或者從 HTML 表單中取回的數據。
這兩個函數都能夠完成各種字符集間的轉換,是php編程中不可缺少的基礎函數庫。
編碼轉換之後,如果還有沒有過濾的字符可能會存在注入,執行,泄露等漏洞。
PHP中一個特殊的函數魔術函數,它在引用的過程中只有在傳遞$_GET,$_POST,
$_COOKIE時纔會發生作用。可以不對輸入和輸出數據庫的字符串數據作
addslashes()和stripslashes()的操作,數據也會正常顯示。
如果此時你對輸入的數據作了addslashes()處理,
那麼在輸出的時候就必須使用stripslashes()去掉多餘的反斜槓。
必須使用addslashes()對輸入數據進行處理,但並不需要使用stripslashes()
格式化輸出.因爲addslashes函數並未將反斜槓一起寫入數據庫,只是幫助
mysql完成了sql語句的執行。
val() 函數把字符串按照 PHP 代碼來計算。
該字符串必須是合法的 PHP 代碼,且必須以分號結尾。
如果沒有在代碼字符串中調用 return 語句,則返回 NULL。
如果代碼中存在解析錯誤,則 eval() 函數返回 false。
該函數代碼執行,需要參數/e函數主要用於處理字符串,因此出現最多的漏洞就是
在字符串處理中。參數過濾不嚴容易出現漏洞。
函數本身就是把字符串參數當做代碼動態解析執行。參數過濾不嚴容易出現漏洞。
該函數的功能是調用函數,多用於框架裏面調用函數。所以小的程序
出現的機率小,大框架程序出現的多一些。參數過濾不嚴容易出現漏洞。
函數本身就是把字符串參數當做代碼動態解析執行。參數過濾不嚴容易出現漏洞。
在php中,函數create_function主要用來創建匿名函數,有時候匿名函數可以發揮它
的作用。如果沒有嚴格對參數傳遞進行過濾,攻擊者可以構造特殊字符串傳遞給
create_function()執行任意命令。
刪除當前用戶對應的session文件以及釋放sessionid,內存中的$_SESSION變量內容
依然保留。session的生命週期從用戶連上服務器後開始,在用戶關掉瀏覽器或是
註銷時用戶session_destroy函數刪除session數據時結束。主要預防session劫持漏洞。
rand() 函數默認使用 libc隨機數發生器。在某些平臺下(例如 Windows)RAND_MAX只有 32768。
如果需要的範圍大於 32768,那麼指定 min 和 max 參數就可以生成大於 RAND_MAX 的數了,或者
考慮用 mt_rand() 來替代它。mt_rand()函數是非正式用來替換它的。該函數用了Mersenne Twister
中已知的特性作爲隨機數發生器,mt_rand() 可以產生隨機數值的平均速度比 libc 提供的 rand() 快四倍。
PHP unset()函數是用來銷燬變量的,但很多時候,這個函數只把變量給銷燬了,
內存中存放的該變量的值仍然沒有銷燬,也就是沒能達到我們想要的釋放內存
的效果。可以用$變量=null 的方法來釋放其內存 或者 將兩個變量都 unset();
3 數據檢查
命令參數
對於用戶可能存在的命令執行代碼或者函數進行參數檢查,嚴格過濾。
檢查php環境搭建時候的相關配置文件是否正確和安全,清理刪除。
數據範圍是否越界,代碼安全編寫校驗。
php環境下面的大量全局變量進行檢測。
php搭建後得配置文件和系統記錄的關鍵文件,防止泄露。
4 工具檢查
1.CodeScan
http://www.codescan.com
這個比較老牌了。市面上流出的版本好像就是1.6和1.9的crack,
商業軟件。不過GUI界面操作起來很方便。這裏也不多說什麼,
主要是Include的提示設置,裝過軟件自己看看就知道了。
http://rips-scanner.sourceforge.net/
PHP寫的,需要環境,直接解壓到wwwroot就好了。不適合掃描整個文件夾項目,或者要
修改PHP配置,把代碼執行超時的時間設置大一點。總體來說還是很不錯。
http://phpxref.com
嚴格的說PHPxref也是做開發的好幫手,它能將某一個程序(如Wordpress)中所有的函數、
變量、常量等分類記錄,生成一個HTML網頁列表,你可以輕鬆地在這個列表中找到某個
函數在什麼位置被定義,在什麼位置被引用。所以說非常適合大型項目。
同時還是最主要的,It’s free.
http://www.fortify.com/security-resources/rats.jsp
工具採用的就是詞法分析技術。通過詞法分析的工作原理,會發現該技術存在較爲
嚴重的缺陷。第一,它只能檢測較少的已知問題,僅僅對 API 中的一些潛在的危險
函數進行檢查,並不檢測其他的安全問題。第二,它僅僅是對己知問題函數進行匹配,
沒有對這些問題進行進一步的確認。
http://tel1.hackol.com/2010/hackol.com-4910-XSSDetectSetup.rar
一款微軟公司爲開發人員提供針對跨站腳本攻擊的靜態分析工具SSDetect是
精簡版的.NET代碼分析工具,原本供微軟內部人員尋找應用軟件的安全漏洞
之用,大概是受開源思想影響,現在已經可以免費下載了。
6. yasca
http://www.scovetta.com/yasca.html用來尋找安全漏洞,在程序的源代碼中檢測代碼質量、性能以及一致性的軟件。
它集成了其它開源項目,其中包括FindBugs,PMD的,JLint,JavaScript的林特
PHPLint,Cppcheck,並掃描某些文件類型,以及自定義掃描書面的Yasca。這是
一個命令行工具,與報告中生成的HTML,CSV格式,XML的,的SQLite和其他格式。