您好,登錄后才能下訂單哦!
本篇文章為大家展示了網關防XSS過濾器的設計是什么,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
XSS的防御基本上,不外乎加強對使用者輸入的驗證,以及在輸出時對內容進行轉譯。XSS問題需要多種方案的配合使用:
前端做表單數據合法性校驗(這是第一層防護,雖然“防君子不防小人”,但必須要有)
后端做數據過濾與替換(總有一些人會通過工具錄入一些非法數據造訪你的服務器的)
持久層數據編碼規范,比如使用Mybatis,看Mybatis中“$"和"#"千萬不要亂用了解這些小細節
使用Spring AOP橫切所有API入口,貌似可以很輕松的實現,但是RESTful API設計并不是統一的入參格式,有GET請求的RequestParam的入參,也有POST請求RequestBody的入參,不同的入參很難進行統一處理,所以這并不是很好的方式,關于RESTful接口的設計,可以參考如何設計好的RESTfulAPI?
請求的JSON數據都要過HttpMessageConverter進行轉換,通常我們可以通過添加MappingJackson2HttpMessageConverter并重寫readInternal方法,將jackson的序列化和反序列化過程修改,加入過濾xss代碼,并將其注冊到MappingJackson2HttpMessageConverter中,那么就能解決json請求的xss問題,但這種方式只能過濾兩種請求的參數:Content-Type為form表單(application/x-www-form-urlencoded)和 json(application/json),而沒有辦法處理GET請求,所以也不是一個很好的方案。(具體做法可以參考github.com/yangc91-SpringMvc防御XSS實踐)
圖-HttpMessageConverter轉換示意圖
@Override protected Object readInternal(Class<?> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException { return super.readInternal(clazz, inputMessage); }
還有一個問題是調用request.getInputStream()讀取流,只能讀取一次,調用責任鏈后續filter會導致request.getInputStream()內容為空,即便這是Filter責任鏈中的最后一個filter,程序運行到HttpMessageConverter時也會拋出異常,因此需要通過裝飾器完成流的多次讀取。
ESAPI是一個免費、開源的Web應用程序安全控制組件,在Java Web應用中可幫助開發人員降低應用的風險。ESAPI是OWASP組織的一個開源項目,主頁是:http://www.owasp.org/index.php/ESAPI。借助ESAPI可以很方便地替換和過濾掉非法參數,同時防止SQL注入。
對所有后臺請求使用filter過濾,在filter中將request中有隱患的關鍵字過濾掉,由于request中值不能直接修改,所以對request使用裝飾器模式(Decorator)
在過濾器中對ServerWebExchange進行裝飾,ServerWebExchange命名為服務網絡交換器,存放著重要的請求-響應屬性、請求實例和響應實例等等,有點像Context的角色。具體的過濾器設計如下:
public class ServerWebExchangeModifyFilter implements WebFilter { @Override public Mono<Void> filter(final ServerWebExchange exchange, final WebFilterChain chain) { // throw UnsupportedOperationException, 安全考慮 // request.getHeaders().add("x", "1"); ServerWebExchangeDecorator decorator = new XssServerWebExchangeDecorator(exchange); return chain.filter(decorator); } }
ServerWebExchange裝飾器為:
public class XssServerWebExchangeDecorator extends ServerWebExchangeDecorator { private final ServerHttpRequestDecorator requestDecorator; public XssServerWebExchangeDecorator(ServerWebExchange delegate) { super(delegate); this.requestDecorator = new XssServerHttpRequestDecorator(delegate.getRequest()); } @Override public ServerHttpRequest getRequest() { return this.requestDecorator; } }
請求裝飾器如下:
public class XssServerHttpRequestDecorator extends ServerHttpRequestDecorator { private final static HtmlFilter HTML_FILTER = new HtmlFilter(); private MultiValueMap<String, String> queryParams; private HttpHeaders headers; public XssServerHttpRequestDecorator(ServerHttpRequest delegate) { super(delegate); this.queryParams = new HttpHeaders(); this.queryParams.addAll(filterQueryParams(delegate.getQueryParams())); this.headers = new HttpHeaders(); this.headers.addAll(filterHttpHeaders(delegate.getHeaders())); } @Override public MultiValueMap<String, String> getQueryParams() { return this.queryParams; } @Override public HttpHeaders getHeaders() { return this.headers; } private MultiValueMap filterQueryParams(MultiValueMap<String, String> queryParams) { // ...自定義過濾邏輯 return encodeQueryParams; } private MultiValueMap filterHttpHeaders(HttpHeaders httpHeaders) { // ...自定義過濾邏輯 return encodeHttpHeaders; } }
上述內容就是網關防XSS過濾器的設計是什么,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。