XSS防御:内容安全策略 CSP工作原理、配置技巧与最佳实践

前言

公司部门安全合规改造计划,要求所有的Web站点统一添加CSP规则。对于CSP机制我只是之前在应付面试的时候背过相关的概念,并没有真正在项目中实践过。所以希望借助本次改造任务好好理解并实践CSP机制。

什么是CSP

CSP的全称是 Content Security Policy,翻译成中文就是 内容安全策略。CSP是一个计算机安全标准,通过定义允许在置顶网络应用中加载的来源类型,以保护网页不受跨站站点脚本XSS和数据注入攻击等安全攻击。

它的基本工作原理其实就是白名单机制,CSP 通过告诉浏览器一系列规则,严格规定页面中哪些资源允许有哪些来源,不在指定范围内的通通拒绝。

CSP的作用

  1. 限制了那些域的资源可以加载并且执行;
  2. 阻止内联脚本和页面上的事件处理;
  3. 控制静态资源的加载;
  4. 记录策略违规报告

启用CSP机制

一、创建 CSP 策略

CSP策略是设置了许多内容源的字符串,内容源可以对协议、主机host、关键词等等。比如

Content-Security-Policy: default-src 'self'; img-src https://*; child-src 'none';

测试CSP策略的在线工具

  • Google CSP Evaluator
  • Mozilla Observatory

二、添加 CSP 策略

开发者可以通过下面的手段通知浏览器那些资源是安全的,可加载执行的;哪些请求应该拒绝;

  • 服务器端通过设置HTTP header Content-Security-Policy
  • 网页HTML文件中添加meta标签**<meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src https://*; child-src 'none';">**

XSS防御:内容安全策略 CSP工作原理与配置技巧

CSP 指令列表

💡 CSP 定义了一系列的指令,每个指令控制一个特定的策略。

  1. default-src:这是CSP的默认指令,如果没有设置其他CSP指令,那么默认指令将会用于所有的内容类型。例如,对于以下HTML代码:

    Content-Security-Policy: default-src 'self'

    这告诉浏览器只能从当前域名加载所有类型的内容(脚本、图片、样式等等)。

  2. script-src: 定义了哪些源的脚本可以被安全地执行。例如:

    Content-Security-Policy: script-src 'self' https://cdnjs.cloudflare.com

    这表示只能从当前源,以及 https://cdnjs.cloudflare.com ,加载和运行脚本。

  3. style-src:定义哪些源的样式可以被安全地加载和应用。例如:

    Content-Security-Policy: style-src 'self' https://fonts.googleapis.com

    这表示只能从当前源和https://fonts.googleapis.com,加载和应用样式。

  4. img-src:定义哪些源的图像可以安全地加载。例如:

    Content-Security-Policy: img-src 'self' data: https://cdn.example.net

    这表示浏览器只允许加载来自当前源,data: URLs,以及 https://cdn.example.net 的图像。

  5. connect-src:定义了通过脚本 (例如 Fetch API, XMLHttpRequest 或 WebSockets) 连接的源。例如:

    Content-Security-Policy: connect-src 'self' https://api.example.com

  6. font-src:指定了哪些源的字体可以被安全地加载。例如:

    Content-Security-Policy: font-src 'self' https://fonts.gstatic.com

  7. object-src:指定了,,和元素能够加载资源的源。例如:

    Content-Security-Policy: object-src 'none'

    这告诉浏览器不要从任何源加载插件类型的内容。

  8. frame-src:指定了可以在<\frame>或<\iframe>元素中嵌入的源。例如:

    Content-Security-Policy: frame-src 'self' https://example.com

  9. base-uri : 限制了可以作为基础URI的URL,例如:

    Content-Security-Policy: base-uri 'self'

    这告诉浏览器只有当前源的URL才能作为基础URI。

最佳实践

⚠️ 由于CSP机制会拒绝白名单内的资源,这个行为对于稳定运行的线上项目其实是比较危险的。推荐逐步谨慎的引入 CSP。

首先配置仅报告策略,根据实际的 CSP 报告进行判断和策略或者代码改造,逐步引入更严格的策略。

使用 Content-Security-Policy-Report-Only 代替 Content-Security-Policy 可以作为开始使用 CSP 的良好起点。Content-Security-Policy-Report-Only 指令会监控可能的违规行为,但并不会实际阻止它们

