PHP的核心配置詳解

一、PHP核心配置詳解php

  代碼在不一樣的環境下執行的結果也會大有不一樣,可能就由於一個配置問題,致使一個很是高危的漏洞可以利用;也可能你已經找到的一個漏洞就由於你的配置問題,致使你鼓搗好久都沒法構形成功的漏洞利用代碼。mysql

  然而,在不一樣的PHP版本中配置指令也有不同的地方,新版可能會增長或者刪除部分指令,改變指令默認設置或者固定設置指令,才能高效地挖掘到高質量的漏洞。程序員


PHP_IN_*常量的定義sql

常量 含義
PHP_IN_USER  該配置選項可在用戶的PHP腳本或windows註冊表中設置
PHP_IN_PERDIR  該配置選項可在php.ini. .htaccess或httpd.conf中設置
PHP_IN_SYSTEM  該配置選項可在php.ini或httpd.conf中設置
PHP_IN_ALL  該配置選項可在任何地方設置
php.in only  該配置選項可僅在php.ini中配置

 


 

一、register_globals(全局變量註冊開關)數據庫

  該選項在設置爲on的狀況下,會直接把用戶GET、POST等方式提交上來的參數註冊成全局變量並初始化值爲參數對應的值,使得提交的參數能夠直接在腳本中使用。windows

  register_globals在PHP版本小於等於4.2.3時設置爲PHP_INI_ALL,從PHP 5.3.0起被廢棄,不推薦使用,在PHP 5.4.0中移除了該選項。安全

 


 

二、allow_url_include(是否容許包含遠程文件)socket

  這個配置指令對PHP安全的影響不可小覷。在該配置爲on的狀況下,它能夠直接包含遠程文件,當存在include($var)且$var可控的狀況下,能夠直接控制$var的變量來執行PHP代碼。allow_url_include在PHP5.2.0後默認設置爲off。配置範圍爲PHP_IN_ALL。函數


三、magic_quotes_gpc(魔術引號自動過濾)fetch

  magic_quotes_gpc在安全方面作了很大貢獻,只要它被開啓,在不存在編碼或者其餘特殊繞過的狀況下,可使得不少漏洞沒法被利用。當該選項設置爲on時,會自動在GET、POST、COOKIE變量中的單引號(')、雙引號(")、反斜槓(\)及空字符(NULL)的前面加上反斜槓(\),可是在PHP 5中magic_quotes_gpc並不會過濾$_SERVER變量,致使不少相似client-ip、referer一類的漏洞可以利用。在PHP 5.3以後的不推薦使用magic_quotes_gpc。

  PHP 5.4以後就取消這個選項了。在PHP版本小於4.2.3時,配置範圍是PHP_INI_ALL;在PHP版本大於4.2.3時,是PHP_INI_PERDIR。


四、magic_quotes_runtime(魔術引號自動過濾)

  magic_quotes_runtime也是自動在單引號(')、雙引號(")、反斜槓(\)及控字符(NULL)的前面加上反斜槓(\)。它跟magic_quotes_gpc的區別是,處理的對象不同,magic_quotes_runtime只對從數據庫或者文件中獲取的數據進行過濾,它的做用也很是大,由於不少程序員只對外部輸入的數據進行過濾,卻沒有想過從數據庫獲取的數據一樣也會有特殊字符存在,因此攻擊者的作法是先將攻擊代碼寫入數據庫,在程序讀取、使用到被污染的數據後便可觸發攻擊。

  一樣,magic_quotes_runtime在PHP 5.4以後也被取消,配置範圍是PHP_INI_ALL。

  只有部分函數受它影響,因此在某些狀況下這個配置是能夠繞過的。受影響的列表包括:

  get_meta_tags()、file_get_contents()、file()、fgets()、fwrite()、fread()、fputcsv()、stream_socket_recvfrom()、exec()、system()、passthru()、stream_get_contents()、bzread()、gzfile()、gzgets()、gzwrite()、gzread()、exif_read_data()、dba_insert()、dba_replace()、dba_fetch()、ibase_fetch_row()、ibase_fetch_assoc()、ibase_fetch_object()、mssql_fetch_row()、mssql_fetch_object()、mssql_fetch_array()、mssql_fetch_assoc()、mysqli_fetch_row()、mysqli_fetch_assoc()、pg_fetch_array()、pg_fetch_object()、pg_fetch_all()、pg_select()、sybase_fetch_object()、sybase_fetch_array()、sybase_fetch_assoc()、SplFileObject::fgets()、SplFileObject::fgetcsv()、SplFileObject::fwrite()。


五、magic_quote_sybase(魔術引號自動過濾)

  magic_quotes_sybase指令用戶自動過濾特殊字符,當設置爲on時,它會覆蓋掉magic_quote_pgc=on的配置,也就是說,即便配置了gpc=on也是沒有效果的。這個指令與gpc的共同點時處理的對象一致,即都對GET、POST、Cookie進行處理。而它們以前的區別在於處理方式不同,magic_quotes_sybase僅僅是轉義了空字符和把單引號(')變爲雙引號(")。與gpc相比,這個指令使用得更少,它的配置範圍是PHP_INI_ALL,在PHP 5.4.0中移除了該選項。


六、safe_mode(安全模式)

  安全模式是PHP內嵌的一種安全機制,當safe_mode=on時,聯動能夠配置的指令有safe_mode_include_dir、safe_mode_exec_dir、safe_mode_allowed_env_vars、safe_mode_protected_env_vars。safe_mode指令的配置範圍爲PHP_INI_SYSTEM,PHP 5.4以後被撤銷了。


 

七、open_basedir PHP可訪問目錄

  open_basedir指令用來顯示PHP只能訪問哪些目錄,一般咱們只須要設置Web文件目錄便可,若是須要加載外部腳本,也須要把腳本所在目錄路徑加入到open_basedir指令中,多個目錄以分號(;)分割。使用open_dabasedir須要注意一點是,指定的限制其實是前綴,而不是,目錄名。例如,若是配置open_basedir=/www/a,那麼目錄/www/a和/www/b均可以訪問的。因此若是要將訪問限制在指定目錄內,請用斜線結束路徑名。例如設置成:open_basedir=/www/a。

  當open_basedir配置目錄後,執行腳本訪問其餘文件都須要驗證文件路徑,所以在執行效率上面也會有必定影響的。該指令的配置範圍在PHP版本小於5.2.3時是PHP_INI_SYSTEM。在PHP版本大於等於5.2.3是PHP_INI_ALL。


 

八、disable_functions(禁用函數)

  在正式的生產環境中,爲了更安全地運行PHP,也可使用disable_function指令來禁止一些敏感函數的使用。當你想用本指令禁止一些危險函數時,切記要把dl()函數也加到禁止列表,由於攻擊者能夠利用dl()函數來加載自動以的PHP擴展以突破disable_functions指令的限制。

  本指令配置範圍爲php.ini only。配置禁用函數時使用逗號分割函數名,例如:disable_functions=phpinfo.eval.passthru.exec,system。


 

九、display_errors和error_reporting錯誤顯示

  display_errors代表是否顯示PHP腳本內部錯誤的選項,在調試PHP的時候,一般都把PHP錯誤顯示打開,可是在生產環境中,建議關閉PHP錯誤回顯,即設置display_errors=off,以免帶來一些安全隱患。在設置display_errors=on時,還能夠配置的一個指令是error_reporting,這個選項用來配置錯誤顯示的級別,可以使用數字也可以使用內置常量。

  這兩個指令的配置範圍都是PHP_INI_ALL。

相關文章
相關標籤/搜索