国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java 項目防止 SQL 注入的四種方案

這篇具有很好參考價值的文章主要介紹了Java 項目防止 SQL 注入的四種方案。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

什么是SQL注入?

SQL注入即是指web應用程序對用戶輸入數(shù)據的合法性沒有判斷或過濾不嚴,攻擊者可以在web應用程序中事先定義好的查詢語句的結尾上添加額外的SQL語句,在管理員不知情的情況下實現(xiàn)非法操作,以此來實現(xiàn)欺騙數(shù)據庫服務器執(zhí)行非授權的任意查詢,從而進一步得到相應的數(shù)據信息。

SQL案列

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

這個id從請求參數(shù)中獲取,若參數(shù)被拼接為:
1001 or 1 = 1
最執(zhí)行語句變?yōu)椋?/strong>

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

此時,數(shù)據庫的數(shù)據都會被清空掉,后果非常嚴重

Java項目防止SQL注入方式

這里總結4種:

  • PreparedStatement防止SQL注入
  • mybatis中#{}防止SQL注入
  • 對請求參數(shù)的敏感詞匯進行過濾
  • nginx反向代理防止SQL注入

1、PreparedStatement防止SQL注入
PreparedStatement具有預編譯功能,以上述SQL為例
使用PreparedStatement預編譯后的SQL為:

delete from table1 where id = ?

此時SQL語句結構已固定,無論"?"被替換為任何參數(shù),SQL語句只認為where后面只有一個條件,當再傳入 1001 or 1 = 1時,語句會報錯,從而達到防止SQL注入效果。
2、mybatis中#{}防止SQL注入
mybatis中#{}表達式防止SQL注入與PreparedStatement類似,都是對SQL語句進行預編譯處理
注意:

#{} :參數(shù)占位符
${} :拼接替換符,不能防止SQL注入,一般用于

  • 傳入數(shù)據庫對象(如:數(shù)據庫名稱、表名)
  • order by 后的條件對請求參數(shù)的敏感詞匯進行過濾

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

這里是springboot的寫法,如下:

import org.springframework.context.annotation.Configuration;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
import java.util.Enumeration;
 
@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ù)據返回的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() {}
}

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

將下面的Nginx配置文件代碼放入到server塊中,然后重啟Nginx即可文章來源地址http://www.zghlxwxcb.cn/news/detail-700056.html

.