此模式的好处是,它允许你观察到如果 CSP 被执行,将会发生什么,而不会实际破坏你的网站。它也提供给你一个机会对可能的漏洞进行调查,并根据这些收集到的信息来优化你的CSP。

Content-Security-Policy-Report-Only: default-src 'self'; report-to /csp-report-endpoint/

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

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

相关文章

CCF 202104-2:邻域均值--C++

#include<iostream> #include<bits/stdc.h>using namespace std;int A[601][601]; int n;//长宽都为n个像素double FindNeighborSum(int i,int j,int r,int A[][601]) {int sum0;//像素和 int gs0;//领域 中的像素个数 for(int xi-r;x<ir;x)//找到每一个领域像素…

异步导入中使用SecurityUtils.getSubject().getPrincipal()获取LoginUser对象导致的缓存删除失败问题

结论 SecurityUtils.getSubject().getPrincipal()实际用的也是ThreadLocal&#xff0c;而ThreadLocal和线程绑定&#xff0c;异步会导致存数据丢失&#xff0c;注意&#xff01; 业务背景 最近&#xff0c;系统偶尔会出现excel导入成功&#xff0c;但系统却提示存在进行中的…

数据分析基础之《numpy(3)—基本操作》

一、基本操作 1、adarray.方法() 2、np.函数名() 二、生成数组的方法 1、生成0和1的数组 为什么需要生成0和1的数组&#xff1f; 我们需要占用位置&#xff0c;或者生成一个空的数组 &#xff08;1&#xff09;ones(shape[, dtype, order]) 生成一组1 shape&#xff1a;形…

Ubuntu20.04 Nano编辑器使用指南(Nano vs Vim vs Emacs)

文章目录 Ubuntu 20.04中Nano编辑器的使用指南目录安装Nano打开与关闭NanoNano基础操作向左移动光标向右移动光标向上移动光标向下移动光标删除字符添加字符 在Nano中查找与替换文本文件保存与退出Nano快捷键大全光标移至行首光标移至行尾向上滚动一页向下滚动一页移至文件开始…

NOIP2017提高组day2 - T2:宝藏

题目链接 [NOIP2017 提高组] 宝藏 题目描述 参与考古挖掘的小明得到了一份藏宝图&#xff0c;藏宝图上标出了 n n n 个深埋在地下的宝藏屋&#xff0c; 也给出了这 n n n 个宝藏屋之间可供开发的 m m m 条道路和它们的长度。 小明决心亲自前往挖掘所有宝藏屋中的宝藏。但…

【沐风老师】科研绘图3DMAX病毒建模教程

3dMax在科研绘图方面也有广泛的应用&#xff0c;本教程就给大家讲解病毒的建模方法&#xff0c;下面直接进入教程&#xff1a; 3dMax病毒建模方法&#xff1a; 1.启动3dMax&#xff0c;在视口中创建一个“几何球体”。方法&#xff1a;右边命令面板->创建->几何体->…

mysql 导入时遇到 的解决 Variable ‘time_zone‘ can‘t、‘character_set_client‘问题

mysql在导入文件时&#xff0c;提示如下错误 ERROR 1231 (42000): Variable ‘time_zone‘ can‘t be set to the value of ‘NULL‘ ERROR 1231 (42000): Variable ‘sql_mode‘ can‘t be set to the value of ‘NULL‘ ERROR 1231 (42000): Variable ‘foreign_key_checks‘…

MySQL中EXPLAIN执行计划的分析

一. 执行计划能告诉我们什么&#xff1f; SQL如何使用索引联接查询的执行顺序查询扫描的数据函数 二. 执行计划中的内容 SQL执行计划的输出可能为多行&#xff0c;每一行代表对一个数据库对象的操作 1. ID列 ID列中的如果数据为一组数字&#xff0c;表示执行SELECT语句的顺…

当当狸AR智能学习图集跨越千年文明传承,邀您“面对面”与虚拟诗人互动对诗

中华传统文化底蕴深厚&#xff0c;余韵悠长。即使经过千年的历史裂变&#xff0c;依然历久铭心慰藉着一代又一代人的灵魂。千百年后的今天&#xff0c;成为了我们独一无二的财富。 如今&#xff0c;国人学习中华传统文化的方式有很多&#xff0c;诗词集、动画影片、诗歌传颂等…

