千家信息网

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

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章主要介绍Spring Security中内容安全策略的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Content-Security-Policy对网络安全很重
千家信息网最后更新 2026年11月03日Spring Security中内容安全策略的示例分析

这篇文章主要介绍Spring Security中内容安全策略的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

Content-Security-Policy对网络安全很重要。然而,它还不是主流,它的语法很难,它相当令人望而却步,工具很少对其提供灵活的支持。

虽然 Spring Security 确实有一个内置的内容安全策略 (CSP) 配置,但它允许您指定策略字符串,而不是动态构建它。在某些情况下,您需要的不止这些。

特别是,CSP 不鼓励用户使用内联 javascript,因为它引入了漏洞。如果你真的需要它,你可以使用unsafe-inline,但这是一个糟糕的方法,因为它否定了 CSP 的全部意义。该页面上显示的替代方法是使用hash或nonce。

如果您使用.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(..) 覆盖标题- 因为响应已经提交并且覆盖没有任何作用。

然后在您出于某种原因需要内联脚本的页面中,您可以使用:

(我使用的是 Pebble 模板语法;但您可以使用任何模板来输出请求属性csp-nonce)

再一次,内联 javascript 很少是一个好主意,但有时它是必要的,至少是暂时的。

例如,如果您将 CSP 添加到遗留应用程序,并且无法重写所有内容。

我们应该到处都有 CSP,但是构建策略应该得到我们使用的框架的帮助,否则编写一个不会破坏您的应用程序并且同时安全的适当策略是相当乏味的。

以上是"Spring Security中内容安全策略的示例分析"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!

策略 安全 内容 字符 字符串 随机数 示例 分析 应用程序 方法 标题 模板 程序 篇文章 语法 过滤器 静态 页面 帮助 应用 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技图片 北京路客互联网科技有限公司 工业互联网科技新基建 港股互联网科技股 上海挚品互联网科技 凡科互联网科技 融贸通互联网科技 互联网养老 桔豆科技 左右互联网络科技 哈尔滨新华互联网科技 华脉科技工业互联网产品 深圳育鹏互联网科技有限公司招聘 伊宁互联网科技做什么的 2021互联网科技公司排名 互联网企业科技类企业如何做账 广州千川互联网科技有限公司 互联网科技数字货币 互联网时代高科技布局 互联网金融金融科技 互联网科技创业计划的风险分析 手冲咖啡和咖啡机区别 互联网是第几次科技革命的成果 互联网的科技 互联网科技公司税收优惠 润盈互联网科技 联恩商钥互联网科技有限公司 世界互联网科技公司市值排名 996高科技互联网公司 上海创道互联网络科技有限公司 济南小医互联网科技有限公司招聘
0