最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java項(xiàng)目防止SQL注入的幾種方法總結(jié)

 更新時(shí)間:2023年04月14日 10:46:49   作者:睡竹  
SQL注入是比較常見(jiàn)的網(wǎng)絡(luò)攻擊方式之一,在客戶端在向服務(wù)器發(fā)送請(qǐng)求的時(shí)候,sql命令通過(guò)表單提交或者url字符串拼接傳遞到后臺(tái)持久層,最終達(dá)到欺騙服務(wù)器執(zhí)行惡意的SQL命令,下面這篇文章主要給大家總結(jié)介紹了關(guān)于Java項(xiàng)目防止SQL注入的幾種方法,需要的朋友可以參考下

一、什么是SQL注入?

SQL注入即是指web應(yīng)用程序?qū)τ脩糨斎霐?shù)據(jù)的合法性沒(méi)有判斷或過(guò)濾不嚴(yán),攻擊者可以在web應(yīng)用程序中事先定義好的查詢語(yǔ)句的結(jié)尾上添加額外的SQL語(yǔ)句,在管理員不知情的情況下實(shí)現(xiàn)非法操作,以此來(lái)實(shí)現(xiàn)欺騙數(shù)據(jù)庫(kù)服務(wù)器執(zhí)行非授權(quán)的任意查詢,從而進(jìn)一步得到相應(yīng)的數(shù)據(jù)信息。

SQL案列

String sql = "delete from table1 where id = " + "id";

這個(gè)id從請(qǐng)求參數(shù)中獲取,若參數(shù)被拼接為:

1001 or  1 = 1

最執(zhí)行語(yǔ)句變?yōu)椋?/p>

String sql = "delete from table1 where id = 1001 or 1 = 1";

此時(shí),數(shù)據(jù)庫(kù)的數(shù)據(jù)都會(huì)被清空掉,后果非常嚴(yán)重

二、Java項(xiàng)目防止SQL注入方式

這里總結(jié)4種:

  • PreparedStatement防止SQL注入
  • mybatis中#{}防止SQL注入
  • 對(duì)請(qǐng)求參數(shù)的敏感詞匯進(jìn)行過(guò)濾
  • nginx反向代理防止SQL注入

1、PreparedStatement防止SQL注入

PreparedStatement具有預(yù)編譯功能,以上述SQL為例

使用PreparedStatement預(yù)編譯后的SQL為:

delete from table1 where id= ?

此時(shí)SQL語(yǔ)句結(jié)構(gòu)已固定,無(wú)論"?"被替換為任何參數(shù),SQL語(yǔ)句只認(rèn)為where后面只有一個(gè)條件,當(dāng)再傳入 1001 or  1 = 1時(shí),語(yǔ)句會(huì)報(bào)錯(cuò),從而達(dá)到防止SQL注入效果

2、mybatis中#{}防止SQL注入

mybatis中#{}表達(dá)式防止SQL注入與PreparedStatement類似,都是對(duì)SQL語(yǔ)句進(jìn)行預(yù)編譯處理

注意:

#{} :參數(shù)占位符

${} :拼接替換符,不能防止SQL注入,一般用于

  •  傳入數(shù)據(jù)庫(kù)對(duì)象(如:數(shù)據(jù)庫(kù)名稱、表名)
  •  order by  后的條件

3、對(duì)請(qǐng)求參數(shù)的敏感詞匯進(jìn)行過(guò)濾

這里是springboot的寫(xiě)法,如下:

import org.springframework.context.annotation.Configuration;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
import java.util.Enumeration;
 
/**
 * @Auther: 睡竹
 * @Date: 2023/03/07
 * @Description: sql防注入過(guò)濾器
 */
@WebFilter(urlPatterns = "/*",filterName = "sqlFilter")
@Configuration
public class SqlFilter implements Filter {
 
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {}
 