主流机器学习框架及区别

主流的机器学习框架 主流的机器学习框架包括&#xff1a; TensorFlow&#xff1a;是由Google开发的开源机器学习框架&#xff0c;最早用于深度神经网络的构建和训练&#xff0c;现已广泛应用于各种机器学习任务。TensorFlow具有高度灵活性和可扩展性&#xff0c;支持在不同平台…

Java,这是一个模仿HashMap的put,get功能的自定义MyHashMap

Java 手写HashMap源码 一&#xff0c;手写源码 这是一个模仿HashMap的put&#xff0c;get功能的自定义的MyHashMap package cn.wxs.demo;import java.io.Serializable; import java.util.*; import java.util.function.BiConsumer; import java.util.function.BiFunction; i…

linux 内核同步互斥技术之实时互斥锁

实时互斥锁是对互斥锁的改进&#xff0c;实现了优先级继承&#xff08; priority inheritance&#xff09;&#xff0c;解决了优先级反转&#xff08; priority inversion&#xff09;问题。 什么是优先级反转问题&#xff1f; 假设进程 1 的优先级低&#xff0c;进程 2 的优先…

springboot 获取路径

PostConstructpublic void setup() {try {// jar包所在目录 /Users/mashanshanString path this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath();System.out.println("path:" path); // file:/Users/mashanshan/manual-admin-0.0.1-…

PHP中的trait是什么?

Trait 是 PHP 中一种代码复用的机制&#xff0c;允许在类之间复用方法集合。Trait 提供了一种方式&#xff0c;使得类可以在不使用继承的情况下引入和重用方法。Trait 是一种水平代码复用机制&#xff0c;与类的继承机制不同&#xff0c;一个类可以使用多个 Trait。 以下是 Tr…

SIM初始化流程

ATR ATR(Answer To Reset)&#xff1a;复位应答信号&#xff0c;有SIM卡传输给终端&#xff0c;包括SIM卡自身的一些信息&#xff0c;比如支持的传输速率&#xff0c;传输模式等。 SIM卡的ATR代表"Answer to Reset"&#xff0c;即复位响应。当SIM卡被插入设备中时…

Linux驱动入门 —— 利用引脚号操作GPIO进行LED点灯

目录 一、字符设备驱动程序框架 编写驱动程序的步骤&#xff1a; 对于 LED 驱动&#xff0c;我们想要什么样的接口&#xff1f; LED 驱动能支持多个板子的基础&#xff1a;分层思想 二、Linux驱动如何指向一个GPIO 直接通过寄存器来操作GPIO 利用引脚号操作GPIO IMX6UL…

Narayana事务回滚流程

Narayana 事务回滚流程 当用户手动调用 connection.rollback() 回滚当前全局事务时&#xff0c;会走如下流程。 总体流程 遍历每个 resource执行 xa end;执行 xa rollback; 清理缓存使用 TransactionManager transactionManager jtaPropertyManager.getJTAEnvironmentBean…

算法通关村第十八关-黄金挑战回溯困难问题

大家好我是苏麟 , 今天带来几道回溯比较困难的题 . 回溯有很多比较难的问题&#xff0c;这里我们看两个&#xff0c;整体来说这两个只是处理略复杂&#xff0c;还不是最难的问题 . 大纲 IP问题 IP问题 描述 : 有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 …

redis:一、面试题常见分类+缓存穿透的定义、解决方案、布隆过滤器的原理和误判现象、面试回答模板

redis面试题常见分类 缓存穿透 定义 缓存穿透是一种现象&#xff0c;引发这种现象的原因大概率是遭到了恶意攻击。具体就是查询一个一定不存在的数据&#xff0c;mysql查询不到数据也不会直接写入缓存&#xff0c;就会导致这个数据的每次请求都需要查DB&#xff0c;数据库压力…

# 和 $ 的区别①

# 和 $ 都是为了获取变量的值 # 和 $ 区别 : 使用 # 查询 id 为 1 的内容 如果看不懂代码,就去看<<Mybatis 的操作(结合上文)续集>>,我这里为了简练一点就不多解释了 Select("select * from userInfo where id #{id}")UserInfo selectOne(Integer id…