久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

SQL參數化查詢能防止SQL注入的原因是什么

136次閱讀
沒有評論

共計 1427 個字符,預計需要花費 4 分鐘才能閱讀完成。

這篇文章主要介紹了 SQL 參數化查詢能防止 SQL 注入的原因是什么的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇 SQL 參數化查詢能防止 SQL 注入的原因是什么文章都會有所收獲,下面我們一起來看看吧。

SQL 參數化查詢為什么能夠防止 SQL 注入?

1、SQL 注入是什么

將 SQL 命令插入到表單提交或輸入域名或頁面請求的查詢字符串中,欺騙服務器執行惡意的 SQL 命令。

 --  正常的查詢語句
 select * from users where username =  a 
 --  惡意的查詢語句
 select * from users where username =  a  or 1==1;

2、參數化查詢是什么

參數化查詢是指查詢數據庫時,在需要填入數據的地方,使用參數來給值。

set @id = 1;
SELECT * from users WHERE id = @id ;

3、SQL 語句的執行處理

SQL 語句按處理流程看有兩類:即時 SQL、預處理 SQL。

即時 SQL

即時 SQL 從 DB 接收到最終執行完畢返回,大致的過程如下:

 a.  詞法和語義解析
 b.  優化 sql 語句,制定執行計劃
 c.  執行并返回結果

特點:一次編譯,單次運行。

預處理 SQL

程序中某條 sql 可能會被反復調用,或者每次執行的時候只有個別的值不同。如果每次按即時 SQL 的流程來看,效率是比較低的。

這時候可以將 SQL 中的值用占位符代替,先生成 SQL 模板,然后再綁定參數,之后重復執行該語句的時候只需要替換參數,而不用再去進行詞法和語義分析。可以視為 SQL 語句模板化或參數化。

特點:一次編譯,多次運行,省去了多次解析等過程。(多次運行是指在同一會話中再次執行相同的語句,也就不會被再次解析和編譯)

 --  語法
 #  定義預處理語句
 PREPARE stmt_name FROM preparable_stmt;
 #  執行預處理語句
 EXECUTE stmt_name [USING @var_name [, @var_name] ...];
 #  刪除 (釋放) 定義
 {DROP | DEALLOCATE} PREPARE stmt_name;

4、預處理 SQL 是如何防止 SQL 注入的

待執行的 SQL 被編譯后存放在緩存池中,DB 執行 execute 的時候,并不會再去編譯一次,而是找到 SQL 模板,將參數傳遞給它然后執行。所以類似于 or 1==1 的命令會當成參數傳遞,而不會進行語義解析執行。

 --  預處理編譯  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;

關于“SQL 參數化查詢能防止 SQL 注入的原因是什么”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“SQL 參數化查詢能防止 SQL 注入的原因是什么”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注丸趣 TV 行業資訊頻道。

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-13發表,共計1427字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 和政县| 旬邑县| 理塘县| 弥勒县| 合山市| 长兴县| 开化县| 孝昌县| 广汉市| 枣阳市| 洮南市| 大渡口区| 息烽县| 祁东县| 榆社县| 额敏县| 孙吴县| 三门峡市| 安平县| 南城县| 陇南市| 高阳县| 邻水| 墨竹工卡县| 吉首市| 南雄市| 巴中市| 开平市| 桃江县| 商河县| 蓬莱市| 依安县| 成安县| 河曲县| 磴口县| 刚察县| 武冈市| 策勒县| 罗甸县| 龙门县| 隆德县|