當前位置:首頁 » 操作系統 » 資料庫被注入攻擊

資料庫被注入攻擊

發布時間: 2024-05-19 16:21:31

『壹』 sql注入攻擊怎麼解決

網路:

SQL注入攻擊是你需要擔心的事情,不管你用什麼web編程技術,再說所有的web框架都需要擔心這個的。你需要遵循幾條非常基本的規則:
1)在構造動態SQL語句時,一定要使用類安全(type-safe)的參數加碼機制。大多數的數據API,包括ADO和ADO. NET,有這樣的支持,允許你指定所提供的參數的確切類型(譬如,字元串,整數,日期等),可以保證這些參數被恰當地escaped/encoded了,來避免黑客利用它們。一定要從始到終地使用這些特性。
例如,在ADO. NET里對動態SQL,你可以象下面這樣重寫上述的語句,使之安全:
Dim SSN as String = Request.QueryString("SSN")
Dim cmd As new SqlCommand("SELECT au_lname,au_fname FROM authors WHERE au_id = @au_id")
Dim param = new SqlParameter("au_id",SqlDbType.VarChar)
param.Value = SSN
cmd.Parameters.Add(param)
這將防止有人試圖偷偷注入另外的SQL表達式(因為ADO. NET知道對au_id的字元串值進行加碼),以及避免其他數據問題(譬如不正確地轉換數值類型等)。注意,VS 2005內置的TableAdapter/DataSet設計器自動使用這個機制,ASP. NET 2.0數據源控制項也是如此。
一個常見的錯誤知覺(misperception)是,假如你使用了存儲過程或ORM,你就完全不受SQL注入攻擊之害了。這是不正確的,你還是需要確定在給存儲過程傳遞數據時你很謹慎,或在用ORM來定製一個查詢時,你的做法是安全的。
2) 在部署你的應用前,始終要做安全審評(security review)。建立一個正式的安全過程(formal security process),在每次你做更新時,對所有的編碼做審評。後面一點特別重要。很多次我聽說開發隊伍在正式上線(going live)前會做很詳細的安全審評,然後在幾周或幾個月之後他們做一些很小的更新時,他們會跳過安全審評這關,推說,「就是一個小小的更新,我們以後再做編碼審評好了」。請始終堅持做安全審評。
3) 千萬別把敏感性數據在資料庫里以明文存放。我個人的意見是,密碼應該總是在單向(one-way)hashed過後再存放,我甚至不喜歡將它們在加密後存放。在默認設置下,ASP. NET 2.0 Membership API 自動為你這么做,還同時實現了安全的SALT 隨機化行為(SALT randomization behavior)。如果你決定建立自己的成員資料庫,我建議你查看一下我們在這里發表的我們自己的Membership provider的源碼。同時也確定對你的資料庫里的信用卡和其他的私有數據進行了加密。這樣即使你的資料庫被人入侵(compromised)了的話,起碼你的客戶的私有數據不會被人利用。
4)確認你編寫了自動化的單元測試,來特別校驗你的數據訪問層和應用程序不受SQL注入攻擊。這么做是非常重要的,有助於捕捉住(catch)「就是一個小小的更新,所有不會有安全問題」的情形帶來的疏忽,來提供額外的安全層以避免偶然地引進壞的安全缺陷到你的應用里去。
5)鎖定你的資料庫的安全,只給訪問資料庫的web應用功能所需的最低的許可權。如果web應用不需要訪問某些表,那麼確認它沒有訪問這些表的許可權。如果web應用只需要只讀的許可權從你的account payables表來生成報表,那麼確認你禁止它對此表的 insert/update/delete 的許可權。
6)很多新手從網上下載SQL通用防注入系統的程序,在需要防範注入的頁面頭部用 來防止別人進行手動注入測試(。
可是如果通過SQL注入分析器就可輕松跳過防注入系統並自動分析其注入點。然後只需要幾分鍾,你的管理員賬號及密碼就會被分析出來。
7)對於注入分析器的防範,筆者通過實驗,發現了一種簡單有效的防範方法。首先我們要知道SQL注入分析器是如何工作的。在操作過程中,發現軟體並不是沖著「admin」管理員賬號去的,而是沖著許可權(如flag=1)去的。這樣一來,無論你的管理員賬號怎麼變都無法逃過檢測。
第三步:既然無法逃過檢測,那我們就做兩個賬號,一個是普通的管理員賬號,一個是防止注入的賬號,為什麼這么說呢?筆者想,如果找一個許可權最大的賬號製造假象,吸引軟體的檢測,而這個賬號里的內容是大於千字以上的中文字元,就會迫使軟體對這個賬號進行分析的時候進入全負荷狀態甚至資源耗盡而死機。下面我們就來修改資料庫吧。
⒈對表結構進行修改。將管理員的賬號欄位的數據類型進行修改,文本型改成最大欄位255(其實也夠了,如果還想做得再大點,可以選擇備注型),密碼的欄位也進行相同設置。
⒉對表進行修改。設置管理員許可權的賬號放在ID1,並輸入大量中文字元(最好大於100個字)。
⒊把真正的管理員密碼放在ID2後的任何一個位置(如放在ID549上)。
由於SQL注入攻擊針對的是應用開發過程中的編程不嚴密,因而對於絕大多數防火牆來說,這種攻擊是「合法」的。問題的解決只有依賴於完善編程。專門針對SQL注入攻擊的工具較少,Wpoison對於用asp,php進行的開發有一定幫助...。

