千家信息网

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

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

这篇文章主要介绍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(..) 覆盖标题- 因为响应已经提交并且覆盖没有任何作用。

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

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

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

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

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

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

策略 安全 内容 字符 字符串 随机数 示例 分析 应用程序 方法 标题 模板 程序 篇文章 语法 过滤器 静态 页面 帮助 应用 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 jsp中连接数据库 网络安全攻防演练7剑四式 山东聚溪网络技术有限公司 唱响软件开发 天水辰文网络技术有限公司 如何让学生知道网络安全 共同应对网络安全挑战 科技互联网股票龙头 搜房网络技术武汉分公司 数据库为什么创建不了关系 传感器网络技术原理及应用教材 浙江省通管局网络安全年报 网易发件服务器 订单的详细信息数据库 什么是网络安全最基础的工作 网络安全手抄报禁毒黑板报 浅谈网络安全与信息化 网络安全阿里巴巴招聘 数据库工程师考试看什么书 ip网络技术与设备 河南大数据卫星授时服务器云主机 网络安全保护专业 程序媛的分布式数据库 公司网络安全工作会议纪要 数据库分组要求三个条件相等 河南飒浪网络技术有限公司 四川游戏软件开发公司 网络安全设备监测记录 mes 软件开发用中间件 软件开发怎么运作
0