劇多
首頁
資訊
體育
娛樂
汽車
投資
財經
軍事
科技
數碼
科學
遊戲
歷史
健康
政治
影視
旅遊
育兒
美食
時尚
房產
農業
社會
文化
教育
技術
美文
情感
故事
家居
職場
自然
闢謠
心理
攝影
漫畫
生活
其它
Club
Tips
熱門話題
搜尋
註冊
登入
首頁
>
Club
>
2021-03-01 05:40
如果要做sql的一個解析器,已經生成ast了,接下來要怎麼做?
5
回覆列表
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
只會被資料庫當做引數來處理。我這樣解釋不知道大家是否明白?
發表回復
∧
中秋節和大豐收的關聯?
∨
一天兩個班三十個員工工作三天休息一天怎麼排班?
熱門排行
文本框大小不變頭像怎麼調大小?
五菱榮光發動機壞了換江鈴發動機怎麼樣?
喜歡比自己小的男孩的文案?
移動空調單冷一體機用加氟嗎?
教資為什麼不在本地考?
電商平台辦理充值賬戶需資質?
萬象小組件怎麼添加應用?
布穀鳥聲卡音響一體機怎麼拆開?
長方形手帳本怎麼做紫色系?
金利源淨水器k1和k2的區別?
都沒有回答的點兒上,部分答者只見樹木不見森林,為什麼這麼說呢,引用一個上邊其他人的回答,
賦值函式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 只會被資料庫當做引數來處理。我這樣解釋不知道大家是否明白?