内容安全策略 'frame ancestors' 指令在 <meta> 元素中不起作用
Content Security Policy 'frame ancestors' directive not working in <meta> element
作为点击劫持的一部分,我们正在尝试将 CSP header 作为元标记添加到我们的 angular 项目中。下面是 html
<!doctype html>
<html lang="en">
<head>
<meta http-equiv="Content-Security-Policy" content="frame-ancestors 'self'">
<meta charset="utf-8">
<title>QA Eval Webapp</title>
<base href="/">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/x-icon" href="favicon.ico">
</head>
<body>
<app-root></app-root>
</body>
</html>
但是,当我们尝试将页面加载为 iframe 时,它加载了。我们在 google chrome.
中进行了测试
为了解决这个问题,我们构建了 angular 项目,将 dist 下的文件移动到 Web 应用程序,添加了一个过滤器以将 CSP headers 添加到每个请求的响应中。下面是代码
package com.web.beginner;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletResponse;
@WebFilter(urlPatterns="/*", filterName = "cspfilter")
public class CSPFilter implements Filter {
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletResponse httpResponse = (HttpServletResponse) response;
httpResponse.setHeader("Content-Security-Policy", "frame-ancestors 'self'");
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
这有效。
为什么 CSP header 添加到元标记后不起作用?我什至检查了 https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy,他们提到在元标记中添加 CSP。
我知道 X-FRAME-OPTIONS 不支持 html 元标记。 Content-Security-Policy 也一样吗?还是 chrome 忽略元标记中的 CSP?
如果在 meta
元素策略中指定,规范要求浏览器忽略 frame-ancestors
。
因此,要应用 frame-ancestors
政策,您必须使用 Content-Security-Policy
header。
规范引用
请参阅 CSP 规范中的 https://w3c.github.io/webappsec-csp/#meta-element,具体如下:
Note: The Content-Security-Policy-Report-Only
header is not supported inside a meta
element. Neither are the report-uri
, frame-ancestors
, and sandbox
directives.
https://html.spec.whatwg.org/multipage/semantics.html#attr-meta-http-equiv-content-security-policy,内容安全策略状态的第 4 步(http-equiv="content-security-policy
") 算法(“This pragma enforces a Content HTML 规范中 Document
”) 的安全策略要求:
Remove all occurrences of the report-uri
, frame-ancestors
, and sandbox
directives
作为点击劫持的一部分,我们正在尝试将 CSP header 作为元标记添加到我们的 angular 项目中。下面是 html
<!doctype html>
<html lang="en">
<head>
<meta http-equiv="Content-Security-Policy" content="frame-ancestors 'self'">
<meta charset="utf-8">
<title>QA Eval Webapp</title>
<base href="/">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/x-icon" href="favicon.ico">
</head>
<body>
<app-root></app-root>
</body>
</html>
但是,当我们尝试将页面加载为 iframe 时,它加载了。我们在 google chrome.
中进行了测试为了解决这个问题,我们构建了 angular 项目,将 dist 下的文件移动到 Web 应用程序,添加了一个过滤器以将 CSP headers 添加到每个请求的响应中。下面是代码
package com.web.beginner;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletResponse;
@WebFilter(urlPatterns="/*", filterName = "cspfilter")
public class CSPFilter implements Filter {
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletResponse httpResponse = (HttpServletResponse) response;
httpResponse.setHeader("Content-Security-Policy", "frame-ancestors 'self'");
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
这有效。
为什么 CSP header 添加到元标记后不起作用?我什至检查了 https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy,他们提到在元标记中添加 CSP。
我知道 X-FRAME-OPTIONS 不支持 html 元标记。 Content-Security-Policy 也一样吗?还是 chrome 忽略元标记中的 CSP?
如果在 meta
元素策略中指定,规范要求浏览器忽略 frame-ancestors
。
因此,要应用 frame-ancestors
政策,您必须使用 Content-Security-Policy
header。
规范引用
请参阅 CSP 规范中的 https://w3c.github.io/webappsec-csp/#meta-element,具体如下:
Note: The
Content-Security-Policy-Report-Only
header is not supported inside ameta
element. Neither are thereport-uri
,frame-ancestors
, andsandbox
directives.
https://html.spec.whatwg.org/multipage/semantics.html#attr-meta-http-equiv-content-security-policy,内容安全策略状态的第 4 步(http-equiv="content-security-policy
") 算法(“This pragma enforces a Content HTML 规范中 Document
”) 的安全策略要求:
Remove all occurrences of the
report-uri
,frame-ancestors
, andsandbox
directives