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

Java項目防止SQL注入的幾種方式

 更新時間:2023年12月26日 09:31:01   作者:皮卡丘faker  
SQL注入是一種常見的攻擊方式,黑客試圖通過操縱應用程序的輸入來執(zhí)行惡意SQL查詢,從而繞過認證和授權,竊取、篡改或破壞數(shù)據(jù)庫中的數(shù)據(jù),本文主要介紹了Java項目防止SQL注入的幾種方式,感興趣的可以了解一下

PreparedStatement防止SQL注入

PreparedStatement具有預編譯功能,以上述SQL為例

使用PreparedStatement預編譯后的SQL為:

delete from table1 where id= ?

此時SQL語句結構已固定,無論"?"被替換為任何參數(shù),SQL語句只認為where后面只有一個條件,當再傳入 1001 or  1 = 1時,語句會報錯,從而達到防止SQL注入效果

mybatis中#{}防止SQL注入

mybatis中#{}表達式防止SQL注入與PreparedStatement類似,都是對SQL語句進行預編譯處理

注意

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

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

  • 傳入數(shù)據(jù)庫對象(如:數(shù)據(jù)庫名稱、表名)

  • order by  后的條件

對請求參數(shù)的敏感詞匯進行過濾 

這里是springboot的寫法,如下:

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/12/25
 * @Description: sql防注入過濾器
 */
@WebFilter(urlPatterns = "/*",filterName = "sqlFilter")
@Configuration
public class SqlFilter implements Filter {
 
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {}
 
    /**
     * @description sql注入過濾
     */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        ServletRequest request = servletRequest;
        ServletResponse response = servletResponse;
        // 獲得所有請求參數(shù)名
        Enumeration<String> names = request.getParameterNames();
        String sql = "";
        while (names.hasMoreElements()){
            // 得到參數(shù)名
            String name = names.nextElement().toString();
            // 得到參數(shù)對應值
            String[] values = request.getParameterValues(name);
            for (int i = 0; i < values.length; i++) {
                sql += values[i];
            }
        }
        if (sqlValidate(sql)) {
            //TODO 這里直接拋異常處理,前后端交互項目中,請把錯誤信息按前后端"數(shù)據(jù)返回的VO"對象進行封裝
            throw new IOException("您發(fā)送請求中的參數(shù)中含有非法字符");
        } else {
            filterChain.doFilter(request,response);
        }
    }
 
    /**
     * @description 匹配效驗
     */
    protected static boolean sqlValidate(String str){
        // 統(tǒng)一轉為小寫
        String s = str.toLowerCase();
        // 過濾掉的sql關鍵字,特殊字符前面需要加\\進行轉義
        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|" +
                        "'\\*|\\;|\\-|\\--|\\+|\\,|\\//|\\/|\\%|\\#";
        //使用正則表達式進行匹配
        boolean matches = s.matches(badStr);
        return matches;
    }
 
    @Override
    public void destroy() {}
}

