【一、在伺服器端設(shè)定】
???????安全,PHP程式編寫是一方面,PHP的設(shè)定更是非常關(guān)鍵。
我們php手手工安裝的,php的預(yù)設(shè)設(shè)定檔在/usr/local/apache2/conf/php.ini,我們最主要就是要設(shè)定php.ini的內(nèi)容,讓我們執(zhí)行php能夠更安全。整個(gè)PHP中的安全設(shè)定主要是為了防止phpshell和SQL Injection的攻擊,一下我們慢慢探討。我們先使用任何編輯工具開啟 /etc/local/apache2/conf/php.ini,如果你是採(cǎi)用其他方式安裝,設(shè)定檔可能不在該目錄中。
(1) 打開php的安全模式
php的安全模式是個(gè)非常重要的內(nèi)嵌的安全機(jī)制,能夠控制一些php中的函數(shù),例如system(),
文件操作函數(shù)進(jìn)行了權(quán)限控制,也不允許對(duì)某些關(guān)鍵文件的文件,例如/etc/passwd,
但是預(yù)設(shè)的php.ini是沒有打開安全模式的,我們把它打開:
safe_mode = on
(2) 使用者群組安全
當(dāng)safe_mode打開時(shí),safe_mode_gid被關(guān)閉,那麼php腳本能夠?qū)n案進(jìn)行訪問(wèn),而且相同資料訪問(wèn)。
建議設(shè)定為:
safe_mode_gid = off
如果不進(jìn)行設(shè)定,可能我們無(wú)法對(duì)我們伺服器網(wǎng)站目錄下的檔案進(jìn)行操作了
如果不進(jìn)行設(shè)定,可能我們無(wú)法對(duì)我們伺服器網(wǎng)站目錄下的檔案進(jìn)行操作了,例如我們需要操作文件的時(shí)候。
(3) 安全模式下執(zhí)行程式主目錄
如果安全模式開啟了,但是卻是要執(zhí)行某些程式的時(shí)候,可以指定要執(zhí)行程式的主目錄:
D:/usr/bin
一般情況下是不需要執(zhí)行什麼程式的,所以建議不要執(zhí)行系統(tǒng)程式目錄,可以指向一個(gè)目錄,
然後把需要執(zhí)行的程式拷貝過(guò)去,例如:
safe_mode_exec_dir = D:/tmp/cmd
但是,我更建議不要執(zhí)行任何程序,那麼就可以指向我們網(wǎng)頁(yè)目錄:
: 4) 安全模式下包含文件
如果要在安全模式下包含某些公共文件,那麼就修改一下選項(xiàng):
safe_mode_include_dir = D:/usr/www/include/
php腳本中包含檔案都是在程式自己已經(jīng)寫好了,這個(gè)可以依具體需求設(shè)定。
(5) 控制php腳本能存取的目錄
使用open_basedir選項(xiàng)能夠控制PHP腳本只能存取指定的目錄,這樣能夠避免PHP腳本存取
上限制了phpshell的危害,我們一般可以設(shè)定為只能存取網(wǎng)站目錄:
open_basedir = D:/usr/www
(6) 關(guān)閉危險(xiǎn)函數(shù)
(6) 關(guān)閉危險(xiǎn)函數(shù)
如果打開了安全模式,
如果打開了安全模式,
如果打開了安全模式那麼函數(shù)禁止是可以不需要的,但是我們?yōu)榱税踩€是考慮進(jìn)去。例如,
我們覺得不希望執(zhí)行包括system()等在那的能夠執(zhí)行命令的php函數(shù),或者能夠查看php資訊的
phpinfo()等函數(shù),那麼我們就可以禁止它們:
disable_functions = system,passthru,exec,shell_exec,popen,phpinfo
如果你要禁止任何檔案和目錄的操作,那麼可以關(guān)閉很多檔案操作
,opendir,readdir,scandir,fopen,unlink,delete,copy,mkdir, rmdir,rename,file,file_get_contents,fputs,fwrite,chgrp,chmod,chown
以上只是列了部分不叫常用的文件處理函數(shù),你也可以把上面執(zhí)行命令函數(shù)和這個(gè)函數(shù)結(jié)合,
就能夠抵制大部分的phpshell了。
(7) 關(guān)閉PHP版本信息在http頭中的洩漏
我們?yōu)榱朔乐购诳瞳@取伺服器中php版本的信息,可以關(guān)閉該信息斜路在http頭中:
例如駭客在telnet www.12345.com 80 的時(shí)候,那麼將無(wú)法看到PHP的資訊。
(8) 關(guān)閉註冊(cè)全局變量
在PHP中提交的變量,包括使用POST或GET提交的變量,都將自動(dòng)註冊(cè)為全局變量,能夠直接訪問(wèn),
伺服器非常不安全的,所以我們不能讓它註冊(cè)為全域變量,就把註冊(cè)全域變數(shù)選項(xiàng)關(guān)閉:
register_globals = Off
當(dāng)然,如果這樣設(shè)定了,那麼取得對(duì)應(yīng)變數(shù)的時(shí)候就要採(cǎi)用合理方式,例如獲取GET提交的變數(shù)var,
那麼就要用$_GET['var']來(lái)進(jìn)行獲取,這個(gè)php程式設(shè)計(jì)師要注意。
(9) 開啟magic_quotes_gpc來(lái)防止SQL注入
SQL注入是非常危險(xiǎn)的問(wèn)題,小則網(wǎng)站後臺(tái)被入侵,重則整個(gè)伺服器淪陷,
所以一定要小心。 php.ini中有一個(gè)設(shè)定:
magic_quotes_gpc = Off
這個(gè)預(yù)設(shè)是關(guān)閉的,如果它打開後將自動(dòng)把用戶提交對(duì)sql的查詢進(jìn)行轉(zhuǎn)換,
把'等,這對(duì)防止sql注射有重大作用。所以我們推薦設(shè)定為:
magic_quotes_gpc = On
(10) 錯(cuò)誤訊息控制
一般php在沒有連接到資料庫(kù)或其他情況下會(huì)有提示錯(cuò)誤腳本當(dāng)
前的路徑信息或者查詢的SQL語(yǔ)句等信息,這類信息提供給黑客後,是不安全的,所以一般服務(wù)器建議禁止錯(cuò)誤提示:
display_errors = Off
如果你卻是要顯示錯(cuò)誤訊息,一定要設(shè)定顯示錯(cuò)誤的級(jí)別,例如只顯示警告以上的訊息:
error_reporting = E_WARNING & E_ERROR
當(dāng)然,我還是建議關(guān)閉錯(cuò)誤提示。
(11) 錯(cuò)誤日誌
建議在關(guān)閉display_errors後能夠把錯(cuò)誤訊息記錄下來(lái),便於查找伺服器運(yùn)作的原因:
log_erro的目錄,建議根apache的日誌存在一起:
error_log = D:/usr/local/apache2/logs/php_error.log
注意:給文件必須允許。
MYSQL的降權(quán)運(yùn)行
新建立一個(gè)使用者例如mysqlstart
net user mysqlstart fuckmicrosoft /add取
net user mysqlstart fuckmicrosoft /add取
net user mysqlstart fuckmicrosoft
不屬於任何組別
如果MYSQL裝在d:mysql ,那麼,給mysqlstart 完全控制的權(quán)限
然後在系統(tǒng)服務(wù)中設(shè)置,MYSQL的服務(wù)屬性,在登入屬性當(dāng)中,選擇此用戶mysqlstart 然後輸入密碼,確定。
重新啟動(dòng) MYSQL服務(wù),然後MYSQL就運(yùn)行在低權(quán)限下了。
如果是在windos平臺(tái)下搭建的apache我們還需要注意一點(diǎn),apache預(yù)設(shè)運(yùn)行是system權(quán)限,
這很恐怖,這讓人感覺很不爽.那我們就給apache降降權(quán)限吧。
net user apache fuckmicrosoft /add
net localgroup users apache /del
ok.我們建立了一個(gè)不屬於任何群組的使用者apche。
我們打開電腦管理器,選服務(wù),點(diǎn)apache服務(wù)的屬性,我們選擇log on,選擇this account,我們填入上面所建立的帳戶和密碼,
重啟apache服務(wù),ok,apache運(yùn)行在低權(quán)限下了。
實(shí)際上我們還可以透過(guò)設(shè)定各個(gè)資料夾的權(quán)限,來(lái)讓apache使用者只能執(zhí)行我們想讓它能幹的事情,給每個(gè)目錄建立一個(gè)單獨(dú)能讀寫的使用者。
這也是當(dāng)前很多虛擬主機(jī)供應(yīng)商的流行配置方法哦,不過(guò)這??種方法用於防止這裡就顯的有點(diǎn)大材小用了。?
【二、在PHP程式編寫】
???????雖然國(guó)內(nèi)許多PHP程式設(shè)計(jì)師仍在依賴addslashes防止SQL注入,還是建議大家加強(qiáng)中文防止SQL注入的檢查。 addslashes的問(wèn)題在於駭客可以用0xbf27來(lái)代替單引號(hào),而addslashes只是將0xbf27修改為0xbf5c27,成為一個(gè)有效的多字節(jié)字符,其中的0xbf5c仍會(huì)被看作是單引號(hào),所以addslashes無(wú)法成功攔截。
???????當(dāng)然addslashes也不是毫無(wú)用處,它是用於單字節(jié)字串的處理,多位元組字元還是用mysql_real_escape_string吧。
???????另外為php手冊(cè)中g(shù)et_magic_quotes_gpc的舉例:
if (!get_magic_quotes_gpc()) { else {
$ lastname = $_POST['lastname'];
}
最好對(duì)magic_quotes_gpc已經(jīng)開放的情況下,還是對(duì)$_POST[’lastname’]進(jìn)行檢查一下。
再說(shuō)下mysql_real_escape_string和mysql_escape_string這2個(gè)函數(shù)的差別:
mysql_real_escape_string 必須在(PHP 4 >= 4.3.0, PHP 5)的情況下才能使用。否則只能用 mysql_escape_string ,兩者的差異是:mysql_real_escape_string 考慮到連接的
當(dāng)前字元集,而mysql_escape_string 不考慮。 * addslashes() 是強(qiáng)行加;
* mysql_real_escape_string()??會(huì)判斷字元集,但是對(duì)PHP版本有要求;
----------------------------------------------- --------------------------------------------------
在PHP編碼的時(shí)候,如果考慮到一些比較基本的安全問(wèn)題,首先一點(diǎn):
1. 初始化你的變數(shù)
為什麼這麼說(shuō)呢?我們看下面的程式碼:
PHP程式碼???
??????
????echo '登陸成功! ';?????
????include('admin.php');?????
?????
????{?????
????echo '你不是管理員,且無(wú)法管理! ';?????
????}?????
?????>
?例如我們的這個(gè)頁(yè)是http://daybook.diandian.com/login.php,那我們提交:http://daybook.diandian.com/login.php?admin=1,呵呵,你想一些,我們是不是直接就是管理員了,直接進(jìn)行管理。
?????當(dāng)然,可能我們不會(huì)犯這麼簡(jiǎn)單錯(cuò)的錯(cuò)誤,那麼一些很隱密的錯(cuò)誤也可能導(dǎo)致這個(gè)問(wèn)題,例如phpwind論壇有個(gè)漏洞,導(dǎo)致能夠直接拿到管理員權(quán)限,就是因?yàn)橛袀€(gè)$skin變數(shù)沒有初始化,導(dǎo)致了後面一系列問(wèn)題。那我們?cè)撊绾伪苊馍厦娴膯?wèn)題呢?首先,從php.ini入手,把php.ini裡面的register_global =off,就是不是所有的註冊(cè)變數(shù)為全局,那麼就能避免了。但是,我們不是伺服器管理員,只能從程式碼上改進(jìn)了,那我們要如何改進(jìn)上面的程式碼呢?我們改寫如下:
PHP代碼??????
????
??if ($_POST['admin_user'] && $_POST['admin_pass'])?????
????{?????
????// 判斷提交的管理員使用者名稱及密碼為不是對(duì)的對(duì)應(yīng)的處理代碼????????$admin = 1;?????
????}?????
????????{?????
????$admin = 0;?????
???
????{?????
????echo '成功中! ';?????
????include('admin.php');?????
?????????{?????
????echo '你不是管理員,且無(wú)法管理! ';?????
????}?????
?????>
book??????>
變數(shù)初始化為$admin = 0 了,那麼你就無(wú)法透過(guò)這個(gè)漏洞取得管理員權(quán)限。
2. 防止SQL Injection (sql注射)
????SQL 注射應(yīng)該是目前程序危害最大的了,包括最早從asp到php,基本上都是國(guó)內(nèi)這兩年流行的技術(shù),基本原理就是透過(guò)對(duì)提交變數(shù)的不過(guò)濾形成注入點(diǎn)然後使惡意使用者能夠提交一些sql查詢語(yǔ)句,導(dǎo)致重要資料被竊取、資料遺失或損壞,或被入侵到後臺(tái)管理。
????那麼我們既然了解了基本的注射入侵的方式,那麼我們?cè)撊绾稳シ拦?fàn)呢?這個(gè)就應(yīng)該我們從程式碼去入手了。
???我們知道Web上提交資料有兩種方式,一種是get、一種是post,那麼很多常見的sql注射就是從get方式入手的,而且注射的語(yǔ)句裡面一定是包含一些sql語(yǔ)句的,因?yàn)闆]有sql語(yǔ)句,那麼如何進(jìn)行,sql語(yǔ)句有四大句:select 、update、delete、insert,那麼我們?nèi)绻谖覀兲峤坏馁Y料中進(jìn)行過(guò)濾是不是能夠避免這些問(wèn)題呢?
所以我們使用正規(guī)化就建立以下函數(shù):
PHP程式碼
????????{?????
????return eregi('select|insert|update|delete |'?????
????function verify_id($id=null)?????
???參數(shù)! inject_check($id)) { exit('提交的參數(shù)非法!'); } // 注射判斷????
????elseif (!is_numeric($id)) { exit('提交的參數(shù)參數(shù)!'); } //數(shù)位判斷?????
????$id = intval($id); // 整數(shù)化?????????
?????
?????>
?????呵呵,那麼我們就能夠進(jìn)行校驗(yàn)了,於是我們上面的程式碼就變成下面的了:
PHP程式碼?????????
????if (inject_check($_GET['id']))???????exit('你提交的資料非法,請(qǐng)檢查後重新提交!');?????
????}?????
????else?????
????{???????
???
????echo '提交的資料合法,請(qǐng)繼續(xù)! ';?????
????}?????
?????>
過(guò)的資料似乎沒有考慮過(guò)呢?
例如一些字元可能會(huì)對(duì)資料庫(kù)造成危害,例如 ' _ ', ' %',這些字元都有特殊意義,那麼我們?nèi)绻M(jìn)行控制呢?還有一點(diǎn),就是當(dāng)我們的php.ini裡面的magic_quotes_gpc = off的時(shí)候,那麼提交的不符合資料庫(kù)規(guī)則的資料都是不會(huì)自動(dòng)在前面加' '的,那麼我們要控制這些問(wèn)題,於是建構(gòu)如下函數(shù):
PHP代碼??????
????
????function str_check( $str )?????
????{?????
????if (!get_magic_quotes_gpc()) // 判斷magic_quotes_gpc是否打開?????
????{?????
????$ str = addslashes($str); // 進(jìn)行濾波?????
????}?????
),?????$str = str_replace("%", "%", $str); // 把' % '濾掉?????
??????????????
?????>
????我們另一個(gè)的避免了伺服器被淪陷的危險(xiǎn)。
????最後,再考慮提交一些大量資料的情況,例如發(fā)貼,或?qū)懳恼?、新聞,我們需要一些函?shù)來(lái)幫我們過(guò)濾和轉(zhuǎn)換,再上面函數(shù)的基礎(chǔ)上,我們建構(gòu)如下函數(shù):
PHP代碼??
?????????
????if (!get_magic_quotes_gpc()) // 判斷magic_quotes_gpc是否為開啟?????
?? addslashes($post); // 進(jìn)行magic_quotes_gpc沒有開啟的情況對(duì)提交資料的過(guò)濾?????
????}?????????$post = str_replace("_", "_", $post); // 把'_'過(guò)濾掉?????
????$post = str_replace("%", "%", $post), "%」/ post //; % '過(guò)濾掉?????
????$post = nl2br($post); // 回車轉(zhuǎn)換?????
?????return $post;?????
????}?????
?????>
????呵呵,基本上到這裡,我們把一些情況都說(shuō)了一遍,其實(shí)我覺得自己講的東西還很少,至少我才只講了兩方面,再整個(gè)安全中是很少的內(nèi)容了,考慮下一次講更多,包括php安全配置,apache安全等等,讓我們的安全正的是一個(gè)整體,做到最安全。
????最後在告訴你上面表達(dá)的:1. 初始化你的變數(shù) 2. 一定記得要過(guò)濾你的變數(shù)

熱AI工具

Undress AI Tool
免費(fèi)脫衣圖片

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

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

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁(yè)開發(fā)工具

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