• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      基于JSP+MySQL的用戶登錄系統(tǒng)SQL注入實(shí)例及防范

      2020-09-16 14:36:42丁佳
      關(guān)鍵詞:字符串表單語句

      ◆丁佳

      安全模型、算法與編程

      基于JSP+MySQL的用戶登錄系統(tǒng)SQL注入實(shí)例及防范

      ◆丁佳

      (山東維平信息安全測(cè)評(píng)技術(shù)有限公司 山東 250000)

      SQL注入攻擊是常用攻擊方式之一,它是由于程序員疏忽而產(chǎn)生的一種信息安全漏洞。本文通過在基于JSP和MySQL技術(shù)編寫的用戶登錄程序演示SQL注入繞過登錄實(shí)例,詳細(xì)分析注入漏洞產(chǎn)生的原因,從代碼層和平臺(tái)層兩個(gè)方面有針對(duì)性地提出有效的防范SQL注入攻擊方法,并提出一些可行代碼,確保數(shù)據(jù)庫中信息安全。

      JSP;MySQL;SQL注入攻擊;數(shù)據(jù)庫;信息安全

      JSP全稱是Java Server Pages,是一種動(dòng)態(tài)網(wǎng)頁開發(fā)技術(shù)。它使用JSP標(biāo)簽在HTNML網(wǎng)頁中插入Java代碼。標(biāo)簽通常以<%開頭以%>結(jié)束。JSP為一種Java servlet,它可以通過網(wǎng)頁表單獲取用戶輸入數(shù)據(jù)、訪問數(shù)據(jù)庫及其他數(shù)據(jù)源,然后動(dòng)態(tài)地創(chuàng)建網(wǎng)頁,用于實(shí)現(xiàn)Java web應(yīng)用程序的用戶界面部分[1]。

      MySQL是一個(gè)關(guān)系型數(shù)據(jù)庫(Relational Database Management System),它開源免費(fèi),能夠跨平臺(tái),支持分布式,性能良好,能與JSP、PHP等Web開發(fā)語言配合。

      通過JSP和MySQL配合,基于Tomcat下,能夠完成中小型系統(tǒng)的開發(fā)。

      1 SQL注入原理

      SQL注入攻擊本質(zhì)是攻擊者將惡意查詢字符串通過Web表單遞交,以域名訪問或頁面請(qǐng)求等方式發(fā)送給服務(wù)器,最終達(dá)到欺騙數(shù)據(jù)庫執(zhí)行惡意的查詢字符串。更詳細(xì)來說,它是利用現(xiàn)有程序,通過在表單,域名地址,post或get請(qǐng)求上的漏洞,輸入惡意的SQL語句,使后臺(tái)數(shù)據(jù)庫引擎不是按照設(shè)計(jì)者意圖執(zhí)行命令,從而得到一個(gè)存在安全漏洞的網(wǎng)站上的數(shù)據(jù)庫。Web服務(wù)器的注入過程如圖1所示。

      圖1 Web服務(wù)器的注入過程

      2 登錄系統(tǒng)實(shí)例

      本文要基于一個(gè)實(shí)際系統(tǒng)后臺(tái)進(jìn)行實(shí)例分析,因此,解析系統(tǒng)各方面的設(shè)計(jì),能夠?yàn)榱私釹QL注入漏洞產(chǎn)生深層次的原由提供一個(gè)理論基礎(chǔ)。該系統(tǒng)開發(fā)環(huán)境如下:MyEclipse10,MySQL Server 5.0,apache-tomcat-7.0.99。

      2.1 數(shù)據(jù)庫數(shù)據(jù)表設(shè)計(jì)

      數(shù)據(jù)庫命名為sqldemo,用戶表命名為user,其中包含賬號(hào),密碼,名字三個(gè)字段,庫中字段定義如圖2所示。

      圖2 字段定義

      利用工具NavicatforMySQL在user插入數(shù)據(jù),如圖3所示,user表中共有三條記錄。

      圖3 user的數(shù)據(jù)記錄

      2.2 系統(tǒng)頁面設(shè)計(jì)

      (1)登錄頁面布局

      登錄頁面命名為login.jsp,通過HTML設(shè)計(jì)登錄表單,通過post方法將表單數(shù)據(jù)提交給loginsuccess.jsp進(jìn)行處理,登錄頁面布局如圖4所示。

      圖4 登錄頁面展示

      (2)后臺(tái)頁面布局

      后臺(tái)主頁命名為lead.jsp,通過login.jsp表單提交正確賬號(hào)密碼后,將會(huì)跳轉(zhuǎn)至該頁面,頁面布局如圖5所示。

      圖5 后臺(tái)頁面布局

      (3)登錄功能代碼設(shè)計(jì)

      當(dāng)通過表單提交賬號(hào)密碼時(shí),系統(tǒng)要能查詢?cè)撚脩羰欠翊嬖?,方可跳轉(zhuǎn)至后臺(tái)頁面,代碼設(shè)計(jì)如下:

      3 SQL注入攻擊實(shí)例與防范

      3.1 攻擊演示

      正常登錄的情況應(yīng)為當(dāng)用戶輸入與數(shù)據(jù)庫中存儲(chǔ)的記錄一致的賬號(hào)密碼時(shí),跳轉(zhuǎn)至后臺(tái)頁面。但經(jīng)過檢測(cè),發(fā)現(xiàn)該程序存在SQL注入漏洞,若用戶輸入’or1=1#,再輸入任意密碼,便可實(shí)現(xiàn)無賬號(hào)密碼登錄后臺(tái),如圖6所示。

      圖6 登錄漏洞注入

      3.2 原因分析

      驗(yàn)證身份登錄SQL語句是:select * from user where acnumber='"+acn+"' and password='"+pw+"'",當(dāng)acn=“’or 1=1#”(單引號(hào)用于閉合,#注釋后面語句),語句就被構(gòu)造成select * from user where acnumber='’or 1=1#' and password=''",由于where條件中or 1=1條件永為真,”#”又將后面的語句注釋,使其不起作用,因此若執(zhí)行成功將返回一個(gè)非空集合從而成功騙過系統(tǒng),獲取合法身份。

      3.3 防范方法

      針對(duì)JSP+MySQL環(huán)境以及代碼上編寫缺陷,本文將分別從代碼層和平臺(tái)層兩個(gè)方面提出有效防范方法。

      3.3.1代碼層防御

      在代碼層上實(shí)現(xiàn)防御,關(guān)鍵是要關(guān)注與SQL注入相關(guān)的安全編碼行為[2]。SQL注入漏洞很大程度上是由于代碼編寫人員不嚴(yán)謹(jǐn),缺乏實(shí)踐經(jīng)驗(yàn)而導(dǎo)致,因此,提高代碼層面上的安全性可以有效防范SQL注入攻擊。

      (1)使用PreparedStatement。

      PreparedStatement是Statement的子接口,它采用預(yù)編譯語句集,可以傳入帶占位符的SQL語句,極大地提高了安全性。上文的代碼是使用Statement形式的SQL語句的形式,直接將用戶輸入代入SQL中并執(zhí)行。而當(dāng)使用PreparedStatement,則可以將SQL作為參數(shù)傳入,不再對(duì)SQL語句進(jìn)行解析,避免了SQL注入的問題,代碼如下:

      (2)使用正則表達(dá)式過濾傳入?yún)?shù)

      正則表達(dá)式用于描述一種字符串的匹配模式,可以用來檢查一個(gè)字符串中是否含有某種子串、或從字符串中取出某個(gè)符合某個(gè)條件的數(shù)據(jù)等。利用正則表達(dá)式,可將實(shí)現(xiàn)SQL注入攻擊的特殊字符過濾,如單引號(hào),#字符等。當(dāng)將外部輸入的參數(shù)中的SQL關(guān)鍵詞過濾,就可以從源頭上阻止SQL注入攻擊。以上文實(shí)例為例,對(duì)利用單引號(hào)實(shí)現(xiàn)繞過用戶認(rèn)證機(jī)制的’or 1=1#語句,可以構(gòu)造如下表達(dá)式:

      /(\%27)|(’)|(--)|(\%23)|(#)/ix

      “(\%27)|(’)”和“(\%23)”分別為匹配單引號(hào)、“#”字符的URL編碼值或其十六進(jìn)制值,“i”表示將匹配到字母的大小寫進(jìn)行忽略[3]。通過該表達(dá)式檢測(cè)用戶輸入字符是否合法,避免了用戶利用單引號(hào)和“#”字符構(gòu)造惡意輸入,代碼如下:

      (3)字符串過濾

      字符串過濾是一個(gè)比較通過的方法,與正則表達(dá)式相似,它通過設(shè)定過濾參數(shù),將引起SQL注入攻擊的SQL語句中常見的字符串進(jìn)行黑名單標(biāo)記,如:select,union,and,or,update,delete等。凡是在“黑名單”中的字符串,一律視為非法輸入,代碼如下:

      (4)JSP頁面判斷代碼

      在JSP頁面當(dāng)中可以使用Javascript在客戶端進(jìn)行不安全字符屏蔽。Javascript是一種以函數(shù)優(yōu)先的輕量級(jí)語言,可以操縱HTML各種頁面的對(duì)象,因此,可以通過Javascript在客戶端進(jìn)行數(shù)據(jù)驗(yàn)證。主要方法是通過編寫function函數(shù),在用戶提交輸入數(shù)據(jù)時(shí),觸發(fā)函數(shù)執(zhí)行,完成相應(yīng)檢測(cè)屏蔽功能。本文以檢查是否含有“‘”,“#”為例,代碼如下:

      (4)進(jìn)行編碼輸出

      編碼輸出是對(duì)發(fā)給數(shù)據(jù)庫的數(shù)據(jù)進(jìn)行驗(yàn)證。雖有正則表達(dá)式、過濾函數(shù)等對(duì)輸入的數(shù)據(jù)進(jìn)行驗(yàn)證,但也不一定保證發(fā)給數(shù)據(jù)庫的數(shù)據(jù)是百分之百的安全。比如,在白名單里,類似O’Boyle這樣的名稱是有效的輸入。當(dāng)類似這樣的數(shù)據(jù)被成功存儲(chǔ)在數(shù)據(jù)庫中并被再使用時(shí),基于對(duì)包含在數(shù)據(jù)庫中的數(shù)據(jù)的內(nèi)在信任,數(shù)據(jù)并不會(huì)再被驗(yàn)證輸入,從而可能引發(fā)二階SQL注入。因此,要避免該情況的發(fā)生,有必要對(duì)發(fā)送給數(shù)據(jù)庫的內(nèi)容進(jìn)行編碼。在MySQL中,以單引號(hào)作為字符串的結(jié)束符,因而有必要對(duì)包含在字符串中的單引號(hào)進(jìn)行編碼,使輸入的單引號(hào)被當(dāng)作字符串中的一部分,而不是字符串結(jié)束符。例如,使用兩個(gè)單引號(hào)替換單個(gè)引號(hào),使用反斜線()替換單引號(hào),代碼如下所示:

      sql =replace(“’”,””);//使用反斜線引用單引號(hào)

      set @enc = replace(@input, char(39), char(92, 39));

      //存儲(chǔ)過程中使用字符編碼進(jìn)行替換,92是、39為反斜線和單引號(hào)的ASCII碼

      3.3.2平臺(tái)層防御

      在平臺(tái)層防御上注重的是運(yùn)行時(shí)的保護(hù),能與安全代碼互補(bǔ)形成一種多層的安全架構(gòu)[2],以減少可利用的SQL注入漏洞帶來的影響。本文基于MySQL數(shù)據(jù)庫環(huán)境,從最小化不必要信息的泄露方面提出以下方法:

      (1)數(shù)據(jù)權(quán)限控制

      數(shù)據(jù)權(quán)限是在用戶具有了某一功能權(quán)限的基礎(chǔ)上,規(guī)定用戶可以訪問的數(shù)據(jù)范圍[4]。MySQL服務(wù)器是通過權(quán)限表來控制用戶對(duì)數(shù)據(jù)庫的訪問,可以對(duì)用戶進(jìn)行權(quán)限設(shè)置,比如限制用戶訪問庫、表,限制用戶對(duì)表執(zhí)行的CRUD操作,限制用戶登錄的IP或域名,限制授權(quán)等。SQL注入攻擊的目的就是能夠獲取數(shù)據(jù)庫中的重要信息,當(dāng)重要的信息需要相應(yīng)權(quán)限才能訪問時(shí),沒有權(quán)限的攻擊者是無法竊取數(shù)據(jù)庫中的數(shù)據(jù),因此,數(shù)據(jù)權(quán)限控制,是針對(duì)SQL注入以及其他非法操作所提出的一種保護(hù)信息的安全措施。

      (2)敏感信息加密

      當(dāng)服務(wù)器遭受到SQL注入攻擊時(shí),若一些敏感信息,如密碼,以明文形式存在,在用戶信息表泄露之后,這些信息將被一覽無余。攻擊者則直接獲取這些合法用戶信息,并再借用這些信息的合法性假冒正常用戶,造成更嚴(yán)重的后果。因此,對(duì)敏感信息的加密,可以保證系統(tǒng)合法用戶的敏感數(shù)據(jù),有效降低該類數(shù)據(jù)泄露的危險(xiǎn)。MD5是常用的加密算法之一,借助MD5,加密用戶密碼,以密文形式存儲(chǔ)在數(shù)據(jù)庫中。以MySQL數(shù)據(jù)庫為例,添加新用戶,MD5加密密碼:insert into user (acnumber,name,password) values(8888,'hhh',md5('1478')),效果如圖7所示。

      圖7 MD5加密

      (3)關(guān)閉數(shù)據(jù)庫遠(yuǎn)程連接

      當(dāng)數(shù)據(jù)庫支持遠(yuǎn)程查詢本地?cái)?shù)據(jù)資源時(shí),攻擊者在通過之前注入驗(yàn)證,能夠直接遠(yuǎn)程控制所連網(wǎng)絡(luò)的數(shù)據(jù)庫。基于本文后臺(tái)系統(tǒng)環(huán)境,默認(rèn)情況下,普通用戶并不需要這種權(quán)限,為了數(shù)據(jù)庫安全考慮,移除遠(yuǎn)程連接權(quán)限,以確保本地必需的登錄權(quán)限和角色,從而避免攻擊者通過遠(yuǎn)程創(chuàng)建新的銜接。首先使用最高權(quán)限r(nóng)oot賬戶登錄數(shù)據(jù)庫,輸入use mysql選擇MySQL數(shù)據(jù)庫,接著輸入指令revoke all privileges on *.* from 'root'@'%'撤回,再通過指令delete from user where User="root" and Host="%"刪除用戶,最后通過指令flush privileges進(jìn)行刷新。在完成全部操作之后,可以通過select *from user確定存在的用戶。

      4 結(jié)語

      本文詳細(xì)解釋使用JSP和MySQL技術(shù)編寫的用戶登錄系統(tǒng),根據(jù)實(shí)例對(duì)常見登錄注入進(jìn)行解析SQL注入攻擊的原理以及產(chǎn)生的原因,并基于環(huán)境設(shè)置,提出有效的防范方法以及詳細(xì)的相關(guān)代碼,具有一定的實(shí)用性。但由于系統(tǒng)簡(jiǎn)易的局限性,無法從不同數(shù)據(jù)庫進(jìn)行全面考慮,因此在具體應(yīng)用時(shí),不能全盤生搬硬套,必須根據(jù)應(yīng)用環(huán)境舉一反三,提高代碼的規(guī)范性和安全性,保護(hù)數(shù)據(jù)庫安全,實(shí)現(xiàn)信息安全。

      [1]菜鳥教程.JSP教程[EB/OL].https://www.runoob.com/jsp/jsp-intro.html,2020-06.

      [2]Justin Clarke著,施宏斌譯.SQL注入攻擊與防御(第二版)[M].清華大學(xué)出版社, 2017.08.

      [3]余劉瑯,汪彩萍,程克勤.基于Snort的檢測(cè)SQL注入和跨站腳本攻擊的正則表達(dá)式的探討[J].合肥工業(yè)大學(xué)學(xué)報(bào),2017(08).

      [4]潘蕾.網(wǎng)站注冊(cè)及登錄安全性研究[J].咸寧學(xué)院學(xué)報(bào),2012(7).

      猜你喜歡
      字符串表單語句
      電子表單系統(tǒng)應(yīng)用分析
      華東科技(2021年9期)2021-09-23 02:15:24
      重點(diǎn):語句銜接
      淺談網(wǎng)頁制作中表單的教學(xué)
      精彩語句
      一種新的基于對(duì)稱性的字符串相似性處理算法
      如何搞定語句銜接題
      依據(jù)字符串匹配的中文分詞模型研究
      基于Infopath實(shí)現(xiàn)WEB動(dòng)態(tài)表單的研究
      電子世界(2012年24期)2012-12-17 10:49:06
      動(dòng)態(tài)表單技術(shù)在教學(xué)管理中的應(yīng)用*
      一種針對(duì)Java中字符串的內(nèi)存管理方案
      九龙城区| 柘城县| 图片| 绥江县| 马鞍山市| 漳浦县| 兴山县| 乌什县| 普兰店市| 洪泽县| 建德市| 荔浦县| 乌鲁木齐县| 晋江市| 金寨县| 建昌县| 平陆县| 南开区| 吴忠市| 凤冈县| 毕节市| 石阡县| 平顺县| 湘西| 长宁区| 乌鲁木齐市| 三河市| 林口县| 施秉县| 林西县| 会同县| 固始县| 嘉禾县| 安仁县| 旅游| 上思县| 长汀县| 杭锦后旗| 赣州市| 乳山市| 敖汉旗|