『貳』 sql注入攻擊方法有哪些

所謂SQL注入式攻擊,就是攻擊者把SQL命令插入到Web表單的輸入域或頁面請求的查詢字元串,欺騙伺服器執行惡意的SQL命令。在某些表單中,用戶輸入的內容直接用來構造(或者影響)動態SQL命令,或作為存儲過程的輸入參數,這類表單特別容易受到SQL注入式攻擊。常見的SQL注入式攻擊過程類如:
⑴ 某個ASP.NET Web應用有一個登錄頁面,這個登錄頁面控制著用戶是否有權訪問應用,它要求用戶輸入一個名稱和密碼。
⑵ 登錄頁面中輸入的內容將直接用來構造動態的SQL命令,或者直接用作存儲過程的參數。

『叄』 緗戠珯鏁版嵁搴(SQL)琚娉ㄥ叆js鏈ㄩ┈錛屼笉鐭ラ亾鎬庝箞闃

娓呴櫎錛氬彲浠ョ敤DW鎵歸噺鏌ユ壘<script language=javascript src=涓涓緗戝潃></script>鐒跺悗鍒犻櫎 鎴栬呬嬌鐢∕acfee 鎴 緗戠珯琚鎸傞┈鎵歸噺娓呴櫎宸ュ叿 鏉ユ竻闄ゆ湪椹銆

鍦ㄦ竻鐞嗗畬鏈ㄩ┈浠ュ悗錛屽敖閲忔煡鎵懼嚭鏄鍝閲屽嚭浜嗛棶棰橈紝瀵艱嚧琚鎸傞┈ 鏈夊備笅i涓鍘熷洜錛1錛氱綉絝欒嚜韜瀹夊叏婕忔礊錛屽湪紼嬪簭涓婂瓨鍦ㄥ畨鍏ㄩ棶棰 姣斿係QL娉ㄥ叆鎴栬卽pfile涓婁紶婕忔礊 絳 鎵浠ュ彧瑕佹煡鎵懼嚭闂棰樻墍鍦 榪欏氨寰堝規槗鍘諱慨澶嶄簡錛 濡傛灉浣犱嬌鐢ㄧ綉涓婃彁渚涚殑寮婧愮殑紼嬪簭,閭f垜鎯充篃浼氭湁閽堝規紡媧炵殑琛ヤ竵銆傚啀鎴栬呬綘淇澶嶄笉鏄庣櫧鐨勮瘽灝卞垹闄ゆ垨鑰呯佺敤榪欎釜鏂囦歡銆
2錛氬傛灉浣犱嬌鐢ㄧ殑鏄鉶氭嫙涓繪満鐨勮瘽 鍙鑳芥槸鍙楀悓鏈嶅姟鍣ㄤ笅鍏朵粬緗戠珯褰卞搷

3錛氬傛灉浣犳槸鍗曠嫭鏈嶅姟鍣 鍦ㄨ嚜韜緗戠珯娌¢棶棰樼殑鎯呭喌涓嬶紝鍙鑳芥槸ARP

『肆』 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();

『伍』 PHP代碼網站如何防範SQL注入漏洞攻擊建議分享

