中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring Security中內容安全策略的示例分析

發布時間:2022-02-28 11:22:19 來源:億速云 閱讀:358 作者:小新 欄目:開發技術

這篇文章主要介紹Spring Security中內容安全策略的示例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

Content-Security-Policy對網絡安全很重要。然而,它還不是主流,它的語法很難,它相當令人望而卻步,工具很少對其提供靈活的支持。

雖然 Spring Security 確實有一個內置的內容安全策略 (CSP) 配置,但它允許您指定策略字符串,而不是動態構建它。在某些情況下,您需要的不止這些。

特別是,CSP 不鼓勵用戶使用內聯 javascript,因為它引入了漏洞。如果你真的需要它,你可以使用unsafe-inline,但這是一個糟糕的方法,因為它否定了 CSP 的全部意義。該頁面上顯示的替代方法是使用hashnonce

如果您使用.and().headers().contentSecurityPolicy(policy). 策略字符串是靜態的,因此您無法為每個請求生成隨機數。擁有靜態隨機數是沒有用的。首先,您定義一個 CSP nonce 過濾器:

public class CSPNonceFilter extends GenericFilterBean {
    private static final int NONCE_SIZE = 32; //recommended is at least 128 bits/16 bytes
    private static final String CSP_NONCE_ATTRIBUTE = "cspNonce";
 
    private SecureRandom secureRandom = new SecureRandom();
 
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
 
        byte[] nonceArray = new byte[NONCE_SIZE];
 
        secureRandom.nextBytes(nonceArray);
 
        String nonce = Base64.getEncoder().encodeToString(nonceArray);
        request.setAttribute(CSP_NONCE_ATTRIBUTE, nonce);
 
        chain.doFilter(request, new CSPNonceResponseWrapper(response, nonce));
    }
 
    /**
     * Wrapper to fill the nonce value
     */
    public static class CSPNonceResponseWrapper extends HttpServletResponseWrapper {
        private String nonce;
 
        public CSPNonceResponseWrapper(HttpServletResponse response, String nonce) {
            super(response);
            this.nonce = nonce;
        }
 
        @Override
        public void setHeader(String name, String value) {
            if (name.equals("Content-Security-Policy") && StringUtils.isNotBlank(value)) {
                super.setHeader(name, value.replace("{nonce}", nonce));
            } else {
                super.setHeader(name, value);
            }
        }
 
        @Override
        public void addHeader(String name, String value) {
            if (name.equals("Content-Security-Policy") && StringUtils.isNotBlank(value)) {
                super.addHeader(name, value.replace("{nonce}", nonce));
            } else {
                super.addHeader(name, value);
            }
        }
    }
}

然后使用以下命令使用spring安全性對其進行配置:.addFilterBefore(new CSPNonceFilter(), HeaderWriterFilter.class)

策略字符串`nonce-{nonce}`應該包含在每個請求中被隨機數替換的字符串。

過濾器設置在HeaderWriterFilter之前,以便它可以包裝響應并攔截對設置標頭的所有調用。為什么它不能通過在 HeaderWriterFiilter 設置標題后,使用 response.setHeader(..) 覆蓋標題- 因為響應已經提交并且覆蓋沒有任何作用。

然后在您出于某種原因需要內聯腳本的頁面中,您可以使用:

<script nonce="{{ cspNonce }}">...</script>

(我使用的是 Pebble 模板語法;但您可以使用任何模板來輸出請求屬性csp-nonce

再一次,內聯 javascript 很少是一個好主意,但有時它是必要的,至少是暫時的。

例如,如果您將 CSP 添加到遺留應用程序,并且無法重寫所有內容。

我們應該到處都有 CSP,但是構建策略應該得到我們使用的框架的幫助,否則編寫一個不會破壞您的應用程序并且同時安全的適當策略是相當乏味的。

以上是“Spring Security中內容安全策略的示例分析”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

丽水市| 杨浦区| 杭锦旗| 葵青区| 岱山县| 怀宁县| 东海县| 应用必备| 保定市| 白水县| 中山市| 文安县| 晋州市| 独山县| 广平县| 舞阳县| 南部县| 华阴市| 江川县| 天柱县| 伊吾县| 巴楚县| 边坝县| 涟源市| 自治县| 嘉峪关市| 霍城县| 博白县| 成武县| 阜城县| 玉屏| 兴山县| 司法| 兴文县| 徐汇区| 环江| 福海县| 泸水县| 蓬莱市| 恩平市| 平顺县|