本篇文章給大家?guī)砹岁P(guān)于mysql的相關(guān)知識,其中主要跟大家聊一聊SQL參數(shù)化查詢?yōu)槭裁茨軌蚍乐筍QL注入,感興趣的朋友下面一起來看一下吧,希望對大家有幫助。
(資料圖片)
SQL參數(shù)化查詢?yōu)槭裁茨軌蚍乐筍QL注入?
1、SQL 注入是什么
將 SQL 命令插入到表單提交或輸入域名或頁面請求的查詢字符串中,欺騙服務(wù)器執(zhí)行惡意的 SQL 命令。
-- 正常的查詢語句 select * from users where username = "a"; -- 惡意的查詢語句 select * from users where username = "a" or 1==1;
2、參數(shù)化查詢是什么
參數(shù)化查詢是指查詢數(shù)據(jù)庫時,在需要填入數(shù)據(jù)的地方,使用參數(shù)來給值。
set @id = 1;SELECT * from users WHERE id = @id ;
3、SQL 語句的執(zhí)行處理
SQL 語句按處理流程看有兩類:即時 SQL、預(yù)處理 SQL。
即時 SQL
即時 SQL 從 DB 接收到最終執(zhí)行完畢返回,大致的過程如下:
a. 詞法和語義解析 b. 優(yōu)化sql語句,制定執(zhí)行計劃 c. 執(zhí)行并返回結(jié)果
特點:一次編譯,單次運行。
預(yù)處理 SQL
程序中某條 sql 可能會被反復(fù)調(diào)用,或者每次執(zhí)行的時候只有個別的值不同。如果每次按即時 SQL 的流程來看,效率是比較低的。
這時候可以將 SQL 中的值用占位符代替,先生成 SQL 模板,然后再綁定參數(shù),之后重復(fù)執(zhí)行該語句的時候只需要替換參數(shù),而不用再去進(jìn)行詞法和語義分析??梢砸暈?SQL 語句模板化或參數(shù)化。
特點:一次編譯,多次運行,省去了多次解析等過程。(多次運行是指在同一會話中再次執(zhí)行相同的語句,也就不會被再次解析和編譯)
-- 語法 # 定義預(yù)處理語句 PREPARE stmt_name FROM preparable_stmt; # 執(zhí)行預(yù)處理語句 EXECUTE stmt_name [USING @var_name [, @var_name] ...]; # 刪除(釋放)定義 {DROP | DEALLOCATE} PREPARE stmt_name;4、預(yù)處理 SQL 是如何防止 SQL 注入的
待執(zhí)行的 SQL 被編譯后存放在緩存池中,DB 執(zhí)行 execute 的時候,并不會再去編譯一次,而是找到 SQL 模板,將參數(shù)傳遞給它然后執(zhí)行。所以類似于 or 1==1 的命令會當(dāng)成參數(shù)傳遞,而不會進(jìn)行語義解析執(zhí)行。
-- 預(yù)處理編譯 SQL ,會占用資源 PREPARE stmt1 from "SELECT COUNT(*) FROM users WHERE PASSWORD = ? AND user_name = ?"; set [@a](https://learnku.com/users/16347) = "name1 OR 1 = 1"; set @b = "pwd1"; EXECUTE stmt1 USING @b,[@a](https://learnku.com/users/16347); -- 使用 DEALLOCATE PREPARE 釋放資源 DEALLOCATE PREPARE stmt1;
推薦學(xué)習(xí):《MySQL視頻教程》
以上就是一文分析SQL參數(shù)化查詢?yōu)楹文芊乐筍QL注入的詳細(xì)內(nèi)容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章!
關(guān)鍵詞: