日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

springboot項目如何防止XSS攻擊

瀏覽:127日期:2023-03-02 08:50:54
目錄1. 什么是XSS攻擊?2. 如何防范?2.1 什么時候注入請求參數3. 具體處理細節1. 什么是XSS攻擊?

XSS攻擊全稱跨站腳本攻擊,是一種在web應用中的計算機安全漏洞,它允許惡意web用戶將代碼植入到提供給其它用戶使用的頁面中。也就是作惡的用戶通過表單提交一些前端代碼,如果不做處理的話,這些前端代碼將會在展示的時候被瀏覽器執行。

2. 如何防范?

有兩種方式,一種是一些特殊字符轉義,另一種是去除一些危險html元素。本文通過JSOUP庫實現第二種方式。

現在問題是,在什么時候對XSS攻擊的字符串進行處理呢?這就涉及到spring mvc的Controller中的method params什么時候注入的問題。下面對方法參數注入的原理進行簡單說明。

2.1 什么時候注入請求參數

常見的控制器方法有下面幾種,分別是通過GET獲取請求參數,POST獲取json或者form表單的參數

/** * 通過url的path,獲取請求參數 */@ResponseBody@GetMapping('/xssByGetUsingPath/{content}')public String testGetUsingPath(@PathVariable(name = 'content') String content) { return content;}/** * 通過url的query params獲取請求數據. 方法使用簡單類型進行接收 */@ResponseBody@GetMapping('/xssByGetUsingSimple')public String testUsingSimple(@RequestParam(name = 'content') String content) { return content;}/** * 通過url的query params獲取請求數據. 方法使用model進行接收 */@ResponseBody@GetMapping('/xssByGetUsingModel')public String testGetUsingModel(BaseTest.Paper paper) { return paper.getContent();}/** * 通過 form 表單的方式獲取數據. 方法使用簡單類型進行接收 */@ResponseBody@PostMapping('/xssByFormPostUsingSimple')public String testFormPostUsingSimple(@RequestParam(name = 'content') String content) { return content;}/** * 通過 form 表單的方式獲取數據. 方法使用model進行參數接收 */@ResponseBody@PostMapping('/xssByFormPostUsingModel')public String testFormPostUsingModel(BaseTest.Paper paper) { return paper.getContent();}/** * 通過 request body 發送 json數據 */@ResponseBody@PostMapping('/xssByPostJsonBody')public String testPostJsonBody(@RequestBody BaseTest.Paper paper) { return paper.getContent();}

大家都知道,在spring mvc中處理請求的入口在 DispatcherServlet 類中,其中 doDispatch() 方法完成所有核心功能。在該主流程中,HandlerAdapter 將會對HTTP請求進行 Controller 的方法調用,以及對請求結果進行轉換,并封裝為DispatcherServlet 類需要的 ModelAndView 。在這里,由于使用注解的方式進行 Controller 定義,所以 HandlerAdapter 的實現類為 RequestMappingHandlerAdapter 。RequestMappingHandlerAdapter 類的 handle() 方法中,委托給 HandlerMethodArgumentResolver 對每個 Controller 的 方法的每個參數進行解析,反射調用 Controller 的 方法后,再 委托 HandlerMethodReturnValueHandler 對反射調用的返回值進行處理。

至此,本文的主角出現了,也就是 HandlerMethodArgumentResolver 。我們看下有關于本文的HandlerMethodArgumentResolver 類繼承關系。

springboot項目如何防止XSS攻擊

上面的常見controller定義方法的 參數解析(注意,這里是說方法那里的參數解析) 對應 HandlerMethodArgumentResolver 的關系如下圖:

springboot項目如何防止XSS攻擊

現在,我們已經知道了他們都由什么樣 HandlerMethodArgumentResolver 解析方法參數,我們繼續分析他們之前的共同點,并得到在哪里對http傳過來的數據進行XSS處理。

RequestResponseBodyMethodProcessor 是一個對request body的JSON數據反序列化的處理器,在 resolveArgument() 方法中,將會獲取合適的 org.springframework.http.converter.HttpMessageConverter 類對string數據進行反序列化處理。springboot 在初始化的時候,已經默認注冊了 jackson 的 MappingJackson2HttpMessageConverter ,并使用它對 JSON 數據進行反序列化操作。在 jackson 里面,JsonDeserializer 類 用于json數據的property的反序列化,因此,我們可以通過擴展 JsonDeserializer ,并在里面處理XSS即可。

