Java-JDBC開發(fā)-SQL注入攻擊和解決方案

一其弊、注入攻擊

在用戶登錄的時(shí)候癞己,我們往往需要輸入賬號(hào)和密碼,通過(guò)賬號(hào)和密碼和數(shù)據(jù)庫(kù)中保存的賬號(hào)密碼進(jìn)行匹配梭伐,匹配成功則登錄成功痹雅,但是在匹配的時(shí)候會(huì)存在注入攻擊的安全隱患,在輸入賬號(hào)和密碼的時(shí)候糊识,在末尾加上?"or" 再接上任何為真的語(yǔ)句绩社,這樣一來(lái),有真就為真赂苗,這樣也能登錄成功愉耙。

現(xiàn)有 mylogon 數(shù)據(jù)庫(kù),里面有 users 數(shù)據(jù)表拌滋,存儲(chǔ)了賬號(hào)和密碼朴沿,使用Java通過(guò)JDBC操作數(shù)據(jù)庫(kù)來(lái)模擬一下注入攻擊:

public static void main(String[] args) throws ClassNotFoundException, SQLException {

? ? //1.注冊(cè)驅(qū)動(dòng) 反射技術(shù),將驅(qū)動(dòng)類加入到內(nèi)容

? ? Class.forName("com.mysql.jdbc.Driver");

? ? //2.獲得數(shù)據(jù)庫(kù)連接? DriverManager類中靜態(tài)方法

? ? //static Connection getConnection(String url, String user, String password)

? ? //返回值是Connection接口的實(shí)現(xiàn)類,在mysql驅(qū)動(dòng)程序

? ? //url: 數(shù)據(jù)庫(kù)地址? jdbc:mysql://連接主機(jī)IP:端口號(hào)//數(shù)據(jù)庫(kù)名字

? ? String url =? "jdbc:mysql://localhost:3306/mylogon";

? ? String username = "root";

? ? String password = "123456";

? ? Connection con = DriverManager.getConnection(url,username,password);

? ? //3.獲得語(yǔ)句執(zhí)行平臺(tái)

? ? //Statement createStatement() 獲取Statement對(duì)象,將SQL語(yǔ)句發(fā)送到數(shù)據(jù)庫(kù)

? ? Statement stat = con.createStatement();

? ? //4.從控制臺(tái)輸入用戶名和密碼

? ? Scanner sc = new Scanner(System.in);

? ? String user = sc.nextLine();

? ? String key = sc.nextLine();

? ? //String sql1 = "select * from users where username='qwer' and password='1234535' or 1=1";

? ? String sql2 = "select * from users where username='"+ user +"'and password='"+ key +"'";

? ? System.out.println(sql2);

? ? ResultSet res = stat.executeQuery(sql2);

? ? while (res.next())

? ? {

? ? ? ? System.out.println(res.getString("username") + "? ? " + res.getString("password"));

? ? }

? ? con.close();

? ? res.close();

? ? stat.close();

}

當(dāng)從控制臺(tái)輸入正確的賬號(hào)和密碼時(shí),可以登錄成功败砂,但當(dāng)輸入任意賬號(hào)和密碼后赌渣,在密碼后面加上 'or' 1=1,也能夠登錄成功昌犹,這樣就存在安全隱患

二坚芜、注入攻擊解決方案

可以使用 PrearedStatement 來(lái)解決注入攻擊的問(wèn)題,在Statement 接口的子接口中斜姥,有一個(gè) PrearedStatement 接口货岭,可以使 SQL 預(yù)編譯存儲(chǔ),多次高效地執(zhí)行 SQL疾渴,并能防止注入攻擊千贯。使用PreparedStatement pst = ?con.prepareStatement(sql):調(diào)用Connection接口的方法prepareStatement,獲取PrepareStatement接口的實(shí)現(xiàn)類

執(zhí)行SQL語(yǔ)句,數(shù)據(jù)表,查詢用戶名和密碼,如果存在,登錄成功,不存在登錄失敗

調(diào)用Connection接口的方法prepareStatement,獲取PrepareStatement接口的實(shí)現(xiàn)類

調(diào)用PreparedStatement對(duì)象set方法,設(shè)置問(wèn)號(hào)占位符上的參數(shù)