做為網路開發者的你對這種黑客行為恨之腔銀悶入骨,當然也有必要了解一下SQL注入這種功能方式的原理並學會如何通過代碼來保護自己的網站資料庫。今天就通過PHP和MySQL資料庫為例,分享一下我所了解的SQL注入攻擊和一些簡單的防範措施和一些如何避免SQL注入攻擊的建議。
簡單來說,SQL注入是使用代碼漏洞來獲取網站或應用程序後台的SQL資料庫中的數據,進而可以取得資料庫的訪問許可權。比如,黑客可以利用網站代碼的漏洞,使用SQL注入的方式取得一個公司網站後台資料庫里所有的數據信息。拿到資料庫管理員登錄用戶名和密碼後黑客可以自由修改資料庫中的內容甚至刪除該資料庫。SQL注入也可以用來檢驗一個網站或應用的安全性。SQL注入的方式有很多種,但本文將只討論最基本的原理,我們將以PHP和MySQL為例。本文的例子很簡單,如果你使用其它語言理解起來也不會有難度,重點關注SQL命令即可。
一個簡單的SQL注入攻擊案例
假如我們有一個公司網站,在網站的後台資料庫中保存了所有的客戶數據等重要信息。假如網站登錄頁面的代碼中有這樣一條命令來讀取用戶信息。
$q = "SELECT `id` FROM `users` WHERE `username`= ' " .$_GET['username']. " ' AND `password`= ' " .$_GET['password']. " ' ";?>現在有一個黑客想攻擊你的資料庫,他會嘗試在此登錄頁面的用戶名的輸入框中輸入以下代碼:
' ; SHOW TABLES;
點擊登陸鍵,這個頁面就會顯示出資料庫中的所有表。如果他現在使用下面這行命令:
'; DROP TABLE [table name];
這樣他就把一張表刪除了!
防範SQL注入 - 使用mysql_real_escape_string()函數
在資料庫操作的代碼中用這個函數mysql_real_escape_string()可以將代碼中伍彎特殊字元過濾掉,如引號等。如下例:
$q = "SELECT `id` FROM `users` WHERE `username`= ' " .mysql_real_escape_string( $_GET['username'] ). " ' AND `password`= ' " .mysql_real_escape_string( $_GET['password'] ). " ' ";?>防範SQL注入 - 使用mysql_query()函數
mysql_query()的特別是它將只執行SQL代碼的第一條,而後面的並不會執行。回想在最前面的例子中,黑客通過代碼來例後台執行了多條SQL命令,顯示出了所有表的名稱。所以mysql_query()函數可以取到進一步保護的作用。我們進一步演化剛才的代碼就得到了下面的代碼:
//connection
$database = mysql_connect("localhost", "username","password");
//db selection
$q = mysql_query("SELECT `id` FROM `users` WHERE `username`= ' " .mysql_real_escape_string( $_GET['username'] ). " ' AND `password`= ' " .mysql_real_escape_string( $_GET['password'] ). " ' ", $database);?>除此之外,我們還可以在PHP代碼中判斷輸入值的長度,或者專門用一個函數來檢查輸入的值。所以在接受用戶輸入值的地方一定要做好輸入內容的過濾和檢查。當然學習和了解最新的SQL注入方式也非常重要,這樣才能做到有目的的防範。如果使用的是平台式的網站系統如Wordpress,要注意及時搏御打上官方的補丁或升級到新的版本。

熱點內容
資料庫動態查詢 發布:2024-06-22 20:19:18 瀏覽:950
linuxtab鍵 發布:2024-06-22 20:16:28 瀏覽:485
解壓成光碟0 發布:2024-06-22 19:37:20 瀏覽:1000
keil4編譯輸出 發布:2024-06-22 19:37:20 瀏覽:799
方舟怎麼設置私人伺服器 發布:2024-06-22 19:37:18 瀏覽:113
javanpe 發布:2024-06-22 19:32:19 瀏覽:50
weblogiclinux集群部署 發布:2024-06-22 19:29:19 瀏覽:21
入戶上傳 發布:2024-06-22 19:00:37 瀏覽:511
ftp站點是什麼 發布:2024-06-22 19:00:26 瀏覽:684
通過郵箱地址查找伺服器地址 發布:2024-06-22 18:58:53 瀏覽:353