欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

簡單聊一聊SQL注入及防止SQL注入

 更新時間:2022年03月23日 10:53:50   作者:Minoz  
眾所周知SQL注入是比較常見的網(wǎng)絡(luò)攻擊方式之一,它不是利用操作系統(tǒng)的BUG來實現(xiàn)攻擊,而是針對程序員編程時的疏忽,通過SQL語句,實現(xiàn)無帳號登錄,下面這篇文章主要給大家介紹了關(guān)于SQL注入及防止SQL注入的相關(guān)資料,需要的朋友可以參考下

SQL注入

SQL注入是通過操作輸入來修改事先定義好的SQL語句,對用戶輸入的字符串進行過濾,轉(zhuǎn)義,限制或處理不嚴(yán)謹(jǐn),導(dǎo)致用戶可以通過輸入精心構(gòu)造的字符串去非法獲取到數(shù)據(jù)庫中的數(shù)據(jù),以達(dá)到執(zhí)行代碼對服務(wù)器進行攻擊的方法。

現(xiàn)有一個數(shù)據(jù)庫test中的表user,可以通過賬號name,密碼pass登錄,查看id

登錄代碼

package JDBCtest;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Scanner;

/*
 * 用戶登錄
 */
public class Demo4 {

    public static void main(String[] args) throws Exception {
        // 1.加載驅(qū)動
        Class.forName("com.mysql.jdbc.Driver");
        // 2.創(chuàng)建連接
        String url = "jdbc:mysql:///test";
        String username = "root";
        String password = "1234";
        Connection connection = DriverManager.getConnection(url, username, password);
        // 接收用戶名密碼
        Scanner sc = new Scanner(System.in);
        String name = sc.next();
        String pass = sc.next();// 3.sql語句
        String sql = "Select * from user where name='" + name + "' and pass ='" + pass + "'";
        // System.out.println(sql);
        // 4.獲取sql對象statement
        Statement statement = connection.createStatement();
        // 5.執(zhí)行sql語句
        ResultSet rs = statement.executeQuery(sql);
                // 6.登錄
        if (rs.next()) {
            System.out.println("登錄成功");
        } else {
            System.out.println("登錄失敗");
        }
        // 7.釋放資源
        statement.close();
        connection.close();
    }
}

通過表中賬號密碼登錄成功

由于賬號或密碼錯誤登錄失敗

以上可以正確登錄成功或失敗

注意!

如果此時我這樣輸入 【lihua 'or'1'='1】,也成功登錄了,但是數(shù)據(jù)庫沒根本沒有這條數(shù)據(jù)

這是為什么呢?讓我們從代碼里找問題!

        String sql = "Select * from user where name='" + name + "' and pass ='" + pass + "'";

為了調(diào)用數(shù)據(jù)庫,使用字符串拼接SQL語句

讓我們打印一下輸入 【lihua 'or'1'='1】的sql語句一探究竟

select語句中的where條件可以看做兩組并列(注意and在前先執(zhí)行,or后執(zhí)行)

由于'1'='1'為TRUE,所以以上語句等價于肯定會登錄成功!

同理輸入【'or'1'='1'# xxx】也能登陸成功

這是由于#在SQL中是注釋符號,以上語句等價于,于是就和上述情況一樣了。

附防止sql注入的一些建議

1. 代碼層防止sql注入攻擊的最佳方案就是sql預(yù)編譯

public List<Course> orderList(String studentId){
    String sql = "select id,course_id,student_id,status from course where student_id = ?";
    return jdbcTemplate.query(sql,new Object[]{studentId},new BeanPropertyRowMapper(Course.class));
}

這樣我們傳進來的參數(shù) 4 or 1 = 1就會被當(dāng)作是一個student_id,所以就不會出現(xiàn)sql注入了。

2. 確認(rèn)每種數(shù)據(jù)的類型,比如是數(shù)字,數(shù)據(jù)庫則必須使用int類型來存儲

3. 規(guī)定數(shù)據(jù)長度,能在一定程度上防止sql注入

4. 嚴(yán)格限制數(shù)據(jù)庫權(quán)限,能最大程度減少sql注入的危害

5. 避免直接響應(yīng)一些sql異常信息,sql發(fā)生異常后,自定義異常進行響應(yīng)

6. 過濾參數(shù)中含有的一些數(shù)據(jù)庫關(guān)鍵詞