```sql
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; }
 #這里大家根據自己情況添加刪減上述判斷參數(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; }
 #同上,大家根據自己站點實際情況來添加刪減下面的屏蔽攔截參數(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; } #這個會影響國內某些搜索引擎爬蟲,比如:搜狗
 #攔截各惡意請求的UA,可以通過分析站點日志文件或者waf日志作為參考配置。
 if ($http_referer ~* 17ce.com) { return 509; }
 #攔截17ce.com站點測速節(jié)點的請求,所以明月一直都說這些測速網站的數(shù)據僅供參考不能當真的。
 if ($http_referer ~* WebBench*") { return 509; }
 #攔截WebBench或者類似壓力測試工具,其他工具只需要更換名稱即可。

到了這里,關于Java 項目防止 SQL 注入的四種方案的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 常見的四種排名函數(shù)的用法(sql)

    常見的四種排名函數(shù)的用法(sql)

    四個排名函數(shù): 1.row_number 2.rank 3.dense_rank 4.ntile 1. ROW_NUMBER(排名場景推薦) 1.1 介紹 在 SQL 中,ROW_NUMBER() 是一個窗口函數(shù),它為結果集中的每一行分配一個唯一的序號。該函數(shù)的語法如下: 其中,ORDER BY 子句指定了 ROW_NUMBER() 函數(shù)排列行的順序。如果省略 ORDER BY,則序號將按

    2024年02月01日
    瀏覽(47)
  • 詳解JS的四種異步解決方案!

    詳解JS的四種異步解決方案!

    目錄 同步異步的概念 js中異步的應用場景 實現(xiàn)異步的四種方法 1、 回調函數(shù) 2、Promise 3、Generator 4、 async/await ????????「異步編程」 是前端工程師日常開發(fā)中經常會用到的技術,也是校招面試過程中??嫉囊粋€知識點。 ????????通過掌握 「異步編程」 的四種方式,可

    2024年01月18日
    瀏覽(43)
  • 解決Hash(哈希表)沖突的四種方案

    解決Hash(哈希表)沖突的四種方案

    參考鳴謝 解決哈希沖突必須知道的幾種方法 小僵魚 你還應該知道的哈希沖突解決策略 vivo互聯(lián)網技術 解決哈希沖突的三種方法 kaleidoscopic 每日一題(哈希表及哈希沖突解決辦法) 和笙 哈希是一種通過對數(shù)據進行壓縮, 從而提高效率的一種解決方法 ,但由于哈希函數(shù)有限,數(shù)據

    2024年02月14日
    瀏覽(21)
  • 【MyBatis】防止sql注入

    前言 關于sql注入的解釋這里不再贅述。 在MyBatis中防止的sql注入主要分為兩種: ????????第一種就是MyBatis提供了兩種支持動態(tài) sql 的語法 #{}?和 ${},其中${} 是簡單的字符串替換,而 #{}?在預處理時,會把參數(shù)部分用一個占位符 ? 代替,可以有效的防止sql的注入,面試的時

    2024年02月13日
    瀏覽(52)
  • SQL防止注入工具類,可能用于SQL注入的字符有哪些

    SQL防止注入工具類,可能用于SQL注入的字符有哪些

    SQL注入是一種攻擊技術,攻擊者試圖通過在輸入中注入惡意的SQL代碼來干擾應用程序的數(shù)據庫查詢。為了防止SQL注入,你需要了解可能用于注入的一些常見字符和技術。以下是一些常見的SQL注入字符和技術: 單引號 \\\' ?: 攻擊者可能會嘗試通過輸入 ? ?\\\'? ? 來結束 SQL 查

    2024年02月21日
    瀏覽(19)
  • .Net 全局過濾,防止SQL注入

    問題背景:由于公司需要整改的老系統(tǒng)的漏洞檢查,而系統(tǒng)就是沒有使用參數(shù)化SQL即拼接查詢語句開發(fā)的程序,導致漏洞掃描出現(xiàn)大量SQL注入問題。 解決方法:最好的辦法就是不寫拼接SQL,改用參數(shù)化SQL,推薦新項目使用,老項目改起來比較麻煩,花費的時間也多,最后選擇

    2024年01月18日
    瀏覽(21)
  • SQL注入原理以及Spring Boot如何防止SQL注入(含詳細示例代碼)

    點擊下載《SQL注入原理以及Spring Boot如何防止SQL注入(含詳細示例代碼)》 SQL注入是一種針對數(shù)據庫的攻擊技術,攻擊者通過在應用程序的輸入字段中插入或“注入”惡意的SQL代碼,從而在數(shù)據庫服務器上執(zhí)行非授權的SQL查詢。這種攻擊可能導致數(shù)據泄露、數(shù)據篡改、甚至執(zhí)

    2024年02月20日
    瀏覽(31)
  • PHP中如何防止SQL注入攻擊?

    防止 SQL 注入攻擊是 Web 應用程序安全性的一個關鍵方面。以下是一些在 PHP 中防止 SQL 注入攻擊的常見做法: 使用預處理語句: 使用預處理語句和參數(shù)化查詢可以有效防止 SQL 注入攻擊。PHP 中的 PDO(PHP Data Objects)和 MySQLi(MySQL Improved)都支持預處理語句。 使用 PDO 示例:

    2024年02月04日
    瀏覽(26)
  • MySQL 安全及防止 SQL 注入攻擊

    如果通過網頁獲取用戶輸入的數(shù)據并將其插入? MySQL ?數(shù)據庫,那么就有可能發(fā)生? SQL 注入攻擊的安全問題 作為研發(fā),有一條鐵律需要記住,那就是 永遠不要相信用戶的數(shù)據,哪怕他一再承諾是安全的 SQL ?注入,就是通過把? SQL ?命令插入到? Web ?表單遞交或輸入域名或頁

    2024年02月02日
    瀏覽(41)
  • MySQL與ES數(shù)據同步的四種方案及實踐演示

    MySQL與ES數(shù)據同步的四種方案及實踐演示

    也就是同步調用,這是一種最為簡單的方式,在將數(shù)據寫到mysql時,同時將數(shù)據寫到ES。 1.業(yè)務邏輯簡單 2實時性高 1.硬編碼,有需要寫入mysql的地方都需要添加寫入ES的代碼 2.業(yè)務強耦合 3.存在雙寫失敗丟數(shù)據風險 4.性能較差:本來mysql的性能不是很高,再加一個ES,系統(tǒng)的性

    2024年02月09日
    瀏覽(38)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包