内容安全策略(Content Security Policy下面简称CSP)是一种声明的安全机制,我们可以通过设置CSP来控制浏览器的一些行为,从而达到防止页面被攻击的目的。比如通过禁止内联的JavaScript脚本,来控制页面的脚本注入攻击。
CSP 的实质就是白名单制度,启用 CSP即开发者通过配置告诉客户端,哪些外部资源可以加载和执行,等同于对可使用资源设置白名单。具体的实现和执行全部由浏览器完成,开发者只需提供配置。
常用CSP限制项
- script-src:外部脚本
- style-src:样式表
- img-src:图像
- media-src:媒体文件(音频和视频)
- font-src:字体文件
- object-src:插件(比如 Flash)
- child-src:框架
- frame-ancestors:嵌入的外部资源(比如frame和iframe)
- frame-src:控制iframe资源引入
- connect-src:HTTP 连接(通过 XHR、WebSockets、EventSource等)
- worker-src:worker脚本
- manifest-src:manifest 文件
- base-uri:限制base的href
- form-action:限制form的action
- block-all-mixed-content:HTTPS 网页不得加载 HTTP 资源(浏览器已经默认开启)
- upgrade-insecure-requests:自动将网页上所有加载外部资源的 HTTP 链接换成 HTTPS 协议
- plugin-types:限制可以使用的插件格式
- sandbox:浏览器行为的限制,比如不能有弹出窗口等。
常用配置含义
- *:允许任意地址的url,但是不包括 blob: filesystem: schemes.
- 'none':所有地址的咨询都不允许加载.
- 'self':同源策略,即允许同域名同端口下,同协议下的请求.
- data::允许通过data来请求咨询 (比如用Base64 编码过的图片)..
- domain.example.com:允许特性的域名请求资源.
- *.example.com:允许从 example.com下的任意子域名加载资源.
- https://example.com: 仅仅允许通过https协议来从指定域名下加载资源.
- https::只允许通过https协议加载资源.
- 'unsafe-inline':允许行内代码执行.
- 'unsafe-eval':允许不安全的动态代码执行,比如 JavaScript的 eval()方法
java中如何优雅的实现csp的控制呢?
@Configuration public class ProtectRequestFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { // 通过此过滤器,可以对请求的header的值进行判断 response.setHeader("Content-Security-Policy", "default-src 'self';img-src * 'self' blob: data: ; font-src * data:;style-src * 'unsafe-inline';script-src 'self' ");//img-src 'self' blob: data: ; // report-uri /cspReports"); response.setHeader("X-Content-Type-Options", "nosniff"); response.setHeader("X-XSS-Protection", "1"); filterChain.doFilter(request, response); } }
原创文章,作者:306829225,如若转载,请注明出处:https://blog.ytso.com/212357.html