回覆列表
  • 1 # 網路圈

    相信大家對於SQL注入都有一定了解,也都知道SQL引數化查詢可以防止SQL注入,那為什麼SQL引數化查詢可以防止注入呢?關於這個問題估計也是有不少人是不清楚的。

    SQL注入是什麼?

    我們說的SQL注入是指使用者透過提交資料,拼裝構造了惡意的資料庫SQL語句,從而進行攻擊行為。

    比如有這樣一段SQL:

    select * from user where userName="susan" and pwd="12345"

    此時如果userName處傳入的是: " or 1=1 -- ,那麼SQL就會變成下面這樣的:

    select * from user where userName="" or 1=1 -- " and pwd="12345"

    而 -- 代表的是註釋,此時SQL的條件變成了使用者名稱為空字串或者1=1(永為真),並不需要校驗密碼了。

    防止SQL的手段

    對使用者輸入的資料做過濾及轉義處理;

    以儲存過程來執行,比較麻煩;

    SQL預編譯/引數化查詢。

    引數化查詢為什麼可以防止SQL注入?

    引數化查詢其實採用了預編譯的方法,先將SQL語句中的引數部分進行編譯,生成對應的臨時變數集,然後再使用對應的設定方法為這些臨時變數進行賦值,在賦值前會對傳入的引數進行強制型別檢查和相關安全檢查,這樣一來就避免了SQL注入。

    比如上面那段SQL,如果把使用者名稱以引數化傳遞(如:@userName),資料庫對SQL指令編譯後(知道@userName處應該傳遞的是字串),在接收到 @userName 引數值後,即使字串裡有單引號或者註釋這些字元,也都會被當成字串來處理,不會把它把成SQL裡的關鍵字、定界符等來處理。

  • 中秋節和大豐收的關聯?
  • 離職時,感謝對上司及同事的告別用語有哪些?