安全-JAVA開發-第二天

Web資源訪問的流程

由此可見 客戶訪問JAVA開發的應用時 會先通過 監聽器(Listener)和 過濾器(Filter) 今天簡單的了解下這兩個模塊的開發過程

監聽器(Listener)

主要是監聽 我們觸發了什么行為 并進行反應 下面是一個監聽Session的例子

正常創建項目后 目錄文件如下

CSession代碼
import jakarta.servlet.http.*;
import java.io.IOException;@WebServlet("/CS")  // 映射到路徑 "/CS"
public class CSession extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 控制臺輸出,表示正在創建 SessionSystem.out.println("creat Session");// 調用 req.getSession() 方法獲取或創建 Session// 如果請求中沒有 Session,則自動創建新 Sessionreq.getSession();}
}
DSession代碼
package com.example.listendemo1.Servlet;import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.*;
import java.io.IOException;@WebServlet("/DS")  // 映射到路徑 "/DS"
public class DSession extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 控制臺輸出日志,表示正在銷毀 SessionSystem.out.println("kill Session");// 獲取當前 Session 并立即使其失效// invalidate() 方法會銷毀 Session,清除所有存儲的屬性req.getSession().invalidate();}
}

以上兩個代碼操作為 訪問路徑(/CS|/DS)后對Session進行創建(刪除)操作

