欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SQL注入的四種防御方法總結(jié)

 更新時(shí)間:2022年07月11日 11:58:20   作者:買Lemon也用劵  
SQL Injection是一種常見(jiàn)的Web安全漏洞,主要形成的原因是在數(shù)據(jù)交互中,下面這篇文章主要給大家介紹了關(guān)于SQL注入的四種防御方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

最近了解到安全公司的面試中都問(wèn)到了很多關(guān)于SQL注入的一些原理和注入類型的問(wèn)題,甚至是SQL注入的防御方法。SQL注入真的算是web漏洞中的元老了,著名且危害性極大。下面這里就簡(jiǎn)單的分享一下我總結(jié)的四種SQL注入防御手段,加深理解,方便下次遇到這種問(wèn)題時(shí)可以直接拿來(lái)使用。(主要是怕面試中腦殼打鐵,這種情況太常見(jiàn)了)

SQL注入占我們滲透學(xué)習(xí)中極大地一部分,擁有這很重要的地位。隨著防御手段的不段深入,市面上存在SQL注入的網(wǎng)站的確少之又少了,但不能說(shuō)是沒(méi)有。在我看來(lái),學(xué)習(xí)SQL注入的目的并不只是學(xué)習(xí)針對(duì)這種方法,而是一類方法,包括他的思想,思路和奇淫技巧,簡(jiǎn)單點(diǎn)說(shuō)就是舉一反三。學(xué)到現(xiàn)在發(fā)現(xiàn)好像越向后面學(xué)其他漏洞,方法思路都大體一致,比如字符串拼接,構(gòu)造閉合語(yǔ)句,函數(shù)替代等等。

好了,說(shuō)了這么多,現(xiàn)在我們步入正題吧!

我們簡(jiǎn)單理解SQL注入就是在人為可以構(gòu)造參數(shù)的地方加入一些非法敏感語(yǔ)句,繞過(guò)后端的處理,并帶入到數(shù)據(jù)庫(kù)中執(zhí)行,然后返回敏感數(shù)據(jù)的過(guò)程。

限制數(shù)據(jù)類型

在傳入?yún)?shù)的地方限制參數(shù)的類型,比如整型 Integer,隨后加入函數(shù)判斷,如is_numeric($_GET[‘id’]) 只有當(dāng)get到的id為數(shù)字或者數(shù)字字符時(shí)才能執(zhí)行下一步,限制了字字符自然就限制了注入,畢竟構(gòu)造參數(shù)怎么可能不傳入字符。但這種方法存在一定的限制,只能在特定的頁(yè)面才能使用,一般大部分都是要求我們傳入的字符串,但可以很大程度限制整型注入的情況。(針對(duì)此函數(shù)也是有一定繞過(guò)手段,比如轉(zhuǎn)為十六進(jìn)制)

正則表達(dá)式匹配傳入?yún)?shù)

相信對(duì)于正則表達(dá)式大家都不陌生了,幾乎在過(guò)濾比較嚴(yán)格的地方都有正則表達(dá)式。(后面我也會(huì)寫一篇關(guān)于使用正則表達(dá)式的文章,包括基礎(chǔ)的使用和繞過(guò))。這里簡(jiǎn)單解讀一下這段正則表達(dá)式:

$id=$_POST['id'];
if (preg_match('/and|select|insert|insert|update|[A-Za-z]|/d+:/i', $id)) { 
        die('stop hacking!'); 
    } else {
        echo 'good'; 
    }

preg_match() 函數(shù)匹配傳入的id值,
/ 作為正則的起始標(biāo)識(shí)符
| 代表或
[A-Za-z] 表示匹配參數(shù)中是否存在大小寫的26個(gè)字符
/d 匹配是否存在數(shù)字
+匹配一次或多次
/i 不區(qū)分大小寫

像下面這句:

?id=1’ union select 1,2# 因?yàn)槠ヅ涞絬nion select,輸出 stop hacking!

正則表達(dá)式也具有一定危險(xiǎn)性,在SQL注入繞過(guò)waf中談到過(guò),正則表達(dá)式匹配非常消耗性能,因此攻擊時(shí)可以構(gòu)造大量的正常語(yǔ)句‘騙’過(guò)服務(wù)器,當(dāng)后臺(tái)對(duì)數(shù)據(jù)的處理達(dá)到最大限制時(shí)就會(huì)放棄匹配后面我們構(gòu)造的非法語(yǔ)句,從而略過(guò)這個(gè)數(shù)據(jù)包。

函數(shù)過(guò)濾轉(zhuǎn)義