    /**
     * @description sql注入過(guò)濾
     */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        ServletRequest request = servletRequest;
        ServletResponse response = servletResponse;
        // 獲得所有請(qǐng)求參數(shù)名
        Enumeration<String> names = request.getParameterNames();
        String sql = "";
        while (names.hasMoreElements()){
            // 得到參數(shù)名
            String name = names.nextElement().toString();
            // 得到參數(shù)對(duì)應(yīng)值
            String[] values = request.getParameterValues(name);
            for (int i = 0; i < values.length; i++) {
                sql += values[i];
            }
        }
        if (sqlValidate(sql)) {
            //TODO 這里直接拋異常處理,前后端交互項(xiàng)目中,請(qǐng)把錯(cuò)誤信息按前后端"數(shù)據(jù)返回的VO"對(duì)象進(jìn)行封裝
            throw new IOException("您發(fā)送請(qǐng)求中的參數(shù)中含有非法字符");
        } else {
            filterChain.doFilter(request,response);
        }
    }
 
    /**
     * @description 匹配效驗(yàn)
     */
    protected static boolean sqlValidate(String str){
        // 統(tǒng)一轉(zhuǎn)為小寫(xiě)
        String s = str.toLowerCase();
        // 過(guò)濾掉的sql關(guān)鍵字,特殊字符前面需要加\\進(jìn)行轉(zhuǎn)義
        String badStr =
                "select|update|and|or|delete|insert|truncate|char|into|substr|ascii|declare|exec|count|master|into|drop|execute|table|"+
                        "char|declare|sitename|xp_cmdshell|like|from|grant|use|group_concat|column_name|" +
                        "information_schema.columns|table_schema|union|where|order|by|" +
                        "'\\*|\\;|\\-|\\--|\\+|\\,|\\//|\\/|\\%|\\#";
        //使用正則表達(dá)式進(jìn)行匹配
        boolean matches = s.matches(badStr);
        return matches;
    }
 
    @Override
    public void destroy() {}
}

4、nginx反向代理防止SQL注入

越來(lái)越多網(wǎng)站使用nginx進(jìn)行反向代理,該層我們也可以進(jìn)行防止SQL注入配置。

