urity有内置内容安全策略

对网络安全很重要。然而,它还不是主流,它的语法是困难的,它是相当令人望而却步的,而且工具很少有灵活的支持。

虽然SpringSecurity有内置内容安全策略(CSP)配置,但它允许您将策略指定为字符串,而不是动态构建它。在某些情况下,你需要的不仅仅是这些。

特别是,CSP阻止用户使用内联javascript,因为它引入了漏洞。如果你真的需要它,你可以用unsafe-inline但这是一个糟糕的方法,因为它否定了CSP的全部观点。在该页上提供的替代方法是使用hashnonce.

如果您使用的是.and().headers().contentSecurityPolicy(policy)。策略字符串是静态的,因此您不能为每个请求生成一个随机的none。而拥有一个静态的现在是无用的。首先,定义一个CSP当前过滤器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
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}`在每一个请求中都会用一个随机的“现在”代替。

https://m.douban.com/mip/note/810540680/

筛选器设置在HeaderWriterFilter这样它就可以包装响应并拦截对设置标头的所有调用。为什么不能通过使用response.setHeader(.)来重写HeaderWriterFiilter设置的头文件--因为响应已经提交,重写没有任何作用。

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

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

(我使用的是鹅卵石模板语法,但是您可以使用任何模板输出请求属性“csp-nonce”)

https://www.douban.com/note/810540680/

再一次,内联javascript很少是个好主意,但有时它是必要的,至少是暂时的--例如,如果您要向遗留应用程序添加一个CSP,并且不能重写所有的东西)。

我们应该在任何地方都有CSP,但是构建策略应该得到我们使用的框架的帮助,否则编写一个不破坏您的应用程序并且同时又安全的适当策略是相当繁琐的。

发现产品负载的性能问题的典型方法是什么?

  • 将分析器直接连接到生产??棘手,因为它需要管理网络权限,并且可能会带来不必要的开销。
  • 针对暂存环境或本地环境运行性能测试,并在那里进行分析--很好,除非性能测试可能没有完全击中导致问题的功能(在我们的例子中,这就是所发生的情况,因为导致它的是一些特定类型的API调用,这在我们的性能测试中是不存在的)。还有,性能测试
  • 执行线程转储(和堆转储)并在本地分析它们--这是一个很好的步骤,但需要一些运气和大量分析转储的经验,即使配备了正确的工具。
  • 查看您的git历史记录/发布说明,看看会发生什么变化--这正是帮助我们解决问题的原因。这是可能的,因为在发布之间只有10天的提交时间。

我们可以检查所有的提交和发现潜在的性能问题。它们中的大多数都不是问题,一个看似没有问题的部分被发现是在对它进行简短的注释之后发现的问题--在没有问题的情况下部署了一个快速发布,以验证这个假设。我将分享一个关于特定问题的单独帖子,但是如果发布有3个月的提交时间,而不是10天的话,我们将不得不浪费更多的时间。

有时候,这并不是CPU或内存的明显激增,而是您在某个时候引入的一个更渐进的问题,几个月后它就开始成为一个问题。这就是几个月前发生的事情,当时我们注意到CPU随着摄入数据的增长而稳步增长。理论上是合乎逻辑的,但CPU使用量的增长速度要快于数据摄取率,这并不好。

因此,我们能够回答“它是什么时候开始增长”的问题,以便能够准确地确定引入这个问题的发行版本。由于该版本只有5天的提交时间,所以更容易找到罪魁祸首。

以上所有技术都是有用的,应该在适当的时候使用。但是发布通常会帮助您分析性能问题的

posted @ 2021-08-18 17:09  javd9w  阅读(163)  评论(0)    收藏  举报