在php中最基本的就是自帶的magic_quotes_gpc函數(shù),用于處理 ’ " 符號(hào)加上/ 防止轉(zhuǎn)義, 比如:

 ?id=1' and 1=1#  ===> ?id=1/' and 1=1#

另外還有addslashes(),也具有相同的效果。

像前面提到的**preg_match()**函數(shù)結(jié)合正則表達(dá)式或者黑名單也具有預(yù)防效果。

小tips:默認(rèn)情況下,PHP 指令 magic_quotes_gpc 為 on,對(duì)所有的 GET、POST 和 COOKIE 數(shù)據(jù)自動(dòng)運(yùn)行 addslashes()。不要對(duì)已經(jīng)被 magic_quotes_gpc 轉(zhuǎn)義過(guò)的字符串使用 addslashes(),因?yàn)檫@樣會(huì)導(dǎo)致雙層轉(zhuǎn)義。遇到這種情況時(shí)可以使用函數(shù) get_magic_quotes_gpc() 進(jìn)行檢測(cè)。

mysql_escape_string($string):用反斜杠轉(zhuǎn)義字符串中的特殊字符,用于mysql_query()查詢。
mysql_real_escape_string() 函數(shù)轉(zhuǎn)義 SQL 語(yǔ)句中使用的字符串中的特殊字符。
轉(zhuǎn)義的符號(hào)包括 \x00 \n \r \ ’ " \x1a

預(yù)編譯語(yǔ)句

預(yù)編譯語(yǔ)句對(duì)現(xiàn)在的程序員來(lái)說(shuō)基本都會(huì)去設(shè)計(jì)使用的方法,保障數(shù)據(jù)庫(kù)的安全。一般來(lái)說(shuō),防御SQL注入的最佳方式就是使用預(yù)編譯語(yǔ)句,綁定變量。

String query="select password from users where username='?' ";

下面講一下什么叫預(yù)編譯:使用預(yù)編譯相當(dāng)于是將數(shù)據(jù)于代碼分離的方式,把傳入的參數(shù)綁定為一個(gè)變量,用?表示,攻擊者無(wú)法改變SQL的結(jié)構(gòu),在這個(gè)例子中,即使攻擊者插入類似 admin’ or 1=1# 的字符串,如果不做處理直接帶入查詢,那么query則變成了

query="select password from users where username='admin' or 1=1 ";

閉合了后面的引號(hào),從而執(zhí)行了惡意代碼。而預(yù)編譯則是將傳入的 admin’ or 1=1# 當(dāng)做純字符串的形式作為username執(zhí)行,避免了上面說(shuō)到的SQL語(yǔ)句中的拼接閉合查詢語(yǔ)句等過(guò)程,可以理解為字符串與sql語(yǔ)句的關(guān)系區(qū)分開(kāi),username此時(shí)作為字符串不會(huì)被當(dāng)做之前的SQL語(yǔ)句被帶入數(shù)據(jù)庫(kù)執(zhí)行,避免了類似sql語(yǔ)句拼接、閉合等非法操作。就相當(dāng)于拿著這個(gè)字符串去數(shù)據(jù)庫(kù)中找有沒(méi)有這個(gè)東西一樣。并且使用預(yù)編譯的SQL語(yǔ)句,SQL語(yǔ)句的語(yǔ)義不會(huì)發(fā)生改變。

下面給個(gè)php綁定變量的事例:

$query="INSERT INTO myCity (Name,CountryCode,District) VALUES (?,?,?)";
$stmt=$mysqli->prepare($query);
$stmt->bind_param("sss",$val1,$val2,$val3);
$val1="Stuttgart";
$val2="DEU";
$val3="Baden";
//execute the statement
$stmt->execute();

以上談到的四種方法都是一些基本方法,具體怎么實(shí)現(xiàn)防御還要看怎么去設(shè)計(jì)。說(shuō)到預(yù)編譯語(yǔ)句是最佳方式,并不是說(shuō)只是使用這一種方法就能夠防止SQL注入,而實(shí)際上預(yù)編譯也存在注入繞過(guò)的問(wèn)題,并且也不是所有的地方都能夠使用預(yù)編譯語(yǔ)句。最佳的方式應(yīng)該是多種方法結(jié)合,使用預(yù)編譯的同時(shí)還要加上其他函數(shù)過(guò)濾,正則匹配等,更多的還有根據(jù)實(shí)際情況自定義函數(shù)確保安全。

總結(jié)

到此這篇關(guān)于SQL注入的四種防御方法總結(jié)的文章就介紹到這了,更多相關(guān)SQL注入防御方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論