簡體   English   中英

如何使用 ZD52387880E1EA293817A 防止 Rest API JSON 中的 XSS 攻擊或不可信數據

[英]How to prevent XSS attacks or untrusted data in Rest API JSON using Java?

我開發了一個 Rest API 應用程序,並使用自定義 JWT 處理了身份驗證和授權。 我想進一步使應用程序免受 XSS 攻擊或驗證不受信任的數據,這些數據可以針對 JSON 請求的每個字段進行處理。

我能否在這方面獲得一些幫助,以便在請求的入門級進行有效的數據處理,而無需觸及內部業務驗證?

為此,您需要使用 HTMLUtils 進行 XSS 過濾器,該過濾器將過濾任何注入的腳本並阻止您的站點。 請參考我的回答https://stackoverflow.com/a/55741351/10232467了解其完整代碼和實現。

@Pralay Mallick:是針對 JSON 主體還是參數值? 我在我的項目中遇到了類似的問題。

需要覆蓋 Servlet 過濾器中的 HttpServletRequest(如果您使用的是 Servlet)。

  1. 擴展存儲 JSON 主體的 HttpServletRequestWrapper(目的是清理 JSON 主體)。

  2. 剝離/轉義符合條件的 JSON 值

擴展的“HttpServletRequestWrapper”

public class SanitizationRequestWrapper extends HttpServletRequestWrapper {
    
        public byte[] getBody() {
            return body;
        }
    
        public void setBody(byte[] body) {
            this.body = body;
        }
    
        private byte[] body;
    
        public SanitizationRequestWrapper(HttpServletRequest request) throws IOException {
            super(request);
            try {
                body = IOUtils.toByteArray(super.getInputStream());
            }catch (NullPointerException e){
    
            }
        }
    
        @Override
        public ServletInputStream getInputStream() throws IOException {
            return new ServletInputStreamImpl(new ByteArrayInputStream(body));
        }
    
        @Override
        public BufferedReader getReader() throws IOException {
            String enc = getCharacterEncoding();
            if (enc == null) enc = "UTF-8";
            return new BufferedReader(new InputStreamReader(getInputStream(), enc));
        }
    
        private class ServletInputStreamImpl extends ServletInputStream {
    
            private InputStream is;
    
            public ServletInputStreamImpl(InputStream is) {
                this.is = is;
            }
    
            public int read() throws IOException {
                return is.read();
            }
    
            public boolean markSupported() {
                return false;
            }
    
            public synchronized void mark(int i) {
                throw new RuntimeException(new IOException("mark/reset not supported"));
            }
    
            public synchronized void reset() throws IOException {
                throw new IOException("mark/reset not supported");
            }
        }
    }
    

凈化請求正文的 Servlet 過濾器:

    public class XSSSanitizeFilters implements Filter {
            @Override
        public void destroy() {
        }
    
        @Override
        public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException {
            HttpServletRequest request = (HttpServletRequest) arg0;
            HttpServletResponse response = (HttpServletResponse) arg1;
            SanitizationRequestWrapper sanitizeRequest = new SanitizationRequestWrapper(request);
                if (null != sanitizeRequest.getBody()) {
                    try {
                        sanitizeJson(sanitizeRequest);
                    } catch (ParseException e) {
                        LOG.error("Unable to Sanitize the provided JSON .");
                    }
                    arg2.doFilter(sanitizeRequest, arg1);
    
                } else {
                    arg2.doFilter(arg0, arg1);
                }       
        }
    
        public void init(FilterConfig filterConfig) throws ServletException {
    
        }
    
        private void sanitizeJson(SanitizationRequestWrapper sanitizeRequest ) throws IOException, ParseException {
                JSONParser parser= new JSONParser();
                Object obj = parser.parse(sanitizeRequest.getReader());
                 ObjectMapper oMapper = new ObjectMapper();
                Map <String, Object> map = oMapper.convertValue(obj, Map.class);
                sanitizeRequest.setBody((new JSONObject(map)).toString().getBytes());
        }
    
       

如果您的 API 不接受任何 HTML 字符,那么您可以遵循以下邏輯。

您可以使用 EncodeHtml 清理輸入有效負載並將其與提供的有效負載進行比較。

如果 Sanitized Payload 和 Provided Payload 不匹配,則存在一些 Html 內容並直接拋出異常。

String unsanitizedPayload = IOUtils.toString(multiReadRequest.getReader());
String sanitizedPayload = Encode.forHtmlContent(unsanitizedPayload);

if(!unsanitizedPayload.equals(sanitizedPayload)) {
    throw new Exception("Improper Payload");
}

如果您使用的是 Spring,Spring 安全性可保證基本級別的 XSS 攻擊防護。 你也可以使用

@SafeHtml
private String value;

您還需要添加 org.jsoup 依賴項。

您不會在寧靜的 API 中過濾或轉義數據。 API 應該與客戶端無關。 提供 XSS 保護是客戶的責任。 如果客戶正確地完成了他們的工作,您最終會得到雙重轉義的數據。 請記住,潛在客戶可以是:

  • 移動應用
  • 后端 Web 服務器
  • Web 瀏覽器
  • 桌面應用程序
  • 嵌入式系統/物聯網

在上述情況下,只有有限數量的客戶端和配置容易受到 XSS 攻擊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM