回覆列表
  • 1 # 使用者2155630907882

    都沒有回答的點兒上,部分答者只見樹木不見森林,為什麼這麼說呢,引用一個上邊其他人的回答,

    賦值函式setString(),會對傳入的引數進行強制型別檢查和安全檢查,所以就避免了SQL注入的產生。@王音引用王音的回答,乍眼一看,貌似說的很有道理,但是仔細想一想,就會發現漏洞,我con.prepareStatement生成預編譯物件後,透過給引數複製set, 這裡沒錯,但是完全依靠 setString,setInt 就可以完全規避sql注入了嗎,如果我引數型別是一個名字name,引數值 完全可以 張三‘ or "1=1 這個值來進行攻擊,所以 ,使用預編譯 是可以防止sql注入,但是這種說法不是正確的原因。 我來解釋一下,如果有失偏頗,還請各位讀者指正,預編譯之所以能防止sql注入(我在這裡只說sql注入這方面),還要從sql的執行方式有關。一般來說,sql 是怎麼執行的呢?簡單說,一個sql 是經過解析器編譯並執行,注意這裡是一個字。舉一個栗子,校驗有沒有這個使用者的場景sql, 上邊的資料庫執行時,是直接將這句話連帶 name="張三",一起給編譯了,然後執行。假設我的sql 注入語句是 即name 引數為張三‘ or "1=1 ,這個引數也會被編譯器一同編譯。 而使用預編譯,資料庫是怎麼處理的呢?這個步驟是在con.prepareStatement(“”)語句執行的時候,伺服器就這個sql傳送給了資料庫,然後資料庫將該sql編譯後放入到快取池中。等到伺服器執行execute的時候,傳給資料庫的 張三‘ or "1=1 編譯器並不進行編譯,而是這找到原來的sql模板,傳參,執行。所以, 張三‘ or "1=1 只會被資料庫當做引數來處理。我這樣解釋不知道大家是否明白?

  • 中秋節和大豐收的關聯?
  • 一天兩個班三十個員工工作三天休息一天怎麼排班?