什么是SQL注入栽烂?
SQL注入是一種將SQL代碼添加到輸入?yún)?shù)中傳遞到SQL服務(wù)器解析并執(zhí)行的一種攻擊手法读跷。
案列解析:
select * from cate where id=-1 or 1=1
在Navicat中執(zhí)行SQL語句發(fā)現(xiàn)整張表都會被查詢出來蕾各,因為SQL中的where條件永遠為真褥赊;達到了攻擊的目的卜朗,所以SQL攻擊就是輸入?yún)?shù)未經(jīng)過濾蝌麸,然后直接拼接到SQL語句當中解析執(zhí)行点寥;
SQL注入是怎么產(chǎn)生的?
- WEB開發(fā)人員無法保證所有的輸入都已經(jīng)過濾来吩;
- 攻擊者利用發(fā)送給SQL服務(wù)器的輸入數(shù)據(jù)構(gòu)造可執(zhí)行的SQL代碼敢辩;
- 數(shù)據(jù)庫未做相應的安全配置蔽莱;
需要對web應用添加特定的賬號,而不能使用root和管理員賬號戚长,我們添加的賬號需要授予一些基本的操作權(quán)限盗冷,回收一些比較危險的操作權(quán)限,比如刪除操作历葛,這樣在一定程度上防止危險SQL注入的產(chǎn)生正塌。
如何尋找SQL注入漏洞?
- 識別web應用中所有輸入點
在web應用中輸入主要包含三部分內(nèi)容:get恤溶、post乓诽、header; - 了解哪些類型的請求會觸發(fā)異常
get請求時咒程,可能會人為引入特殊字符構(gòu)造地址欄數(shù)據(jù)鸠天,導致SQL語句錯誤,從而引起異常數(shù)據(jù)庫報錯帐姻;
post請求時稠集,可能會人為引入特殊字符構(gòu)造地址欄數(shù)據(jù),導致SQL語句錯誤饥瓷,從而引起異常數(shù)據(jù)庫報錯剥纷; - 檢測服務(wù)器響應中的異常
一般數(shù)據(jù)庫SQL語句錯誤,線上項目會報500服務(wù)器內(nèi)部錯誤呢铆;
如何進行SQL注入攻擊晦鞋?
- 數(shù)字注入
select * from cate where id=-1 or 1=1
- 字符串注入
SELECT * FROM user where name='張三'#' AND pwd='e10adc3949ba59abbe56e057f20f883e'
SELECT * FROM user where name='張三'-- ' AND pwd='d41d8cd98f00b204e9800998ecf8427e'
如何預防SQL注入?
- 嚴格檢查輸入變量的類型和格式
數(shù)字類型的數(shù)據(jù)直接用intval()強制轉(zhuǎn)整型函數(shù)棺克;
字符串類型的數(shù)據(jù)用正則表達式來匹配
if (!preg_match('/^[a-zA-Z0-9]{3,}$/',$user) || !preg_match('/^\d{3,}$/',$pwd)) {
echo '請輸入正確的用戶名悠垛!';
}
- 過濾和轉(zhuǎn)義特殊字符
addslashes()