劇多
首頁
資訊
體育
娛樂
汽車
投資
財經
軍事
科技
數碼
科學
遊戲
歷史
健康
政治
影視
旅遊
育兒
美食
時尚
房產
農業
社會
文化
教育
技術
美文
情感
故事
家居
職場
自然
闢謠
心理
攝影
漫畫
生活
其它
Club
Tips
熱門話題
搜尋
註冊
登入
首頁
>
Club
>
2021-03-01 05:40
如果要做sql的一個解析器,已經生成ast了,接下來要怎麼做?
6
回覆列表
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
只會被資料庫當做引數來處理。我這樣解釋不知道大家是否明白?
發表回復
∧
中秋節和大豐收的關聯?
∨
一天兩個班三十個員工工作三天休息一天怎麼排班?
熱門排行
地鐵跑酷新的超級跑者新角色羅伯特第三關怎麼過?
怎麼梳37側分?
棗核讀後感?
海錐隔夜能吃嗎?
五五保星卡怎麼沒有用?
蜂蛹放冰箱怎麼保存?
初會缺考記入誠信檔案嗎?
風箏最終會飛到哪裡?
cj麥科勒姆怎麼長高的?
母親節班級集體視頻文案?
都沒有回答的點兒上,部分答者只見樹木不見森林,為什麼這麼說呢,引用一個上邊其他人的回答,
賦值函式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 只會被資料庫當做引數來處理。我這樣解釋不知道大家是否明白?