您好,登錄后才能下訂單哦!
這篇文章主要介紹了遇見SQL注入應(yīng)該如何解決,具有一定借鑒價值,需要的朋友可以參考下。下面就和我一起來看看吧。
SQL
注入是什么?
看一下百度百科的定義:
啊,好長一大段文字,些許不想看,下面通過一個例子,來說明一下什么是SQL注入
:
新建一個數(shù)據(jù)庫,再建一個表,添加兩行數(shù)據(jù):
use db1;create table user( id int primary key auto_increment, username varchar(32), password varchar(32));insert into user values(null,'zhangsan','123');insert into user values(null,'lisi','234');
表如下圖所示:
再隨隨便便用JDBC
寫個登陸操作:
package com.wzq.jdbc;import com.wzq.util.JDBCUtils;import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.Scanner;/* * 需求: * 1、通過鍵盤錄入用戶名和密碼 * 2、判斷用戶是否登陸成功 * */public class JDBCDemo05 { public static void main(String[] args) { Scanner cin = new Scanner(System.in); System.out.println("請輸入用戶名:"); String username = cin.nextLine(); System.out.println("請輸入密碼:"); String password = cin.nextLine(); boolean res = new JDBCDemo05().login(username, password); if (res) System.out.println("登陸成功!"); else System.out.println("登陸失敗!"); } public boolean login(String username, String password) { if (username == null || password == null) { return false; } Connection conn = null; Statement stmt = null; ResultSet rs = null; try { //1、獲取數(shù)據(jù)庫連接 conn = JDBCUtils.getConnection(); //JDBCUtils工具類 //2、定義sql String sql = "select * from user where username = '" + username + "' and password = '" + password + "'"; //3、獲取執(zhí)行sql的對象 stmt = conn.createStatement(); //4、執(zhí)行sql rs = stmt.executeQuery(sql); return rs.next(); } catch (SQLException e) { e.printStackTrace(); } finally { JDBCUtils.close(rs, stmt, conn); } return false; }}
測試一下:
可以看到,普通的檢驗沒有任何問題,現(xiàn)在使用SQL注入
:
賬戶名稱隨便輸入,密碼輸入:a' or 'a'='a
驚訝的發(fā)現(xiàn),居然登陸成功了。輸出一下sql
看一下:
select * from user where username = 'askjdhjksahd' and password = 'a' or 'a' = 'a'
可以看到where
之后的條件,無論是什么結(jié)果都為真,都會輸出整個表:
所以,綜上所述:在sql
拼接時,有一些sql
的特殊關(guān)鍵字參與字符串的拼接,就會造成安全性問題,這就是上面為什么能登陸成功的原因所在。
那怎么解決這個問題呢?
答:利用PreparedStatement
對象,不使用Statement
對象。
PreparedStatement
對象是Statement
對象的子類,它是預(yù)編譯的sql
,所以運行速度會比Statemnet
更快。
PerpaerdStatement
使用?
作為占位符,使用setXxx(索引,值)
給?
賦值
所以我們替換一下Statement
,寫一下代碼:
public boolean login(String username, String password) { if (username == null || password == null) { return false; } Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { //1、獲取數(shù)據(jù)庫連接 conn = JDBCUtils.getConnection(); //JDBCUtils類 //2、定義sql String sql = "select * from user where username = ? and password = ?"; //3、獲取執(zhí)行sql的對象 pstmt = conn.prepareStatement(sql); pstmt.setString(1,username); pstmt.setString(2,password); //4、執(zhí)行sql rs = pstmt.executeQuery(); return rs.next(); } catch (SQLException e) { e.printStackTrace(); } finally { JDBCUtils.close(rs, pstmt, conn); } return false; }
測試一下:
成功解決!
以上就是遇見SQL注入應(yīng)該如何解決的詳細內(nèi)容了,看完之后是否有所收獲呢?如果想了解更多相關(guān)內(nèi)容,歡迎來億速云行業(yè)資訊!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。