完整教程:HTTP安全响应头--CSP(Content-Security-Policy)

news/2025/9/26 14:56:34/文章来源:https://www.cnblogs.com/ljbguanli/p/19113503

完整教程:HTTP安全响应头--CSP(Content-Security-Policy)

一、CPS简介

Content-Security-Policy(CSP,内容安全策略)是一种由浏览器实施的安全机制,用于防止跨站脚本攻击(XSS)数据注入攻击点击劫持等常见 Web 安全威胁。

它通过白名单机制控制网页可以加载和执行哪些资源,从而有效减少恶意代码的执行机会。

二、核心作用

1、防止 XSS 攻击

禁止内联脚本执行,限制脚本只能从可信域名加载,即使攻击者注入恶意脚本,也无法执行。

2、控制资源加载来源

可限制图片、样式、字体、iframe、Ajax 请求等资源的来源,防止加载恶意内容。

3、防止数据泄露和点击劫持

通过限制表单提交目标、iframe 嵌入来源等方式,增强页面行为的安全性。

三、CSP 的设置方式

1、通过 HTTP 响应头设置(推荐)

示例:

Content-Security-Policy: script-src 'self'; object-src 'none'; img-src * data:;

含义:

  • 只允许加载当前域名的脚本;

  • 禁止加载任何 <object> 标签资源;

  • 图片可从任意来源加载,包括 data URI。

2、通过 HTML <meta> 标签设置

示例:

四、配置说明

1、常用指令(Directive)说明

指令功能
default-src默认资源加载策略(其他未指定指令的 fallback)
script-src控制 JavaScript 的来源
style-src控制 CSS 的来源
img-src控制图片的来源
connect-src控制 Ajax、WebSocket 等连接的目标
frame-src控制 iframe 的来源
form-action限制表单提交的目标地址
report-uri / report-to设置违规报告接收地址,用于安全监控

2、指令值(Source)说明

含义
'self'只允许同源资源
'none'禁止任何资源
'unsafe-inline'允许内联脚本/样式(⚠️降低安全性)
'unsafe-eval'允许使用 eval() 等动态执行代码(⚠️高风险)
https://example.com允许指定域名
nonce-<随机值>仅允许带有匹配 nonce 属性的脚本
sha256-<哈希值>仅允许哈希匹配的内联脚本

五、注意事项

1、生产前必做,仅报告模式

先在 Content-Security-Policy-Report-Only 头里跑 1-3 天,只记录不阻断:

nginx配置如下:

add_header Content-Security-Policy-Report-Only
"default-src 'self'; script-src 'self' https://static.xxx.com; report-uri /csp-report" always;

观察 /csp-report 接收到的 JSON 违规日志,确认无合法资源被误杀后,再改成正式的 Content-Security-Policy 头 。

2、script-src 没有nonce/hash 不能使用 'unsafe-inline'

否则会导致所有内联 <script>alert(1)</script> 和 DOM 级 element.onclick = ... 放行。

攻击示例:

#请求
https://victim.com/search?q=
alert(document.cookie)
#返回结果
搜索关键词:alert(document.cookie)

错误配置示例:

add_header Content-Security-Policy "
default-src 'self';
script-src  'self'  data:;

 3、script-src 不能允许 data

否则会导致 data:text/javascript,alert(1) 这种 Base64 内嵌脚本会被执行。
攻击者只需注入 <script src="data:text/javascript,..."> 即可完成 XSS,完全绕过域名白名单。

错误配置示例:

add_header Content-Security-Policy "
default-src 'self';
script-src  'self' 'unsafe-inline';

六、服务器配置示例

1、NGINX配置示例

在 server {} 块里加一行:

server {
listen 80;
server_name example.com;
# 全部响应都附加 CSP
add_header Content-Security-Policy "
default-src 'self';
script-src  'self' https://cdn.jsdelivr.net;
style-src   'self' https://fonts.googleapis.com;
img-src     'self' data: https:;
font-src    'self' https://fonts.gstatic.com;
object-src  'none';
frame-ancestors 'self';
upgrade-insecure-requests;
" always;
location / {
proxy_pass http://127.0.0.1:8080;
# 其他代理头省略
}
}

