1) 如何理解sql注入
sql注入是一種將sql代碼添加到輸入?yún)?shù)中,傳遞到sql服務(wù)器解析并執(zhí)行的一種攻擊手法。輸入?yún)?shù)未經(jīng)過(guò)濾直接拼接sql代碼執(zhí)行。
2) sql注入是如何產(chǎn)生的
1.web開(kāi)發(fā)人員無(wú)法保證所有輸入都已經(jīng)過(guò)濾
2.攻擊者利用發(fā)送給sql服務(wù)器的輸入數(shù)據(jù)構(gòu)造可執(zhí)行代碼
3.數(shù)據(jù)庫(kù)未做相應(yīng)的安全配置
3) 如何尋找sql注入漏洞
1.識(shí)別web應(yīng)用中所有輸入點(diǎn)
2.了解哪些請(qǐng)求會(huì)觸發(fā)異常
3.檢測(cè)服務(wù)器響應(yīng)中的異常
4) 如何進(jìn)行sql注入攻擊
※.數(shù)字注入
正常sql:select * from article where id = 1;
攻擊sql:select * from article where id=-1 or 1=1;
※.字符串注入
正常sql:select * from user where username='zhangsan' and password='123456';
攻擊sql ①:select * from user where username='zhangsan'# and password='123456';注:#后面的內(nèi)容會(huì)被當(dāng)做注釋
攻擊sql ②:select * from user where username='zhangsan'-- ' and password = '123456';注:-- ' 后面的內(nèi)容會(huì)被當(dāng)做注釋
5) 如何預(yù)防sql注入
1.嚴(yán)格檢查輸入變量的類(lèi)型和格式
2.過(guò)濾和轉(zhuǎn)義特殊字符?
#方法一:addslashes($username)
#方法二:mysqli_real_escape_string($username, $db)
3.利用mysql的預(yù)編譯機(jī)制
MySQL pdo預(yù)處理能防止sql注入的原因:
1、先看預(yù)處理的語(yǔ)法
$pdo->prepare('select * from biao1 where id=:id');
$pdo->execute([':id'=>4]);
2、語(yǔ)句一,服務(wù)器發(fā)送一條sql給mysql服務(wù)器,mysql服務(wù)器會(huì)解析這條sql。
語(yǔ)句二,服務(wù)器發(fā)送一條sql給mysql服務(wù)器,mysql服務(wù)器不會(huì)解析這條sql,只會(huì)把execute的參數(shù)當(dāng)做純參數(shù)賦值給語(yǔ)句一。哪怕參數(shù)中有sql命令也不會(huì)被執(zhí)行,從而實(shí)現(xiàn)防治sql注入。