4 回答

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超13個(gè)贊
select ,insert,update,delete,and,*等或通過(guò)系統(tǒng)函數(shù)addslashes對(duì)內(nèi)容進(jìn)行過(guò)濾
php配置文件中register_globals=off;設(shè)置為關(guān)閉狀態(tài).(作用將注冊(cè)全局變量關(guān)閉);如接收POST表單的值使用$_POST['user'],假設(shè)設(shè)置為ON的話$user才接收值
sql語(yǔ)句書(shū)寫(xiě)的時(shí)候盡量不要省略小引號(hào)(tab上面那個(gè))和單引號(hào)
提高數(shù)據(jù)庫(kù)命名技巧,對(duì)于一些重要的字段根據(jù)程序的特點(diǎn)命名,使之不易被猜中
對(duì)于常的方法加以封裝,避免直接暴漏SQL語(yǔ)句
開(kāi)啟PHP安全模式safe_mode=on
打開(kāi)magic_quotes_gpc來(lái)防止SQL注入,默認(rèn)為關(guān)閉,開(kāi)啟后自動(dòng)把用戶提交sql查詢語(yǔ)句進(jìn)行轉(zhuǎn)換把"'"轉(zhuǎn)換成"\'"
控制錯(cuò)誤信息輸出,關(guān)閉錯(cuò)誤信息提示,將錯(cuò)誤信息寫(xiě)到系統(tǒng)日志
使用MYSQLI或PDO預(yù)處理

TA貢獻(xiàn)1826條經(jīng)驗(yàn) 獲得超6個(gè)贊
如果是字符串類(lèi)型:addslashes() 這個(gè)函數(shù),轉(zhuǎn)義單雙引號(hào);
如果接收的參數(shù)屬于整數(shù)型(id之類(lèi)):intval() 直接取出數(shù)字,丟棄后邊的非數(shù)字字符;
或者使用PDO預(yù)處理語(yǔ)句,綁定參數(shù)的方式防止SQL注入。

TA貢獻(xiàn)1773條經(jīng)驗(yàn) 獲得超3個(gè)贊
廢棄plain SQL ,強(qiáng)制使用參數(shù)化查詢(并且是上述的真?參數(shù)化查詢)這其實(shí)沒(méi)有解決任何問(wèn)題,首先,使用plain SQL的需求是真實(shí)存在的,當(dāng)然我們假設(shè)可以通過(guò)空的參數(shù)列表來(lái)變相進(jìn)行plain SQL的查詢,那這和plain SQL又有何區(qū)別,其次,參數(shù)化查詢?nèi)匀皇怯伞皫?shù)的SQL”和參數(shù)列表兩部分組成的,無(wú)法識(shí)別和避免程序員在第一部分采用拼接
完全拋棄SQL,提供結(jié)構(gòu)化的接口,例如類(lèi)似select(tableName, fields, condition)這種機(jī)制這會(huì)使得接口異常復(fù)雜,且不一定應(yīng)付得了復(fù)雜查詢,想想LINQ吧

TA貢獻(xiàn)1725條經(jīng)驗(yàn) 獲得超8個(gè)贊
這個(gè)方法比較多,這里簡(jiǎn)單舉個(gè)例子:
提交的變量中所有的 ' (單引號(hào)), " (雙引號(hào)), \ (反斜線) and 空字符會(huì)自動(dòng)轉(zhuǎn)為含有反斜線的轉(zhuǎn)義字符,給SQL注入帶來(lái)不少的麻煩。
請(qǐng)看清楚:“麻煩”而已~這并不意味著PHP防范SQL注入,書(shū)中就講到了利用改變注入語(yǔ)句的編碼來(lái)繞過(guò)轉(zhuǎn)義的方法,比如將SQL語(yǔ)句轉(zhuǎn)成ASCII編碼(類(lèi)似:char(100,58,92,108,111,99,97,108,104,111,115,116…)這樣的格式),或者轉(zhuǎn)成16進(jìn)制編碼,甚至還有其他形式的編碼,這樣以來(lái),轉(zhuǎn)義過(guò)濾便被繞過(guò)去了
// 去除轉(zhuǎn)義字符
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | function stripslashes_array($array) { if (is_array($array)) { foreach ($array as $k => $v) { $array[$k] = stripslashes_array($v); } } else if (is_string($array)) { $array = stripslashes($array); } return $array; } @set_magic_quotes_runtime(0); // 判斷 magic_quotes_gpc 狀態(tài) if (@get_magic_quotes_gpc()) { $_GET = stripslashes_array($_GET); $_POST = stripslashes_array($_POST); $_COOKIE = stripslashes_array($_COOKIE); } |
PHP防范SQL注入的代碼
1 2 3 | $keywords = addslashes($keywords); $keywords = str_replace("_","\_",$keywords);//轉(zhuǎn)義掉”_” $keywords = str_replace("%","\%",$keywords);//轉(zhuǎn)義掉”%” |
- 4 回答
- 0 關(guān)注
- 679 瀏覽
添加回答
舉報(bào)