@Component
public class SqlInjectionFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req=(HttpServletRequest)servletRequest;
        HttpServletRequest res=(HttpServletRequest)servletResponse;
        //獲得所有請求參數(shù)名
        Enumeration params = req.getParameterNames();
        String sql = "";
        while (params.hasMoreElements()) {
            // 得到參數(shù)名
            String name = params.nextElement().toString();
            // 得到參數(shù)對應(yīng)值
            String[] value = req.getParameterValues(name);
            for (int i = 0; i < value.length; i++) {
                sql = sql + value[i];
            }
        }
        if (sqlValidate(sql)) {
            throw new IOException("您發(fā)送請求中的參數(shù)中含有非法字符");
        } else {
            chain.doFilter(servletRequest,servletResponse);
        }
    }

    /**
     * 關(guān)鍵詞校驗
     * @param str
     * @return
     */
    protected static boolean sqlValidate(String str) {
        // 統(tǒng)一轉(zhuǎn)為小寫
        str = str.toLowerCase();
        // 過濾掉的sql關(guān)鍵字,可以手動添加
        String badStr = "'|and|exec|execute|insert|select|delete|update|count|drop|*|%|chr|mid|master|truncate|" +
                "char|declare|sitename|net user|xp_cmdshell|;|or|-|+|,|like'|and|exec|execute|insert|create|drop|" +
                "table|from|grant|use|group_concat|column_name|" +
                "information_schema.columns|table_schema|union|where|select|delete|update|order|by|count|*|" +
                "chr|mid|master|truncate|char|declare|or|;|-|--|+|,|like|//|/|%|#";
        String[] badStrs = badStr.split("\\|");
        for (int i = 0; i < badStrs.length; i++) {
            if (str.indexOf(badStrs[i]) >= 0) {
                return true;
            }
        }
        return false;
    }
}

總結(jié)

到此這篇關(guān)于SQL注入及防止SQL注入的文章就介紹到這了,更多相關(guān)防止SQL注入內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 數(shù)據(jù)庫正規(guī)化和設(shè)計技巧

    數(shù)據(jù)庫正規(guī)化和設(shè)計技巧

    數(shù)據(jù)庫正規(guī)化和設(shè)計技巧...
    2007-06-06
  • 分布式數(shù)據(jù)存儲系統(tǒng)的三要素

    分布式數(shù)據(jù)存儲系統(tǒng)的三要素

    大家好,本篇文章主要講的是分布式數(shù)據(jù)存儲系統(tǒng)的三要素,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • 使用Navicat生成ER關(guān)系圖并導(dǎo)出的方法

    使用Navicat生成ER關(guān)系圖并導(dǎo)出的方法

    這篇文章主要介紹了使用Navicat生成ER關(guān)系圖并導(dǎo)出的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • 深入理解數(shù)據(jù)庫之表的唯一、自增等七大約束

    深入理解數(shù)據(jù)庫之表的唯一、自增等七大約束

    真正約束字段的是數(shù)據(jù)類型,但是數(shù)據(jù)類型約束很單一,需要有一些額外的約束,更好的保證數(shù)據(jù)的合法性,從業(yè)務(wù)邏輯角度保證數(shù)據(jù)的正確性,本文就來介紹一下數(shù)據(jù)庫之表的唯一、自增等七大約束,感興趣的可以了解一下
    2023-09-09
  • 海量數(shù)據(jù)庫的查詢優(yōu)化及分頁算法方案集合2/2

    海量數(shù)據(jù)庫的查詢優(yōu)化及分頁算法方案集合2/2

    海量數(shù)據(jù)庫的查詢優(yōu)化及分頁算法方案集合2/2...
    2007-03-03
  • 圖文詳解HTTP頭中的SQL注入

    圖文詳解HTTP頭中的SQL注入

    HTTP頭字段是超文本傳輸協(xié)議(HTTP)中請求和響應(yīng)的部分信息,它們定義了HTTP傳輸?shù)牟僮鲄?shù),下面這篇文章主要給大家介紹了關(guān)于HTTP頭中SQL注入的相關(guān)資料,需要的朋友可以參考下
    2021-12-12
  • 大數(shù)據(jù)時代的數(shù)據(jù)庫選擇:SQL還是NoSQL?

    大數(shù)據(jù)時代的數(shù)據(jù)庫選擇:SQL還是NoSQL?

    執(zhí)行大數(shù)據(jù)項目的企業(yè)面對的關(guān)鍵決策之一是使用哪個數(shù)據(jù)庫,SQL還是NoSQL?SQL有著驕人的業(yè)績,龐大的安裝基礎(chǔ);而NoSQL正在獲得可觀的收益,且有很多支持者。我們來看看兩位專家對這個問題的看法
    2014-03-03
  • SQL中case?when?then?else?end用法實例

    SQL中case?when?then?else?end用法實例

    CASE WHEN THEN ELSE END是一個固定搭配,這樣排列是想把通過格式把邏輯展示出來,CASE告訴計算機接下來是條件句式了,下面這篇文章主要給大家介紹了關(guān)于SQL中case?when?then?else?end用法的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • 實例介紹SQL注入以及如何解決

    實例介紹SQL注入以及如何解決

    這篇文章主要給大家介紹了關(guān)于SQL注入以及如何解決的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Navicat Premium15安裝及破解教程詳解親測有效(附破解失敗解決方案)

    Navicat Premium15安裝及破解教程詳解親測有效(附破解失敗解決方案)

    這篇文章主要介紹了Navicat Premium15安裝及破解教程詳解親測有效,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11

最新評論