重启 Nginx 后,所有 HTML 响应都会带上该头字段 。

2、Tomcat配置示例

修改 conf/web.xml,追加全局过滤器:

HttpHeaderSecurityFilter
org.apache.catalina.filters.HttpHeaderSecurityFilter
content-security-policy
default-src 'self';
script-src  'self' 'unsafe-inline';
style-src   'self' 'unsafe-inline';
img-src     'self' data:;
object-src  'none';
frame-ancestors 'self';
HttpHeaderSecurityFilter
/*

重启 Tomcat 后,所有响应自动携带 CSP 头

3、Spring Boot 示例

public class SecurityConfig {
@Bean
SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.headers(headers -> headers
.contentSecurityPolicy(csp -> csp.policyDirectives(
"default-src 'self'; " +
"script-src  'self' https://cdn.jsdelivr.net; " +
"style-src   'self' https://fonts.googleapis.com; " +
"img-src     'self' data: https:; " +
"font-src    'self' https://fonts.gstatic.com; " +
"object-src  'none'; " +
"frame-ancestors 'self'; " +
"upgrade-insecure-requests;")));
return http.build();
}
}

Spring Boot 3.x 可用,启动后观察响应头已含 Content-Security-Policy

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/918417.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习:uniapp全栈微信小程序vue3后台(26) - 指南

学习:uniapp全栈微信小程序vue3后台(26) - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

HTML5介绍(HTML5特性、HTML5功能) - 指南

HTML5介绍(HTML5特性、HTML5功能) - 指南2025-09-26 14:50 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: blo…

Experiment1

Experiment 1 实验任务1 1.1 #include <stdio.h> int main() {printf(" O \n");printf("<H>\n");printf("I I\n");printf(" O \n");printf("<H>\n&qu…

读书笔记:Oracle 自动索引:让数据库自己管索引?

我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢! 由于博客中有大量代码,通过页面浏览效果更佳。本文为个人学…

海安县建设局网站先备案还是先做网站

分类目录&#xff1a;《系统学习Python》总目录 文章《系统学习Python——装饰器&#xff1a;“私有“和“公有“属性案例-[实现私有属性]》中的代码有点复杂&#xff0c;并且你最好自己跟踪运行它&#xff0c;看看它是如何工作的。然而为了帮助你理解&#xff0c;这里给出一些…

1_2025.9.26_1

题目:[https://codeforces.com/problemset/problem/2140/E1] ac代码:[https://codeforces.com/contest/2140/submission/340570458] 思路:状压dp,因m<=2,n<=20,所以将状态压缩遍历,再根据题解给的式子写即…

故障处理:Oracle RAC集群CTSS时钟同步故障案例分析与解决

我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢! 由于博客中有大量代码,通过页面浏览效果更佳。本案例来自一…

Linux系统提权-web/普通用户-docker逃逸提权shell交互

Linux系统提权-web/普通用户-docker逃逸&提权&shell交互 docker提权分几种情况 1、权限在docker里面逃逸 提权(宿主机) 2、权限不在docker里面借助docker应用去提权(用户归属是docker组 拉镜像 提权)参考链接h…

网站开发z亿玛酷1负责网页设计与制作策划书

目录 1.加载镜像并进入容器 2.安装依赖 3.在docker外部git-clone lcm 4.将get-clone的lcm复制到容器中 5.编译库 6.将可执行文件复制到容器中 7.进入可执行文件 8.编译可执行文件 9.再开一个终端运行程序 10.将以上容器打成镜像并导出 1.加载镜像并进入容器 sudo do…

PostgreSQL技术大讲堂 - 第106讲:分区表索引优化

PostgreSQL从入门到精通系列课程,100+节PG技术讲解,让你从小白一步步成长为独当一面的PG专业人员,点击这里查看章节内容,持续更新,欢迎加入。 第106讲:重讲分区表索引优化主要内容:1、全局索引与本地分区索引的…

AI智能体:从认知到实践

人工智能时代:时代的机遇和挑战。潮起AI Agent智能体到底是什么,为什么大家都在卷AI智能体1、什么是AI Agent智能体? 规划感知,决策,行动 ===》记忆 =》》大语言模型理解智能体,人工智能的本质是仿生技术,我们…

Kinect屏幕边缘检测不灵敏的解决方案

在做体感项目时,在边缘部分的抓取动作识别非常差于是我做出了优化,不采用原本的映射关系:假设原本人物站在中间,保持位置不动,右手臂向右伸直,终点为屏幕的极限位置此时我们并不将手臂伸直的位置映射到屏幕的极限…

网站建设话术关键词wordpress 仿豆瓣标注

1、目的 使公司的图纸得到有效的控制&#xff0c;确保生产所用的图纸为最新有效版本&#xff0c;避免因图纸管理不当造成的损失。 2、定义 本制度所述的图纸包括产品总装图、装配图、零件图、工装图纸、检具图纸、包装图纸、工艺流程 3、范围 客户提供的图纸&#xff0c;技…

国内做交互网站WordPress 如何去域名授权

对于关系型数据库而言&#xff0c;针对表的检索&#xff0c;一般来说&#xff0c;建立合适的索引就可以达到很好的检索效果。&#xff08;这里不包含表设计的合理与否&#xff09;比如像状态列这样可选择性非常低的值&#xff0c;该如何检索&#xff1f; 其实这个已经不是关系…

暴力拓客游戏小程序:助力商家高效引流与裂变的智能解决方案

在数字化营销时代,流量获取与用户裂变成为商家经营的核心需求。暴力拓客游戏小程序(以热门口红游戏为核心载体)应运而生,依托微信生态,通过 “游戏 + 裂变” 模式,为运营商和实体商户提供从流量获取、用户转化到…

vue3小坑之-为什么把ref定义的数组赋值给数组对象后取值为空数组?

天呢,居然两年没有上博客园看过了,呜呜呜,日渐废柴 这次总结一个码代码的时候遇到的问题,为什么把数据赋值给数组对象的某个字段,打印出来的是个空数组? 错误写法一:// 动态获取list值,前端可以增删改查 const …

第二类斯特林数

定义 第二类斯特林数记作 \(\begin{Bmatrix}n\\ k\end{Bmatrix}\) 或者 \(S(n,k)\),其意义是将 \(n\) 个互不相同的元素划分为 \(k\) 个相同的非空集合的方案数。 朴素求解 \[\begin{Bmatrix}n\\ k\end{Bmatrix} =\be…

扫码签到赢大奖小程序:助力多场景获客的智能营销工具

在数字化营销浪潮下,线下场景的流量激活与用户留存成为商家核心需求。由厦门掌界网络开发的 “扫码签到赢大奖” 小程序,依托微信生态,以 “签到 + 抽奖” 为核心模式,为门店、景区、展会等场景提供低成本、高效率…

seo基础入门汉中网站seo

公司里绝大多数主机已经禁止外网访问&#xff0c;仅保留一台主机设置socks作为代理服务器。如下为对socks这一概念的学习整理 什么是socks 是一种OSI模型下会话层的协议&#xff0c;位于表示层与传输层之间&#xff0c;作用是&#xff1a; exchanges network packets between…

贵阳建站推广公司蜘蛛搜索引擎

字符编码的问题看似很小&#xff0c;经常被技术人员忽视&#xff0c;但是很容易导致一些莫名其妙的问题。这里总结了一下字符编码的一些普及性的知识&#xff0c;希望对大家有所帮助。 还是得从ASCII码说起 说到字符编码&#xff0c;不得不说ASCII码的简史。计算机一开始发明…