對于 PathVariableMethodArgumentResolver、 RequestParamMethodArgumentResolver、 ServletModelAttributeMethodProcessor ,在 resolveArgument() 方法中,他們對需要對請求參數調用 DataBinder 類 對獲取到的參數類型轉換和數據綁定。對于類型轉換的過程,他們會使用 org.springframework.core.convert.converter.Converter 進行轉換。同樣,在SPRINGBOOT初始化的過程,也注冊了很多個默認的轉換器,我們可以注冊一個自定義轉換器,用于對數據進行xss處理。

3. 具體處理細節

抽象XSSCleaner,用于對string進行XSS處理

public interface XssCleaner { /** * 清理 html, 防止XSS * * @param html html * @return 清理后的數據 */ String clean(String html);}

使用JSOUP,做HTML節點的白名單處理

public class DefaultXssCleaner implements XssCleaner { public static final HtmlWhitelist WHITE_LIST = new HtmlWhitelist(); @Override public String clean(String html) {if (StringUtils.hasText(html)) { return Jsoup.clean(html, WHITE_LIST);}return html; } private static class HtmlWhitelist extends Whitelist {public HtmlWhitelist() { //定義標簽和屬性的白名單 addTags('a', 'b', 'blockquote', 'br', 'caption', 'cite', 'code', 'col', 'colgroup', 'dd', 'div', 'span', 'embed', 'object', 'dl', 'dt', 'em', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'i', 'img', 'li', 'ol', 'p', 'pre', 'q', 'small', 'strike', 'strong', 'sub', 'sup', 'table', 'tbody', 'td', 'tfoot', 'th', 'thead', 'tr', 'u', 'ul'); addAttributes('a', 'href', 'title', 'target'); addAttributes('blockquote', 'cite'); addAttributes('col', 'span'); addAttributes('colgroup', 'span'); addAttributes('img', 'align', 'alt', 'src', 'title'); addAttributes('ol', 'start'); addAttributes('q', 'cite'); addAttributes('table', 'summary'); addAttributes('td', 'abbr', 'axis', 'colspan', 'rowspan', 'width'); addAttributes('th', 'abbr', 'axis', 'colspan', 'rowspan', 'scope', 'width'); addAttributes('video', 'src', 'autoplay', 'controls', 'loop', 'muted', 'poster', 'preload'); addAttributes('object', 'width', 'height', 'classid', 'codebase'); addAttributes('param', 'name', 'value'); addAttributes('embed', 'src', 'quality', 'width', 'height', 'allowFullScreen', 'allowScriptAccess', 'flashvars', 'name', 'type', 'pluginspage'); addAttributes(':all', 'class', 'style', 'height', 'width', 'type', 'id', 'name'); addProtocols('blockquote', 'cite', 'http', 'https'); addProtocols('cite', 'cite', 'http', 'https'); addProtocols('q', 'cite', 'http', 'https');}@Overrideprotected boolean isSafeAttribute(String tagName, Element el, Attribute attr) { //不允許 javascript 開頭的 src 和 href if ('src'.equalsIgnoreCase(attr.getKey()) || 'href'.equalsIgnoreCase(attr.getKey())) {String value = attr.getValue();if (StringUtils.hasText(value) && value.toLowerCase().startsWith('javascript')) { return false;} } //允許 base64 的圖片內容 if ('img'.equals(tagName) && 'src'.equals(attr.getKey()) && attr.getValue().startsWith('data:;base64')) {return true; } return super.isSafeAttribute(tagName, el, attr);} }}

新增一個jackson的JsonDeserializer

/** * jackson的反序列化時的html xss過濾器 */public class JacksonXssCleanJsonDeserializer extends JsonDeserializer<String> { private final static Logger LOGGER = LoggerFactory.getLogger(JacksonXssCleanJsonDeserializer.class); private final XssCleaner xssCleaner; public JacksonXssCleanJsonDeserializer(XssCleaner xssCleaner) {this.xssCleaner = xssCleaner; } @Override public Class<?> handledType() {return String.class; } @Override public String deserialize(JsonParser p, DeserializationContext context) throws IOException, JsonProcessingException {// XSS cleanString text = p.getValueAsString();if (StringUtils.hasText(text) && XssCleanMarker.shouldClean()) { String cleanText = xssCleaner.clean(text); if (LOGGER.isDebugEnabled()) {LOGGER.debug('Json property value: [{}] cleaned up by JacksonXssCleanJsonDeserializer, current value is:{}.', text, cleanText); } return cleanText;}return text; }}

新增 Converter

/** * 對請求數據過濾xss */public class XssCleanConverter implements Converter<String, String> { private final Logger LOGGER = LoggerFactory.getLogger(XssCleanConverter.class); private XssCleaner xssCleaner; public XssCleanConverter(XssCleaner xssCleaner) {this.xssCleaner = xssCleaner; } @Override public String convert(String text) {if (StringUtils.hasText(text) && XssCleanMarker.shouldClean()) { String cleanText = xssCleaner.clean(text); if (LOGGER.isDebugEnabled()) {LOGGER.debug('request param [{}] cleaned up by XssCleanConverter, current value is:{}.', text, cleanText); } return cleanText;}return text; }}

對 JsonDeserializer 和 Converter 進行注冊

@Configuration@ConditionalOnProperty(value = XSS_PROPERTIES_ENABLED, havingValue = 'true', matchIfMissing = true)@ConditionalOnWebApplication@EnableConfigurationProperties({XssProperties.class})public class WebXssConfiguration implements WebMvcConfigurer { private XssProperties properties; public WebXssConfiguration(XssProperties properties) {this.properties = properties; } @Bean @ConditionalOnMissingBean public XssCleaner xssCleaner() {return new DefaultXssCleaner(); } @Bean @ConditionalOnClass(value = {ObjectMapper.class, Jackson2ObjectMapperBuilder.class}) public Jackson2ObjectMapperBuilderCustomizer jacksonXssCleanJsonDeserializerCustomer(XssCleaner xssCleaner) {return builder -> builder.deserializers(new JacksonXssCleanJsonDeserializer(xssCleaner)); } @Override public void addFormatters(FormatterRegistry registry) {XssCleaner xssCleaner = xssCleaner();registry.addConverter(new XssCleanConverter(xssCleaner)); } @Override public void addInterceptors(InterceptorRegistry registry) {XssCleanMarkerHandlerInterceptor handlerInterceptor = new XssCleanMarkerHandlerInterceptor(properties);registry.addInterceptor(handlerInterceptor); }}

上面是XSS處理的核心代碼。處理XSS處理,還進行了一些擴展,比如 http path 路徑的過濾 和 一些使能控制。

完整的代碼可以參考倉庫:倉庫地址

以上就是springboot項目如何防止XSS攻擊的詳細內容,更多關于springboot防止XSS攻擊的資料請關注好吧啦網其它相關文章!

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产视频一区二| 日本久久一区| 丝袜亚洲精品中文字幕一区| 国产成人精选| 国产麻豆一区二区三区精品视频| 免费人成黄页网站在线一区二区| 免费看av不卡| 精品国产乱码久久久| 日韩精品免费一区二区夜夜嗨| 国产亚洲高清视频| 午夜精品亚洲| 九九色在线视频| 亚洲va中文在线播放免费| 黄色aa久久| 日韩欧美另类一区二区| 欧美天堂视频| 久久视频精品| 蜜桃av一区二区| 日韩精品a在线观看91| 国产日本精品| 国内精品伊人| 日韩欧美在线中字| 在线精品视频在线观看高清| 最新国产拍偷乱拍精品| 蜜臀av性久久久久蜜臀aⅴ四虎| 深夜日韩欧美| 青草国产精品久久久久久| 国产精品v亚洲精品v日韩精品| 精品成av人一区二区三区| 久久天堂精品| 亚洲精品护士| 人在线成免费视频| 午夜一区在线| 麻豆免费精品视频| 在线视频观看日韩| 欧美欧美黄在线二区| 久久久久国产一区二区| 日韩欧美中文字幕在线视频| 色综合狠狠操| 亚洲一区二区毛片| 国产精品黄色片| 久久久久99| 国产精品乱战久久久| 日韩视频不卡| 欧美91在线| 日本v片在线高清不卡在线观看| 黄色aa久久| 中文字幕亚洲精品乱码| 国产精品第一国产精品| 日韩在线a电影| 美女一区网站| 麻豆成人91精品二区三区| 羞羞答答国产精品www一本| 日韩1区在线| 日韩二区三区在线观看| 欧美特黄一区| 国产美女高潮在线| 国产精品毛片aⅴ一区二区三区| 亚洲影视一区二区三区| 激情综合网五月| 久久久亚洲一区| 欧美日韩视频网站| 97精品国产福利一区二区三区| 国产亚洲欧美日韩在线观看一区二区 | 国产成人黄色| 国产欧美综合一区二区三区| 亚洲精品欧美| 免费的成人av| 麻豆精品91| 玖玖玖国产精品| 亚洲精品网址| 免费久久99精品国产自在现线| 国产伦理久久久久久妇女| 亚州精品视频| 日本亚洲欧洲无免费码在线| 亚洲日产av中文字幕| 久久xxxx| 亚洲v天堂v手机在线| 青草综合视频| 中文字幕在线看片| 好吊日精品视频| 日韩精品第一| www在线观看黄色| 亚洲一区二区三区高清不卡| 五月婷婷六月综合| 三级久久三级久久久| 精品视频自拍| 激情欧美国产欧美| 日本午夜精品久久久久| 国内自拍视频一区二区三区| 91精品国产调教在线观看| 久久久精品网| 欧美特黄一级| 亚洲色图网站| 国产精品资源| 国产成人a视频高清在线观看| 97精品在线| 亚洲欧美日韩高清在线| 日韩影院精彩在线| 91嫩草亚洲精品| 久久三级视频| 午夜视频一区二区在线观看| 国产调教精品| 日韩精品免费一区二区三区| 999国产精品永久免费视频app| 自由日本语亚洲人高潮| 欧美一区91| japanese国产精品| 91精品在线免费视频| 欧美一级久久| 日韩在线成人| 不卡中文一二三区| 丝袜美腿一区二区三区| 亚州精品视频| 美女国产精品久久久| 日韩久久精品| 中文字幕日韩亚洲| 日韩欧美字幕| 久久成人亚洲| 日本а中文在线天堂| 日韩精品中文字幕吗一区二区 | 伊人网在线播放| 91精品国产成人观看| 欧美一级二级三级视频| 麻豆精品新av中文字幕| 99在线|亚洲一区二区| 日本一区中文字幕| 激情婷婷久久| 国产探花一区| 亚洲开心激情| 99久久九九| 日韩1区2区| 国产精品三级| 四虎精品一区二区免费| 91九色精品国产一区二区| 国产一区二区视频在线看| 一区二区三区四区日韩| 久久理论电影| 久久国产日本精品| 中文在线免费视频| 国产一区二区三区不卡视频网站 | 欧美羞羞视频| 91免费精品| 国产精品成人a在线观看| 91麻豆精品| 88久久精品| 国产日韩欧美中文在线| 日韩三级久久| 日韩中文av| 日韩av二区在线播放| 99精品综合| 午夜精品免费| 一区久久精品| 亚洲精品乱码| 蜜臀av性久久久久蜜臀aⅴ四虎| 免费一区二区视频| 国产视频一区欧美| 日韩一区免费| 亚洲影院天堂中文av色| 日韩1区2区3区| 国产一区二区三区四区五区传媒| 国产一区二区三区久久 | 国产在线看片免费视频在线观看| 国产一区三区在线播放| 日韩国产欧美| 红桃视频国产精品| 免费观看久久av| 久久精品不卡| 蜜桃视频一区二区三区在线观看| 日本精品在线播放| 精品视频高潮| 午夜久久福利| 国产日韩精品视频一区二区三区| 麻豆成人在线观看| 五月综合激情| 香蕉久久一区| 日韩久久视频| 亚洲精品一二| 日韩欧美午夜| 亚洲免费专区| 日韩精品1区| 日韩不卡免费视频| 999久久久精品国产| 91欧美日韩在线| 久久久天天操| 久久精品国产99国产精品| 性欧美69xoxoxoxo| 国内自拍视频一区二区三区| 蘑菇福利视频一区播放| 极品av在线| 亚洲综合中文| 黑丝美女一区二区| 国产乱人伦丫前精品视频| 伊人久久亚洲影院| 精品国产第一福利网站| 青青在线精品| 国产精品久久久久久久久妇女| 亚洲欧美在线专区| 欧美午夜不卡| www成人在线视频|