防止sql注入net
1. ASP.NET網站程序防sql注入式攻擊方法
一 什麼是SQL注入式攻擊?所謂SQL注入式攻擊 就是攻擊者把SQL命令插入到Web表單的輸入域或頁面請求的查詢字元串 欺騙伺服器執行惡意的SQL命令 在某些表單中 用戶輸入的內容直接用來構造(或者影響)動態SQL命令 或作為存儲過程的輸入參數 這類表單特別容易受到SQL注入式攻擊 常見的SQL注入式攻擊過程類如
⑴ 某個 Web應用有一個登錄頁面 這個登錄頁面控制著用戶是否有權訪問應用 它要求用戶輸入一個名稱和密碼
⑵ 登錄頁面中輸入的內容將直接用來構造動態的SQL命令 或者直接用作存儲過程的參數 下面是ASP NET應用構造查詢的一個例子
System Text StringBuilderquery=newSystem Text StringBuilder( SELECT*fromUsersWHERElogin= ) Append(txtLogin Text) Append( ANDpassword= ) Append(txtPassword Text) Append( );
⑶ 攻擊者在用戶名字和密碼輸入框中輸入 或 = 之類的內容
⑷ 用戶輸入的內容提交給伺服器之後 伺服器運行上面的ASP NET代碼構造出查詢用戶的SQL命令 但由於攻擊者輸入的內容非常特殊 所以最後得到的SQL命令變成 SELECT * from Users WHERE login = or = AND password = or =
⑸ 伺服器執行查詢或存儲過程 將用戶輸入的身份信息和伺服器中保存的身份信息進行對比
⑹ 由於SQL命令實際上已被注入式攻擊修改 已經不能真正驗證用戶身份 所以系統會錯誤地授權給攻擊者
如果攻擊者知道應用會將表單中輸入的內容直接用於驗證身份的查詢 他就會嘗試輸入某些特殊的SQL字元串篡改查詢改變其原來的功能 欺騙系統授予訪問許可權
系統環境不同 攻擊者可能造成的損害也不同 這主要由應用訪問資料庫的安全許可權決定 如果用戶的帳戶具有管理員或其他比較高級的許可權 攻擊者就可能對資料庫的表執行各種他想要做的操作 包括添加 刪除或更新數據 甚至可能直接刪除表
二 如何防範?
好在要防止ASP NET應用被SQL注入式攻擊闖入並不是一件特別困難的事情 只要在利用表單輸入的內容構造SQL命令之前 把所有輸入內容過濾一番就可以了 過濾輸入內容可以按多種方式進行
⑴ 對於動態構造SQL查詢的場合 可以使用下面的技術
第一 替換單引號 即把所有單獨出現的單引號改成兩個單引號 防止攻擊者修改SQL命令的含義 再來看前面的例子 SELECT * from Users WHERE login = or = AND password = or = 顯然會得到與 SELECT * from Users WHERE login = or = AND password = or = 不同的結果
第二 刪除用戶輸入內容中的所有連字元 防止攻擊者構造出類如 SELECT * from Users WHERE login = mas AND password = 之類的查詢 因為這類查詢的後半部分已經被注釋掉 不再有效 攻擊者只要知道一個合法的用戶登錄名稱 根本不需要知道用戶的密碼就可以順利獲得訪問許可權
第三 對於用來執行查詢的資料庫帳戶 限制其許可權 用不同的用戶帳戶執行查詢 插入 更新 刪除操作 由於隔離了不同帳戶可執行的操作 因而也就防止了原本用於執行SELECT命令的地方卻被用於執行INSERT UPDATE或DELETE命令
⑵ 用存儲過程來執行所有的查詢 SQL參數的傳遞方式將防止攻擊者利用單引號和連字元實施攻擊 此外 它還使得資料庫許可權可以限制到只允許特定的存儲過程執行 所有的用戶輸入必須遵從被調用的存儲過程的安全上下文 這樣就很難再發生注入式攻擊了
⑶ 限製表單或查詢字元串輸入的長度 如果用戶的登錄名字最多隻有 個字元 那麼不要認可表單中輸入的 個以上的字元 這將大大增加攻擊者在SQL命令中插入有害代碼的難度
⑷ 檢查用戶輸入的合法性 確信輸入的內容只包含合法的數據 數據檢查應當在客戶端和伺服器端都執行——之所以要執行伺服器端驗證 是為了彌補客戶端驗證機制脆弱的安全性
在客戶端 攻擊者完全有可能獲得網頁的源代碼 修改驗證合法性的腳本(或者直接刪除腳本) 然後將非法內容通過修改後的表單提交給伺服器 因此 要保證驗證操作確實已經執行 唯一的辦法就是在伺服器端也執行驗證 你可以使用許多內建的驗證對象 例如RegularExpressionValidator 它們能夠自動生成驗證用的客戶端腳本 當然你也可以插入伺服器端的方法調用 如果找不到現成的驗證對象
你可以通過CustomValidator自己創建一個
⑸ 將用戶登錄名稱 密碼等數據加密保存 加密用戶輸入的數據 然後再將它與資料庫中保存的數據比較 這相當於對用戶輸入的數據進行了 消毒 處理 用戶輸入的數據不再對資料庫有任何特殊的意義 從而也就防止了攻擊者注入SQL命令 System Web Security FormsAuthentication類有一個 非常適合於對輸入數據進行消毒處理
lishixin/Article/program/net/201311/13891
2. SQL參數化查詢--最有效可預防SQL注入攻擊的防禦方式
參數化查詢,作為預防SQL注入攻擊的有效手段,通過在SQL語句中使用參數來傳入值,避免了直接將用戶輸入插入到SQL語句中,從而保護資料庫免受惡意攻擊。廣泛應用於Access、SQL Server、MySQL、SQLite等資料庫。
在ASP環境中,參數化查詢主要通過Connection對象和Command對象實現。對於Access資料庫,使用問號作為參數標志,而SQL Server支持匿名和非匿名參數,但ASP中僅支持匿名方式。
ASP.NET環境下,參數化查詢同樣通過Connection對象和Command對象完成。當資料庫為SQL Server時,可以使用帶參數名的命名參數,格式為「@」字元加參數名。
PHP環境中,MySQL支持的參數格式為「?」加參數名,實現參數化查詢。
綜上所述,參數化查詢是一種有效防止SQL注入攻擊的方法,其在不同編程環境和資料庫系統中均有實現。通過使用參數化查詢,可以確保資料庫安全,避免敏感數據泄露和系統被惡意篡改。
3. sql注入方式和防禦
注入方式:QL注入,就是通過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字元串,最終達到欺騙伺服器執行惡意的SQL命令。防禦:如果是.net的後台 比如sql語句是 id='"+ textbox.Text +"' 就會被注入, 如果[email protected]("@id",textbox.Text) 這樣就可以。用replace把單引等特殊字元替換也行
4. asp.net濡備綍闃叉sql娉ㄥ叆
SQL娉ㄥ叆鏀誨嚮鍜岄勯槻
鍏充簬SQL娉ㄥ叆鏀誨嚮鍙婇槻鑼闅忕潃緗戠粶鐨勬櫘鍙婂拰鍏崇郴鏁版嵁搴撶殑騫挎硾搴旂敤錛岀綉緇滃畨鍏ㄥ彉寰楄秺鏉ヨ秺閲嶈併備笅闈錛屾垜涓轟綘鎼滅儲鏁寸悊浜哠QL娉ㄥ叆鐨勬敾鍑誨拰闃茶寖銆傝峰弬鑰冨苟闃呰匯傚笇鏈涘逛綘鏈夊府鍔┿傛洿澶氫俊鎮璇峰叧娉ㄦ垜浠鐨勫簲灞婃瘯涓氱敓鍩硅緗戱紒
涓.SQL娉ㄥ叆琚鍑
綆鑰岃█涔嬶紝SQL娉ㄥ叆鏄搴旂敤紼嬪簭寮鍙戜漢鍛樺湪搴旂敤紼嬪簭涓鎰忓栧紩鍏SQL浠g爜鐨勮繃紼嬨傚叾搴旂敤紼嬪簭鐨勭碂緋曡捐′嬌涔嬫垚涓哄彲鑳斤紝鍙鏈夐偅浜涚洿鎺ヤ嬌鐢ㄧ敤鎴鋒彁渚涚殑鍊兼潵鏋勫緩SQL璇鍙ョ殑搴旂敤紼嬪簭鎵嶄細鍙楀埌褰卞搷銆
渚嬪傦紝鍦ㄧ敤鎴瘋緭鍏ュ㈡埛ID鍚庯紝GridView鏄劇ず璇ュ㈡埛鐨勬墍鏈夎岃板綍銆傚湪鏇寸湡瀹炵殑鎯呭喌涓嬶紝鐢ㄦ埛蹇呴』杈撳叆瀵嗙爜絳夎よ瘉淇℃伅錛屾垨鑰呮牴鎹涔嬪墠鐨勭櫥褰曢〉闈㈣幏鍙栫敤鎴稩D銆傝繕鍙鑳芥湁涓浜涙枃鏈妗嗕緵鐢ㄦ埛杈撳叆鍏抽敭淇℃伅錛屽傝㈠崟鐨勬棩鏈熻寖鍥存垨浜у搧鍚嶇О銆傞棶棰樻槸濡備綍鎵ц屽懡浠ゃ傚湪榪欎釜渚嬪瓙涓錛孲QL璇鍙ユ槸閫氳繃瀛楃︿覆鏋勯犳妧鏈鍔ㄦ佸壋寤虹殑銆傛枃鏈妗唗xtID鐨勫艱鐩存帴澶嶅埗鍒板瓧絎︿覆涓銆備唬鐮佸備笅:
鍦ㄦ湰渚嬩腑錛屾敾鍑昏呭彲浠ョ℃敼SQL璇鍙ャ傞氬父錛屾敾鍑葷殑絎涓涓鐩鏍囨槸鑾峰彇閿欒淇℃伅銆傚傛灉閿欒澶勭悊涓嶅綋錛屽簳灞備俊鎮灝嗘毚闇茬粰鏀誨嚮鑰呫傝ヤ俊鎮鍙鐢ㄤ簬榪涗竴姝ョ殑鏀誨嚮銆
渚嬪傦紝鎯寵薄涓涓嬪綋鎮ㄥ湪鏂囨湰妗嗕腑杈撳叆浠ヤ笅瀛楃︿覆鏃朵細鍙戠敓浠涔堛
闃垮皵寮楀熀鎴栬1=涓涓
鏌ョ湅緇撴灉鐢熸垚鐨勫畬鏁碨QL璇鍙:
璇ヨ鍙ュ皢榪斿洖鎵鏈夎㈠崟璁板綍錛屽嵆浣胯繖浜涜㈠崟涓嶆槸鐢盇LFDI鍒涘緩鐨勶紝鍥犱負瀵逛簬姣忎竴琛岋紝1=1濮嬬粓涓虹湡銆傝繖鏍峰仛鐨勫悗鏋滄槸涓嶆樉紺哄綋鍓嶇敤鎴風殑鍏蜂綋淇℃伅錛岃屾槸灝嗘墍鏈変俊鎮鏄劇ず緇欐敾鍑昏呫傚傛灉鏁忔劅淇℃伅錛屽傜ぞ浼氬畨鍏ㄥ彿鐮併佺敓鏃ユ垨淇$敤鍗′俊鎮鏄劇ず鍦ㄥ睆騫曚笂錛屽皢浼氬甫鏉ヤ弗閲嶇殑闂棰樸傚叾瀹炶繖浜涚畝鍗曠殑SQL娉ㄥ叆寰寰鏄閭d簺澶у瀷鐢靛晢鐨勭儲鎮箋備竴鑸鏉ヨ達紝鏀誨嚮鐐逛笉鍦ㄤ簬鏂囨湰妗嗭紝鑰屽湪浜庢煡璇㈠瓧絎︿覆(鍙浠ョ敤鏉ュ悜鏁版嵁搴撲紶杈撳礆紝姣斿備粠鍒楄〃欏靛埌璇︾粏欏電殑鍞涓鏍囪瘑絎)銆
榪樺彲浠ヨ繘琛屾洿澶嶆潅鐨勬敾鍑匯備緥濡傦紝鏀誨嚮鑰呭彲浠ヤ嬌鐢ㄤ袱涓榪炲瓧絎(-)鏉ユ敞閲婃帀SQL璇鍙ョ殑鍏朵綑閮ㄥ垎銆傝繖縐嶆敾鍑諱粎闄愪簬SQLServer錛屼絾瀵逛簬鍏朵粬綾誨瀷鐨勬暟鎹搴撲篃鏈夌瓑鏁堢殑鏂規硶錛屾瘮濡侻ySql浣跨敤(#)鍜孫racle浣跨敤(錛)鍙楓傛ゅ栵紝鏀誨嚮鑰呭彲浠ユ墽琛屽寘鍚浠繪剰SQL璇鍙ョ殑鎵瑰勭悊鍛戒護銆傚逛簬SQLServer鎻愪緵紼嬪簭錛屾敾鍑昏呭彧闇鍦ㄦ柊鍛戒護鍓嶉潰鍔犱笂鍒嗗彿(錛)銆傛敾鍑昏呭彲浠ラ氳繃榪欑嶆柟寮忓垹闄ゅ叾浠栬〃鐨勫唴瀹癸紝鐢氳嚦鍙浠ヨ皟鐢⊿QLServer鐨勭郴緇熷瓨鍌ㄨ繃紼媥p_cmdshell鏉ュ懡浠ゅ拰鎵ц屼換鎰忕▼搴忋
鏀誨嚮鑰呭湪鏂囨湰妗嗕腑杈撳叆浠ヤ笅鍐呭癸紝鍏剁洰鏍囨槸鍒犻櫎Customers琛ㄤ腑鐨勬墍鏈夎屻
銆婁雞鏄ャ嬶紱浠庡㈡埛涓鍒犻櫎*
絎浜岋紝棰勯槻
濡備綍闃叉SQL娉ㄥ叆琚鍑伙紵闇瑕佽頒綇鍑犵偣銆傞栧厛錛屼嬌鐢ㄦ枃鏈妗嗘槸涓濂戒富鎰忋侻axLength灞炴ф潵闃叉㈢敤鎴瘋緭鍏ヨ繃闀跨殑瀛楃︺傚洜涓哄畠浠涓嶅熼暱錛屾墍浠ュ噺灝戜簡澶ч噺綺樿創鑴氭湰鐨勫彲鑳芥с傚叾嬈★紝搴旇ヤ嬌鐢ˋSP.NET楠岃瘉鎺т歡鏉ラ攣瀹氶敊璇鐨勬暟鎹(濡傛枃鏈銆佺┖鍗曞厓鏍煎拰鏁板間腑鐨勭壒孌婂瓧絎)銆傛ゅ栵紝鎮ㄥ簲璇ラ檺鍒墮敊璇娑堟伅緇欏嚭鐨勬彁紺恆傚綋鎹曡幏鍒版暟鎹搴撳紓甯告椂錛屽彧鏄劇ず涓浜涘父瑙勪俊鎮(濡傗滄暟鎹婧愰敊璇鈥)錛岃屼笉鏄寮傚父涓鐨勪俊鎮銆傛秷鎮灞炴э紝榪欏彲鑳芥毚闇茬郴緇熸敾鍑葷偣銆
鏇撮噸瑕佺殑鏄錛屽繀欏誨皬蹇冨湴鍒犻櫎鐗規畩瀛楃︺備緥濡傦紝鎮ㄥ彲浠ョ敤涓や釜鍗曞紩鍙鋒浛鎹㈠崟寮曞彿錛岃繖鏍峰氨涓嶄細涓嶴QL璇鍙ョ殑鍒嗛殧絎︽販娣:
瀛楃︿覆ID=txtID銆傛枃鏈()銆傛浛鎹(鈥溾濄佲溾)錛
褰撶劧錛屽傛灉鏂囨湰紜瀹為渶瑕佸寘鍚鍗曞紩鍙鳳紝榪欐牱鍋氫細甯︽潵鍏朵粬楹葷儲銆傛ゅ栵紝涓浜汼QL娉ㄥ叆鏀誨嚮鏄鍙琛岀殑銆傛浛鎹㈠崟寮曞彿鍙浠ラ槻姝㈢敤鎴鋒彁鍓嶇粨鏉熷瓧絎︿覆銆備絾鏄錛屽傛灉鍖呭惈鏁板肩殑SQL璇鍙ユ槸鍔ㄦ佹瀯閫犵殑錛孲QL娉ㄥ叆鏀誨嚮灝嗗啀嬈″彂鎸ヤ綔鐢ㄧ┖銆傝繖涓婕忔礊緇忓父琚蹇借(榪欐槸闈炲父鍗遍櫓鐨)銆傛洿濂界殑瑙e喅鏂規堟槸浣跨敤鍙傛暟鍖栧懡浠ゆ垨瀛樺偍榪囩▼榪涜岃漿涔夛紝浠ラ槻姝SQL娉ㄥ叆鏀誨嚮銆
鍙︿竴涓濂界殑寤鴻鏄闄愬埗鐢ㄤ簬璁塊棶鏁版嵁搴撶殑甯愭埛鐨勬潈闄愩傝ュ笎鎴鋒棤鏉冭塊棶鍏朵粬鏁版嵁搴撴垨鎵ц屾墿灞曞瓨鍌ㄨ繃紼嬨備絾鏄錛岃繖騫朵笉鑳借В鍐砈QL鑴氭湰娉ㄥ叆鐨勯棶棰橈紝鍥犱負鐢ㄤ簬榪炴帴鏁版嵁搴撶殑榪涚▼鍑犱箮鎬繪槸姣斾換浣曞崟涓鐢ㄦ埛闇瑕佹洿澶氱殑鏉冮檺銆傞氳繃闄愬埗鏉冮檺錛屽彲浠ラ槻姝㈠垹闄よ〃鐨勬敾鍑伙紝浣嗘槸涓嶈兘闃叉㈡敾鍑昏呭伔鐪嬪埆浜虹殑銆備俊鎮銆
絎涓夛紝娉ㄥ皠鍚庢敾鍑
綺炬槑鐨勭敤鎴峰彲鑳界煡閬撹繕鏈夊彟涓縐嶆敾鍑籛eb鎺т歡鐨勬綔鍦ㄦ柟娉曘傚敖綆″弬鏁板寲鍛戒護鍙浠ラ槻姝SQL娉ㄥ叆鏀誨嚮錛屼絾瀹冧滑鏃犳硶闃叉㈡敾鍑昏呭悜鍙戦佸洖鏈嶅姟鍣ㄧ殑鏁版嵁涓娣誨姞鎮舵剰鍊箋傚傛灉涓嶆鏌ヨ繖浜涘礆紝鏀誨嚮鑰呭彲浠ユ彁浜ゆ湰鏉ヤ笉瀛樺湪鐨勬帶鍒跺箋
渚嬪傦紝鍋囪炬偍鏈変竴涓鏄劇ず褰撳墠鐢ㄦ埛璁㈠崟鐨勫垪琛ㄣ傜嫛鐚劇殑鏀誨嚮鑰呭彲鑳戒細淇濆瓨欏甸潰鐨勬湰鍦板壇鏈錛屼慨鏀笻TML鍐呭逛互鍚戝垪琛ㄤ腑娣誨姞鏇村氶」鐩錛岀劧鍚庨夋嫨涓涓鈥滃亣鈥濋」鐩銆傚傛灉鏀誨嚮鎴愬姛錛屾敾鍑昏呭皢鑳藉熺湅鍒板叾浠栫敤鎴風殑璁㈠崟錛岃繖鏄劇劧鏄涓涓闂棰樸傚垢榪愮殑鏄錛孉SP.NET浣跨敤涓涓寰堝皯琚鎻愬強鐨勫姛鑳解滀簨浠墮獙璇佲濇潵闃叉㈣繖縐嶆敾鍑匯備簨浠墮獙璇佹鏌ュ彂閫佸洖鏈嶅姟鍣ㄧ殑鏁版嵁錛屽苟楠岃瘉鍏跺肩殑鍚堟硶鎬с備緥濡傦紝濡傛灉鎻愪氦鐨勬暟鎹琛ㄦ槑鐢ㄦ埛閫夋嫨浜嗕竴涓鏃犳剰涔夌殑鏁版嵁(鍥犱負瀹冧笉瀛樺湪浜庢帶浠朵腑)錛孉SP.NET灝嗙敓鎴愪竴涓閿欒騫跺仠姝㈠勭悊銆傞氳繃鍦≒age鎸囦護涓灝咵nableEventValidation灞炴ц劇疆涓篺alse錛屽彲浠ョ佺敤浜嬩歡楠岃瘉銆傚綋鎮ㄥ壋寤轟嬌鐢ㄥ㈡埛絝鑴氭湰鍔ㄦ佹洿鏀瑰唴瀹圭殑欏甸潰鏃訛紝鎮ㄩ渶瑕佹墽琛屾ゆラゃ備絾鏄錛屾ゆ椂錛屽湪浣跨敤榪欎簺鍊間箣鍓嶏紝璇鋒敞鎰忔鏌ユ綔鍦ㄧ殑鍚庢敞鍏ユ敾鍑匯
;MyBatis鎬庝箞闃叉SQL娉ㄥ叆錛
鐢#{鍙傛暟}榪涜岄勭紪璇戝氨鍙浠ラ槻姝浜嗭紝鍗冧竾鍒鐢${}榪欑嶆柟寮忔敞鍏ュ弬鏁般
mybatis妗嗘灦浣滀負涓嬈懼崐鑷鍔ㄥ寲鐨勬寔涔呭眰妗嗘灦錛屽叾sql璇鍙ラ兘瑕佹垜浠鑷宸辨潵鎵嬪姩緙栧啓錛岃繖涓鏃跺欏綋鐒墮渶瑕侀槻姝sql娉ㄥ叆銆傚叾瀹濵ybatis鐨剆ql鏄涓涓鍏鋒湁鈥滆緭鍏+杈撳嚭鈥濆姛鑳斤紝綾諱技浜庡嚱鏁扮殑緇撴瀯錛屽備笅錛
selectid,title,author,content
fromblogwhereid=#{id}
榪欓噷錛宲arameterType鏍囩ず浜嗚緭鍏ョ殑鍙傛暟綾誨瀷錛宺esultType鏍囩ず浜嗚緭鍑虹殑鍙傛暟綾誨瀷銆傚洖搴斾笂鏂囷紝濡傛灉鎴戜滑鎯抽槻姝sql娉ㄥ叆錛岀悊鎵褰撶劧鍦拌佸湪杈撳叆鍙傛暟涓婁笅鍔熷か銆備笂闈浠g爜涓楂樹寒閮ㄥ垎鍗寵緭鍏ュ弬鏁板湪sql涓鎷兼帴鐨勯儴鍒嗭紝浼犲叆鍙傛暟鍚庯紝鎵撳嵃鍑烘墽琛岀殑sql璇鍙ワ紝浼氱湅鍒皊ql鏄榪欐牱鐨勶細
selectid,title,author,contentfromblogwhereid=?
涓嶇¤緭鍏ヤ粈涔堝弬鏁幫紝鎵撳嵃鍑虹殑sql閮芥槸榪欐牱鐨勩傝繖鏄鍥犱負mybatis鍚鐢ㄤ簡棰勭紪璇戝姛鑳斤紝鍦╯ql鎵ц屽墠錛屼細鍏堝皢涓婇潰鐨剆ql鍙戦佺粰鏁版嵁搴撹繘琛岀紪璇戱紝鎵ц屾椂錛岀洿鎺ヤ嬌鐢ㄧ紪璇戝ソ鐨剆ql錛屾浛鎹㈠崰浣嶇︹滐紵鈥濆氨鍙浠ヤ簡銆傚洜涓簊ql娉ㄥ叆鍙鑳藉圭紪璇戣繃紼嬭搗浣滅敤錛屾墍浠ヨ繖鏍風殑鏂瑰紡灝卞緢濂藉湴閬垮厤浜唖ql娉ㄥ叆鐨勯棶棰樸
緗戠珯濡備綍闃叉SQL娉ㄥ叆錛
闃叉SQL娉ㄥ叆鐨勬柟娉曞氨鏄涓嶈佸湪紼嬪簭涓浣跨敤鎷兼帴鐨勬柟寮忕敓鎴怱QL璇鍙
濡:"select*fromTableNamewherecolumnName='"+鍙橀噺+"'"
榪欐牱寰堝規槗琚娉ㄥ叆錛
濡傛灉鍙橀噺="'or1=1--"
榪欏彞sql鐨勬潯浠跺皢姘歌繙涓虹湡
濡傛灉閲囩敤鎷兼帴SQL瑕佹妸鍙橀噺涓鐨'錛堝崟寮曞彿錛夋浛鎹涓''錛堜袱涓鍗曞紩鍙鳳級
棰勭紪璇戜負浠涔堣兘闃叉sql娉ㄥ叆錛
鍥犱負preparedStatement涓鍙浠ヤ笉鍖呭惈鏁版嵁錛屽彧鍖呭惈鎿嶄綔錛岃繖鏍峰氨涓嶉渶瑕佺敤鏁版嵁鏉ユ嫾鎺SQL銆
java濡備綍闃瞫ql鏀誨嚮錛
java闃睸QL娉ㄥ叆,鏈綆鍗曠殑鍔炴硶鏄鏉滅粷SQL鎷兼帴,SQL娉ㄥ叆鏀誨嚮鑳藉緱閫炴槸鍥犱負鍦ㄥ師鏈塖QL璇鍙ヤ腑鍔犲叆浜嗘柊鐨勯昏緫錛屽傛灉浣跨敤PreparedStatement鏉ヤ唬鏇縎tatement鏉ユ墽琛孲QL璇鍙ワ紝鍏跺悗鍙鏄杈撳叆鍙傛暟錛孲QL娉ㄥ叆鏀誨嚮鎵嬫靛皢鏃犳晥錛岃繖鏄鍥犱負PreparedStatement涓嶅厑璁稿湪涓嶅悓鐨勬彃鍏ユ椂闂存敼鍙樻煡璇㈢殑閫昏緫緇撴瀯,澶ч儴鍒嗙殑SQL娉ㄥ叆宸茬粡鎸′綇浜,鍦╓EB灞傛垜浠鍙浠ヨ繃婊ょ敤鎴風殑杈撳叆鏉ラ槻姝SQL娉ㄥ叆姣斿傜敤Filter鏉ヨ繃婊ゅ叏灞鐨勮〃鍗曞弬鏁般備笅闈㈠氨涓句笁涓渚嬪瓙鏉ヨ存槑涓涓嬶細
絎涓縐嶏細
閲囩敤棰勭紪璇戣鍙ラ泦錛屽畠鍐呯疆浜嗗勭悊SQL娉ㄥ叆鐨勮兘鍔涳紝鍙瑕佷嬌鐢ㄥ畠鐨剆etString鏂規硶浼犲煎嵆鍙錛屽備笅鎵紺猴細
Stringsql="select*fromuserswhereusername=?andpassword=?;PreparedStatementpreState=conn.prepareStatement(sql);preState.setString(1,userName);preState.setString(2,password);ResultSetrs=preState.executeQuery();...
絎浜岀嶏細
閲囩敤姝e垯琛ㄨ揪寮忓皢鍖呭惈鏈夊崟寮曞彿(')錛屽垎鍙(;)鍜屾敞閲婄﹀彿(--)鐨勮鍙ョ粰鏇挎崲鎺夋潵闃叉SQL娉ㄥ叆錛屽備笅鎵紺猴細
(Stringstr)
{
returnstr.replaceAll(".*(+|(--)+).*","");
}
userName=TransactSQLInjection(userName);
password=TransactSQLInjection(password);
Stringsql="select*fromuserswhereusername='"+userName+"'andpassword='"+password+"'"
Statementsta=conn.createStatement();
ResultSetrs=sta.executeQuery(sql);
絎涓夌嶏細
浣跨敤Hibernate妗嗘灦鐨凷QL娉ㄥ叆闃茶寖Hibernate鏄鐩鍓嶄嬌鐢ㄦ渶澶氱殑ORM妗嗘灦錛屽湪JavaWeb寮鍙戜腑錛屽緢澶氭椂鍊欎笉鐩存帴浣跨敤JDBC錛岃屼嬌鐢℉ibernate鏉ユ彁楂樺紑鍙戞晥鐜囥
鍦℉ibernate涓錛屼粛鐒朵笉搴旇ラ氳繃鎷兼帴HQL鐨勬柟寮忥紝鑰屽簲浣跨敤鍙傛暟鍖栫殑鏂瑰紡鏉ラ槻鑼僑QL娉ㄥ叆銆傛湁涓ょ嶆柟寮忥紝涓縐嶄粛鐒舵槸浣跨敤JDBC涓鏍風殑鍗犱綅絎︹?鈥濓紝浣嗘洿濂界殑鏂瑰紡鏄浣跨敤Hibernate鐨勫懡鍚嶅弬鏁幫紝渚嬪傛嫻嬬敤鎴峰悕鍜屽瘑鐮佹槸鍚︽g『錛屼嬌鐢℉ibernate鍙浠ュ啓鎴愬備笅錛
StringqueryStr=鈥渇romuserwhereusername=:username鈥+鈥漰assword=:password鈥;
Listresult=session.createQuery(queryStr).setString("username",username).setString("password",password).list();