溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

遇見SQL注入應(yīng)該如何解決

發(fā)布時間:2021-01-12 10:27:21 來源:億速云 閱讀:215 作者:栢白 欄目:數(shù)據(jù)庫

這篇文章主要介紹了遇見SQL注入應(yīng)該如何解決,具有一定借鑒價值,需要的朋友可以參考下。下面就和我一起來看看吧。

SQL注入是什么?

看一下百度百科的定義:
遇見SQL注入應(yīng)該如何解決
啊,好長一大段文字,些許不想看,下面通過一個例子,來說明一下什么是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');

表如下圖所示:
遇見SQL注入應(yīng)該如何解決
再隨隨便便用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;
    }}

測試一下:
遇見SQL注入應(yīng)該如何解決
可以看到,普通的檢驗沒有任何問題,現(xiàn)在使用SQL注入

賬戶名稱隨便輸入,密碼輸入:a' or 'a'='a
遇見SQL注入應(yīng)該如何解決
驚訝的發(fā)現(xiàn),居然登陸成功了。輸出一下sql看一下:

select * from user where username = 'askjdhjksahd' and password = 'a' or 'a' = 'a'

可以看到where之后的條件,無論是什么結(jié)果都為真,都會輸出整個表:
遇見SQL注入應(yīng)該如何解決
所以,綜上所述:在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)該如何解決
成功解決!

以上就是遇見SQL注入應(yīng)該如何解決的詳細內(nèi)容了,看完之后是否有所收獲呢?如果想了解更多相關(guān)內(nèi)容,歡迎來億速云行業(yè)資訊!

向AI問一下細節(jié)

免責聲明:本站發(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)容。

AI