調(diào)用方法,執(zhí)行SQL,獲取結(jié)果集

public static void main(String[] args) throws SQLException, ClassNotFoundException {

? ? //1.注冊(cè)驅(qū)動(dòng) 反射技術(shù),將驅(qū)動(dòng)類加入到內(nèi)容

? ? Class.forName("com.mysql.jdbc.Driver");

? ? //2.獲得數(shù)據(jù)庫(kù)連接? DriverManager類中靜態(tài)方法

? ? //static Connection getConnection(String url, String user, String password)

? ? //返回值是Connection接口的實(shí)現(xiàn)類,在mysql驅(qū)動(dòng)程序

? ? //url: 數(shù)據(jù)庫(kù)地址? jdbc:mysql://連接主機(jī)IP:端口號(hào)//數(shù)據(jù)庫(kù)名字

? ? String url =? "jdbc:mysql://localhost:3306/mylogon";

? ? String username = "root";

? ? String password = "123456";

? ? Connection con = DriverManager.getConnection(url,username,password);

? ? //3.從控制臺(tái)輸入用戶名和密碼

? ? Scanner sc = new Scanner(System.in);

? ? String user = sc.nextLine();

? ? String key = sc.nextLine();

? ? //執(zhí)行SQL語(yǔ)句,數(shù)據(jù)表,查詢用戶名和密碼,如果存在,登錄成功,不存在登錄失敗

? ? String sql2 = "SELECT * FROM users WHERE username= ? AND PASSWORD= ?";


? ? //4、調(diào)用Connection接口的方法prepareStatement,獲取PrepareStatement接口的實(shí)現(xiàn)類

? ? //方法中參數(shù),SQL語(yǔ)句中的參數(shù)全部采用問(wèn)號(hào)占位符

? ? PreparedStatement pre = con.prepareStatement(sql2);

? ? System.out.println(sql2);


? ? //5.調(diào)用pst對(duì)象set方法,設(shè)置問(wèn)號(hào)占位符上的參數(shù)

? ? pre.setObject(1,user);

? ? pre.setObject(2,key);

? ? //6.調(diào)用方法,執(zhí)行SQL,獲取結(jié)果集

? ? ResultSet res = pre.executeQuery();

? ? while (res.next())

? ? {

? ? ? ? System.out.println(res.getString("username") + "? ? " + res.getString("password"));

? ? }

? ? con.close();

? ? res.close();

? ? pre.close();

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末搞坝,一起剝皮案震驚了整個(gè)濱河市搔谴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌桩撮,老刑警劉巖敦第,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件峰弹,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡芜果,警方通過(guò)查閱死者的電腦和手機(jī)鞠呈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)右钾,“玉大人蚁吝,你說(shuō)我怎么就攤上這事∫ㄉ洌” “怎么了窘茁?”我有些...
    開封第一講書人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)脆烟。 經(jīng)常有香客問(wèn)我山林,道長(zhǎng),這世上最難降的妖魔是什么邢羔? 我笑而不...
    開封第一講書人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任驼抹,我火速辦了婚禮,結(jié)果婚禮上拜鹤,老公的妹妹穿的比我還像新娘框冀。我一直安慰自己,他們只是感情好署惯,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開白布左驾。 她就那樣靜靜地躺著镣隶,像睡著了一般极谊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上安岂,一...
    開封第一講書人閱讀 49,929評(píng)論 1 290
  • 那天轻猖,我揣著相機(jī)與錄音,去河邊找鬼域那。 笑死咙边,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的次员。 我是一名探鬼主播败许,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼淑蔚!你這毒婦竟也來(lái)了市殷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤刹衫,失蹤者是張志新(化名)和其女友劉穎醋寝,沒想到半個(gè)月后搞挣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡音羞,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年囱桨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嗅绰。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡舍肠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出办陷,到底是詐尸還是另有隱情貌夕,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布民镜,位于F島的核電站啡专,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏制圈。R本人自食惡果不足惜们童,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鲸鹦。 院中可真熱鬧慧库,春花似錦、人聲如沸馋嗜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)葛菇。三九已至甘磨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間眯停,已是汗流浹背济舆。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留莺债,地道東北人滋觉。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像齐邦,于是被迫代替她去往敵國(guó)和親椎侠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容