將下面的Nginx配置文件代碼放入到server塊中,然后重啟Nginx即可

 if ($request_method !~* GET|POST) { return 444; }
 #使用444錯(cuò)誤代碼可以更加減輕服務(wù)器負(fù)載壓力。
 #防止SQL注入
 if ($query_string ~* (\$|'|--|[+|(%20)]union[+|(%20)]|[+|(%20)]insert[+|(%20)]|[+|(%20)]drop[+|(%20)]|[+|(%20)]truncate[+|(%20)]|[+|(%20)]update[+|(%20)]|[+|(%20)]from[+|(%20)]|[+|(%20)]grant[+|(%20)]|[+|(%20)]exec[+|(%20)]|[+|(%20)]where[+|(%20)]|[+|(%20)]select[+|(%20)]|[+|(%20)]and[+|(%20)]|[+|(%20)]or[+|(%20)]|[+|(%20)]count[+|(%20)]|[+|(%20)]exec[+|(%20)]|[+|(%20)]chr[+|(%20)]|[+|(%20)]mid[+|(%20)]|[+|(%20)]like[+|(%20)]|[+|(%20)]iframe[+|(%20)]|[\<|%3c]script[\>|%3e]|javascript|alert|webscan|dbappsecurity|style|confirm\(|innerhtml|innertext)(.*)$) { return 555; }
 if ($uri ~* (/~).*) { return 501; }
 if ($uri ~* (\\x.)) { return 501; }
 #防止SQL注入 
 if ($query_string ~* "[;'<>].*") { return 509; }
 if ($request_uri ~ " ") { return 509; }
 if ($request_uri ~ (\/\.+)) { return 509; }
 if ($request_uri ~ (\.+\/)) { return 509; }
 #if ($uri ~* (insert|select|delete|update|count|master|truncate|declare|exec|\*|\')(.*)$ ) { return 503; }
 #防止SQL注入
 if ($request_uri ~* "(cost\()|(concat\()") { return 504; }
 if ($request_uri ~* "[+|(%20)]union[+|(%20)]") { return 504; }
 if ($request_uri ~* "[+|(%20)]and[+|(%20)]") { return 504; }
 if ($request_uri ~* "[+|(%20)]select[+|(%20)]") { return 504; }
 if ($request_uri ~* "[+|(%20)]or[+|(%20)]") { return 504; }
 if ($request_uri ~* "[+|(%20)]delete[+|(%20)]") { return 504; }
 if ($request_uri ~* "[+|(%20)]update[+|(%20)]") { return 504; }
 if ($request_uri ~* "[+|(%20)]insert[+|(%20)]") { return 504; }
 if ($query_string ~ "(<|%3C).*script.*(>|%3E)") { return 505; }
 if ($query_string ~ "GLOBALS(=|\[|\%[0-9A-Z]{0,2})") { return 505; }
 if ($query_string ~ "_REQUEST(=|\[|\%[0-9A-Z]{0,2})") { return 505; }
 if ($query_string ~ "proc/self/environ") { return 505; }
 if ($query_string ~ "mosConfig_[a-zA-Z_]{1,21}(=|\%3D)") { return 505; }
 if ($query_string ~ "base64_(en|de)code\(.*\)") { return 505; }
 if ($query_string ~ "[a-zA-Z0-9_]=http://") { return 506; }
 if ($query_string ~ "[a-zA-Z0-9_]=(\.\.//?)+") { return 506; }
 if ($query_string ~ "[a-zA-Z0-9_]=/([a-z0-9_.]//?)+") { return 506; }
 if ($query_string ~ "b(ultram|unicauca|valium|viagra|vicodin|xanax|ypxaieo)b") { return 507; }
 if ($query_string ~ "b(erections|hoodia|huronriveracres|impotence|levitra|libido)b") {return 507; }
 if ($query_string ~ "b(ambien|bluespill|cialis|cocaine|ejaculation|erectile)b") { return 507; }
 if ($query_string ~ "b(lipitor|phentermin|pro[sz]ac|sandyauer|tramadol|troyhamby)b") { return 507; }
 #這里大家根據(jù)自己情況添加刪減上述判斷參數(shù),cURL、wget這類的屏蔽有點(diǎn)兒極端了,但要“寧可錯(cuò)殺一千,不可放過(guò)一個(gè)”。
 if ($http_user_agent ~* YisouSpider|ApacheBench|WebBench|Jmeter|JoeDog|Havij|GetRight|TurnitinBot|GrabNet|masscan|mail2000|github|wget|curl|Java|python) { return 508; }
 #同上,大家根據(jù)自己站點(diǎn)實(shí)際情況來(lái)添加刪減下面的屏蔽攔截參數(shù)。
 if ($http_user_agent ~* "Go-Ahead-Got-It") { return 508; }
 if ($http_user_agent ~* "GetWeb!") { return 508; }
 if ($http_user_agent ~* "Go!Zilla") { return 508; }
 if ($http_user_agent ~* "Download Demon") { return 508; }
 if ($http_user_agent ~* "Indy Library") { return 508; }
 if ($http_user_agent ~* "libwww-perl") { return 508; }
 if ($http_user_agent ~* "Nmap Scripting Engine") { return 508; }
 if ($http_user_agent ~* "~17ce.com") { return 508; }
 if ($http_user_agent ~* "WebBench*") { return 508; }
 if ($http_user_agent ~* "spider") { return 508; } #這個(gè)會(huì)影響國(guó)內(nèi)某些搜索引擎爬蟲(chóng),比如:搜狗
 #攔截各惡意請(qǐng)求的UA,可以通過(guò)分析站點(diǎn)日志文件或者waf日志作為參考配置。
 if ($http_referer ~* 17ce.com) { return 509; }
 #攔截17ce.com站點(diǎn)測(cè)速節(jié)點(diǎn)的請(qǐng)求,所以明月一直都說(shuō)這些測(cè)速網(wǎng)站的數(shù)據(jù)僅供參考不能當(dāng)真的。
 if ($http_referer ~* WebBench*") { return 509; }
 #攔截WebBench或者類似壓力測(cè)試工具,其他工具只需要更換名稱即可。

總結(jié)

到此這篇關(guān)于Java項(xiàng)目防止SQL注入的幾種方法總結(jié)的文章就介紹到這了,更多相關(guān)Java防止SQL注入內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java開(kāi)發(fā)druid數(shù)據(jù)連接池maven方式簡(jiǎn)易配置流程示例

    Java開(kāi)發(fā)druid數(shù)據(jù)連接池maven方式簡(jiǎn)易配置流程示例

    本篇文章主要為大家介紹了java開(kāi)發(fā)中druid數(shù)據(jù)連接池maven方式的簡(jiǎn)易配置流程示例,文中附含詳細(xì)的代碼示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-10-10
  • LongAdder原理及創(chuàng)建使用示例詳解

    LongAdder原理及創(chuàng)建使用示例詳解

    這篇文章主要為大家介紹了LongAdder原理及創(chuàng)建使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • Guava Cache的使用簡(jiǎn)介

    Guava Cache的使用簡(jiǎn)介

    這篇文章主要介紹了Guava Cache的使用簡(jiǎn)介,幫助大家更好的理解和學(xué)習(xí)使用Guava Cache,感興趣的朋友可以了解下
    2021-03-03
  • Java 中 synchronized 的使用方式和鎖升級(jí)

    Java 中 synchronized 的使用方式和鎖升級(jí)

    Java中的synchronized關(guān)鍵字用于實(shí)現(xiàn)線程同步,保證同一時(shí)刻只有一個(gè)線程可以訪問(wèn)被同步的代碼塊或方法,JVM引入了鎖升級(jí)機(jī)制,從無(wú)鎖狀態(tài)開(kāi)始,根據(jù)競(jìng)爭(zhēng)情況逐步升級(jí)為偏向鎖、輕量級(jí)鎖和重量級(jí)鎖,以提高性能,感興趣的朋友一起看看吧
    2025-03-03
  • 關(guān)于Object中equals方法和hashCode方法判斷的分析

    關(guān)于Object中equals方法和hashCode方法判斷的分析

    今天小編就為大家分享一篇關(guān)于關(guān)于Object中equals方法和hashCode方法判斷的分析,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01
  • JAVAEE Filter 過(guò)濾器設(shè)置是否緩存實(shí)例詳解

    JAVAEE Filter 過(guò)濾器設(shè)置是否緩存實(shí)例詳解

    網(wǎng)頁(yè)中,每次的客戶端訪問(wèn)服務(wù)器,有部分不用重復(fù)請(qǐng)求的,這樣可以減輕服務(wù)器的工作量。那么如何設(shè)置客戶端是否都緩存呢?接下來(lái)通過(guò)本文給大家介紹JAVAEE Filter 過(guò)濾器設(shè)置是否緩存的實(shí)例,感興趣的朋友一起學(xué)習(xí)吧
    2016-05-05
  • 聊聊MultipartFile與File的一些事兒

    聊聊MultipartFile與File的一些事兒

    這篇文章主要介紹了MultipartFile與File的一些事兒,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 關(guān)于@RequestParam的主要用法詳解

    關(guān)于@RequestParam的主要用法詳解

    這篇文章主要介紹了關(guān)于@RequestParam的主要用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • Maven將代碼及依賴打成一個(gè)Jar包的方式詳解(最新推薦)

    Maven將代碼及依賴打成一個(gè)Jar包的方式詳解(最新推薦)

    這篇文章主要介紹了Maven將代碼及依賴打成一個(gè)Jar包的方式,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-05-05
  • Spring的IOC原理詳情

    Spring的IOC原理詳情

    這篇文章主要介紹了Spring的IOC原理詳情,IOC是Inversion?of?Control的縮寫(xiě),多數(shù)書(shū)籍翻譯成“控制反轉(zhuǎn)”,還有些書(shū)籍翻譯成為控制反向或者控制倒置
    2022-07-07

最新評(píng)論

商都县| 桐柏县| 石景山区| 三河市| 汉寿县| 灌云县| 神木县| 潞城市| 舒兰市| 大埔区| 宁陕县| 漯河市| 巴彦淖尔市| 乃东县| 竹山县| 宣武区| 连州市| 鄂尔多斯市| 通城县| 高平市| 屏山县| 杭州市| 黄陵县| 长汀县| 沙坪坝区| 鹤壁市| 正安县| 平湖市| 南华县| 诸城市| 中超| 缙云县| 崇信县| 边坝县| 乌鲁木齐县| 平顺县| 岱山县| 枣庄市| 合水县| 友谊县| 固镇县|