nginx反向代理防止SQL注入

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

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

 if ($request_method !~* GET|POST) { return 444; }
 #使用444錯誤代碼可以更加減輕服務器負載壓力。
 #防止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這類的屏蔽有點兒極端了,但要“寧可錯殺一千,不可放過一個”。
 if ($http_user_agent ~* YisouSpider|ApacheBench|WebBench|Jmeter|JoeDog|Havij|GetRight|TurnitinBot|GrabNet|masscan|mail2000|github|wget|curl|Java|python) { return 508; }
 #同上,大家根據(jù)自己站點實際情況來添加刪減下面的屏蔽攔截參數(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; } #這個會影響國內(nèi)某些搜索引擎爬蟲,比如:搜狗
 #攔截各惡意請求的UA,可以通過分析站點日志文件或者waf日志作為參考配置。
 if ($http_referer ~* 17ce.com) { return 509; }
 #攔截17ce.com站點測速節(jié)點的請求,所以明月一直都說這些測速網(wǎng)站的數(shù)據(jù)僅供參考不能當真的。
 if ($http_referer ~* WebBench*") { return 509; }
 #攔截WebBench或者類似壓力測試工具,其他工具只需要更換名稱即可。

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

相關文章

  • IDEA安裝部署Alibaba Cloud Toolkit的實現(xiàn)步驟

    IDEA安裝部署Alibaba Cloud Toolkit的實現(xiàn)步驟

    Alibaba Cloud Toolkit是阿里云針對IDE平臺為開發(fā)者提供的一款插件,本文主要介紹了IDEA安裝部署Alibaba Cloud Toolkit的實現(xiàn)步驟,具有一定的參考價值,感興趣的可以了解一下
    2023-08-08
  • Java高效讀取CSV文件的多種方法與分步實例

    Java高效讀取CSV文件的多種方法與分步實例

    在當今數(shù)據(jù)驅(qū)動的世界中,CSV文件作為一種輕量級,通用的數(shù)據(jù)交換格式,本文將深入探討多種Java讀取CSV文件的方法,幫助開發(fā)者在不同場景下選擇最合適的解決方案,希望對大家有所幫助
    2025-10-10
  • mybatis同一張表多次連接查詢相同列賦值問題小結

    mybatis同一張表多次連接查詢相同列賦值問題小結

    這篇文章主要介紹了mybatis同一張表多次連接查詢相同列賦值問題,非常不錯,具有參考借鑒價值,需要的的朋友參考下
    2017-01-01
  • Java并發(fā)編程之顯式鎖機制詳解

    Java并發(fā)編程之顯式鎖機制詳解

    這篇文章主要為大家詳細介紹了Java并發(fā)編程之顯式鎖機制的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • java并發(fā)編程_線程池的使用方法(詳解)

    java并發(fā)編程_線程池的使用方法(詳解)

    下面小編就為大家?guī)硪黄猨ava并發(fā)編程_線程池的使用方法(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • IDEA遠程部署調(diào)試Java應用程序的詳細流程

    IDEA遠程部署調(diào)試Java應用程序的詳細流程

    這篇文章主要介紹了IDEA遠程部署調(diào)試Java應用程序,本文通過圖文并茂的形式給大家介紹的非常詳細,需要的朋友可以參考下
    2021-10-10
  • java實現(xiàn)樹形菜單對象

    java實現(xiàn)樹形菜單對象

    這篇文章主要為大家詳細介紹了java實現(xiàn)樹形菜單對象,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • 檢查Java環(huán)境變量是否配置成功的兩種方法

    檢查Java環(huán)境變量是否配置成功的兩種方法

    本文詳細介紹如何配置Java環(huán)境變量,包括設置JAVA_HOME路徑及添加到系統(tǒng)PATH中,確保Java命令行工具可用,同時,演示了如何使用命令行編譯和運行Java程序,以及使用javap工具進行反匯編,需要的朋友可以參考下
    2026-03-03
  • JDBC自定義連接池過程詳解

    JDBC自定義連接池過程詳解

    這篇文章主要介紹了JDBC自定義連接池過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • IDEA類存在但找不到的解決辦法

    IDEA類存在但找不到的解決辦法

    本文主要介紹了IDEA類存在但找不到的解決辦法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07

最新評論

岫岩| 遵义县| 维西| 中江县| 呼伦贝尔市| 呼图壁县| 海门市| 汝州市| 南江县| 武冈市| 贞丰县| 仙桃市| 客服| 巢湖市| 永安市| 剑川县| 乐安县| 三穗县| 潼关县| 乌什县| 敦煌市| 阳山县| 吉安市| 正阳县| 靖西县| 漠河县| 永平县| 柘荣县| 汾阳市| 当阳市| 贺兰县| 永定县| 得荣县| 乳源| 绥中县| 古蔺县| 曲沃县| 定安县| 娱乐| 佛山市| 西安市|