亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

首頁(yè) php教程 php手冊(cè) php中防止SQL注入的方法

php中防止SQL注入的方法

Nov 16, 2016 am 10:24 AM

【一、在伺服器端設(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ù)

本網(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整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

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

SublimeText3 Mac版

SublimeText3 Mac版

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

熱門話題

Laravel 教程
1597
29
PHP教程
1488
72