ListenSession代碼
package com.example.listendemo1.Listener;import jakarta.servlet.annotation.WebListener;
import jakarta.servlet.http.HttpSessionEvent;
import jakarta.servlet.http.HttpSessionListener;@WebListener
public class ListenSession implements HttpSessionListener {@Overridepublic void sessionCreated(HttpSessionEvent se) {// 輸出 Session 創建日志(控制臺)System.out.println("Session created in Listen Session");}@Overridepublic void sessionDestroyed(HttpSessionEvent se) {// 輸出 Session 銷毀日志(控制臺)System.out.println("Session destroyed in Listen Session");}
}

監聽器(Listener)運行情況

在沒有操作時就會產生默認操作

創建Session

刪除Session 監聽器監聽到了該動作

過濾器(Filter)

路徑如下

TextServlet代碼
package com.example.filterdemo1.Servlet;import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;@WebServlet("/text")  // 定義Servlet訪問路徑
public class TextServlet extends HttpServlet {//處理HTTP GET請求@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {// 從請求中獲取名為"code"的參數值String code = req.getParameter("code");// 獲取響應輸出流(自動設置text/html內容類型)PrintWriter out = resp.getWriter();// 將參數值寫入響應out.println(code);// 刷新并關閉輸出流out.flush();out.close();}
}

XssFilter代碼
package com.example.filterdemo1.filter;import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpServletRequest;
import java.io.IOException;@WebFilter("/text") // 只過濾/text路徑的請求
public class XssFilter implements Filter {// 過濾器初始化方法(容器啟動時執行一次)@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("XssFilter first"); // 初始化日志}// 過濾器銷毀方法(容器關閉時執行)@Overridepublic void destroy() {System.out.println("XssFilter end"); // 銷毀日志}// 過濾處理方法(每次請求時執行)@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,FilterChain filterChain) throws IOException, ServletException {System.out.println("XssFilter now"); // 處理請求日志// 類型轉換獲取HttpServletRequestHttpServletRequest requset = (HttpServletRequest) servletRequest;// 獲取請求參數code的值String code = requset.getParameter("code");// 檢查是否不包含<script>標簽if (!code.contains("<script>")) {// 安全請求,放行filterChain.doFilter(servletRequest, servletResponse);} else {// 檢測到潛在XSS攻擊System.out.println("XssFilter fight!!"); // 攻擊日志// 注意:這里只是記錄日志,實際應該阻止請求繼續處理}}
}
測試代碼運行如下:

預啟動

添加代碼--text?code=<script>alert(1)</script>? ? ?正常執行可以在頁面彈出1

顯示受到了攻擊

正常情況是這個樣子--text?code=123

第二個例子:/admin

AdminServlet代碼
package com.example.filterdemo1.Servlet;import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;//管理員后臺Servlet@WebServlet("/admin")  // 定義Servlet訪問路徑為/admin
public class AdminServlet extends HttpServlet {// 處理HTTP GET請求@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {// 控制臺輸出歡迎信息System.out.println("Welcome to Admin Servlet");}
}
AdminFiler代碼
package com.example.filterdemo1.filter;import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import java.io.IOException;// 管理員權限過濾器// 作用路徑:/admin
@WebFilter("/admin") // 過濾所有訪問/admin路徑的請求
public class AdminFilter implements Filter {// 過濾器初始化方法(容器啟動時執行一次)@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("XssFilter first"); // 初始化日志}// 過濾器銷毀方法(容器關閉時執行)@Overridepublic void destroy() {System.out.println("XssFilter end"); // 銷毀日志}/*** 過濾處理方法(每次訪問/admin時執行)* 通過檢查Cookie驗證管理員權限*/@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,FilterChain filterChain) throws IOException, ServletException {// 轉換請求對象以獲取CookieHttpServletRequest requset = (HttpServletRequest) servletRequest;// 獲取請求中的所有CookieCookie[] cookies = requset.getCookies();// 遍歷所有Cookiefor (Cookie c : cookies) {String cName = c.getName(); // 獲取Cookie名稱String cValue = c.getValue(); // 獲取Cookie值// 打印Cookie信息(調試用)System.out.println(cName);System.out.println(cValue);// 檢查是否為管理員Cookieif (cName.equals("username") && cValue.equals("admin")) {// 驗證通過,放行請求filterChain.doFilter(servletRequest, servletResponse);return; // 找到有效Cookie后立即返回} else {// 非管理員CookieSystem.out.println("NO ADMIN");}}}
}
實驗結果如下:

會打印出Cookie值 因為是循環輸出 Cookie都會被輸出 admin認證成功 第二個password也會輸出 但是沒有對password進行判斷 所有會輸出NO ADMIN

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/908126.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/908126.shtml
英文地址,請注明出處:http://en.pswp.cn/news/908126.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用 Ansys Q3D 進行電容提取

精確的電容提取在高速和 RF 設計中至關重要。雖然簡單的公式可以提供一個很好的起點&#xff0c;但它們往往無法捕捉 fringing fields 和 layout-dependent parasitics 的影響。在本博客中&#xff0c;我們演示了如何使用Ansys Q3D Extractor來計算電容值&#xff0c;從基本的平…

卡西歐模擬器:Windows端功能強大的計算器

引言 大家還記得初中高中時期用的計算器嗎&#xff1f;今天給大家分享的就是一款windows端的卡西歐計算器。 軟件介紹 大家好&#xff0c;我是逍遙小歡。 CASIO fx-9860G是一款功能強大的圖形計算器&#xff0c;適用于數學、科學和工程計算。以下是其主要功能和特點的詳細介…

【Bluedroid】藍牙啟動之gatt_init 流程源碼解析

本文圍繞Android藍牙協議棧中 GATT(通用屬性配置文件)模塊的初始化函數gatt_init展開,深入解析其核心實現邏輯與關鍵步驟。通過分析gatt_init及其關聯子函數(如L2CA_RegisterFixedChannel、gatt_profile_db_init、EattExtension::Start等),以及相關數據結構(如tGATT_CB控…

Vue 3 中ref 結合ts 獲取 DOM 元素的實踐指南。

文章目錄 前言一、為什么需要為 ref 添加類型&#xff1f;二、基本用法&#xff1a;引用 DOM 元素1. 引用通用 DOM 元素&#xff08;HTMLElement&#xff09;2. 引用特定類型的 DOM 元素&#xff08;如 HTMLDivElement&#xff09; 三、<script setup> 語法中的類型定義四…

Axure形狀類組件圖標庫(共8套)

點擊下載《月下倚樓圖標庫(形狀組件)》 原型效果&#xff1a;https://axhub.im/ax9/02043f78e1b4386f/#g1 摘要 本圖標庫集錦精心匯集了8套專為Axure設計的形狀類圖標資源&#xff0c;旨在為產品經理、UI/UX設計師以及開發人員提供豐富多樣的設計素材&#xff0c;提升原型設計…

01串(二進制串)與集合之間存在天然的對應關系 ← bitset

【集合的二進制表示?】 ● 01 串&#xff08;二進制串&#xff09;與集合之間存在天然的對應關系。對應機理為每個二進制位可以表示集合中一個元素的存在&#xff08;1&#xff09;或不存在&#xff08;0&#xff09;。例如&#xff0c;集合 {a, b, c} 的子集 {a, c} 可以表示…

vba學習系列(10)--外觀報表

系列文章目錄 文章目錄 系列文章目錄前言一、外觀報表1.產能統計2.單板數3.固定傷排查4.件號良率5.鏡片批退率6.鏡筒批退率 總結 前言 一、外觀報表 1.產能統計 Sub ProcessInspectionData()Dim ws1 As Worksheet, ws2 As Worksheet, ws3 As WorksheetDim lastRow1 As Long, …

machine_env_loader must have been assigned before creating ssh child instance

在主機上執行roslaunch命令時&#xff0c;報錯&#xff1a;machine_env_loader must have been assigned before creating ssh child instance。 解決辦法&#xff1a; 打開hostos文件&#xff0c;檢查local host 前的內部ip是否正常。操作示例&#xff1a; 先輸入下方指令打…

CSS radial-gradient函數詳解

目錄 基本語法 關鍵參數詳解 1. 漸變形狀&#xff08;Shape&#xff09; 2. 漸變大小&#xff08;Size&#xff09; 3. 中心點位置&#xff08;Position&#xff09; 4. 顏色斷點&#xff08;Color Stops&#xff09; 常見應用場景 1. 基本圓形漸變 2. 橢圓漸變 3. 模…

分析Web3下數據保護的創新模式

在這個信息爆炸的時代&#xff0c;我們正站在 Web3 的門檻上&#xff0c;迎接一個以去中心化、用戶主權和數據隱私為核心的新時代。Web3 不僅僅是技術的迭代&#xff0c;它更是一場關于數據權利和責任的結構性變革。本文將探討 Web3 下數據保護的創新模式&#xff0c;以期為用戶…

RabbitMQ-Go 性能分析

更多個人筆記見&#xff1a; &#xff08;注意點擊“繼續”&#xff0c;而不是“發現新項目”&#xff09; github個人筆記倉庫 https://github.com/ZHLOVEYY/IT_note gitee 個人筆記倉庫 https://gitee.com/harryhack/it_note 個人學習&#xff0c;學習過程中還會不斷補充&…

AI助力Java開發:減少70%重復編碼,實戰效能提升解析

工具再先進&#xff0c;也替代不了編程思維的深度錘煉 在Java開發領域&#xff0c;重復編碼如同無形的生產力黑洞——以商品管理模塊開發為例&#xff0c;開發者耗費大量時間編寫SQL查詢、處理結果集轉換&#xff1b;用戶系統里&#xff0c;密碼加密和狀態管理的代碼在不同項目…

JS語法筆記

目錄 JS數組Array新建數組一維數組二維數組 reverse()在數組末尾插入&#xff1a;push()在數組末尾刪除&#xff1a;pop()在數組開頭插入&#xff1a;unshift()從數組開頭刪除一個元素shift()splice() MapSet JS數組Array 判斷數組相等不能用&#xff0c;要循環判斷 新建數組…

uniapp-商城-77-shop(8.2-商品列表,地址信息添加,級聯選擇器picker)

地址信息,在我們支付訂單上有這樣一個接口,就是物流方式,一個自提,我們就顯示商家地址。一個是外送,就是用戶自己填寫的地址。 這里先說說用戶的地址添加。需要使用到的一些方式方法,主要有關于地址選擇器,就是uni-data-picker級聯選擇。 該文介紹了電商應用中地址信息處…

網頁前端開發(基礎進階3--Vue)

Vue3 Vue是一款用于構建用戶界面的漸進式的JavaScript框架。 Vue由2部分組成&#xff1a;Vue核心包&#xff0c;Vue插件包 Vue核心包包含&#xff1a;聲明式渲染&#xff0c;組件系統。 Vue插件包&#xff1a;VueRouter&#xff08;客戶端路由&#xff09;&#xff0c;Vuex…

大模型相關技術綜述

多模態大模型&大模型訓練語料持續迭代 已經開始整理多模態-視覺部分&#xff1a; 主要分為一下幾塊 多模態信息壓縮模型&#xff08;clip、vit、swiT&#xff09; 生成模型&#xff08;vae、gan、flow、ddpm、sde…) 其它多模態大模型&#xff08;語音、視頻、slam、3…

Vue3中Ant-design-vue的使用-附完整代碼

前言 首先介紹一下什么是Ant-design-vue Ant Design Vue 是基于 Vue 3 的企業級 UI 組件庫&#xff08;同時兼容 Vue 2&#xff09;&#xff0c;是螞蟻金服開源項目 Ant Design 的 Vue 實現版本。它遵循 Ant Design 的設計規范&#xff0c;提供豐富的組件和高質量的設計體系&…

建造者模式:優雅構建復雜對象

引言 在軟件開發中&#xff0c;有時我們需要創建一個由多個部分組成的復雜對象&#xff0c;這些部分可能有不同的變體或配置。如果直接在一個構造函數中設置所有參數&#xff0c;代碼會變得難以閱讀和維護。當對象構建過程復雜&#xff0c;且需要多個步驟時&#xff0c;我們可…

如何通過akshare庫,獲取股票數據,并生成TabPFN這個模型 可以識別、處理的格式(并進行了訓練、推理)

計劃讓AI幫助編程使用TabPFN模型進行股價推理 原計劃提問的prompt 如何通過akshare庫&#xff0c;獲取股票數據&#xff0c;并生成TabPFN這個模型 可以識別、處理的格式 本意是想讓AI分步執行&#xff0c;先處理股票數據&#xff0c;然后再進行模型訓練&#xff0c;結果豆包超…

[藍橋杯]最大化股票交易的利潤

最大化股票交易的利潤 題目描述 實現一個算法尋找最大化股票交易利潤的策略。介紹如下&#xff1a; 股票價格每天都在變化&#xff0c;以數組的索引表示交易日&#xff0c;以數組的元素表示每天的股票價格。可以通過買入和賣出獲得利潤。一天只能進行一次買入或賣出操作&…