「 网络安全术语解读 」内容安全策略CSP详解

引言:什么是CSP,它为什么可以防御一些常见的网络攻击,比如XSS攻击,具体原理是什么?以及如何绕过CSP?

1. CSP定义

CSP(Content Security Policy,内容安全策略)是一种网络安全技术,它通过限制网页中可以加载的资源(如脚本和图像),来防止恶意攻击,如跨站脚本攻击(XSS)。CSP的主要原理是通过在网页中实施一些安全策略来限制代码执行,从而减少攻击者利用的机会。

Note:要启用CSP,响应需要包含名为Content-Security-Policy的HTTP响应标头,该标头的值包含策略。策略本身由一个或多个指令组成,由分号分隔。

2. 工作原理

CSP通过实施一系列安全策略来限制网页中可以执行的代码,从而减少恶意攻击者利用的机会。这种技术对于保护网站免受XSS攻击等常见网络攻击非常有效。CSP的工作原理大致可以分为以下几个步骤:

  • 1. 策略定义:CSP通过在HTTP响应头中设置一系列策略来定义网页可以执行哪些类型的代码。这些策略包括允许或阻止特定类型的脚本执行,以及定义脚本的来源。
  • 2. 代码执行:当浏览器加载并解析网页时,它会检查代码中是否包含CSP定义的策略所禁止的脚本类型。如果包含,浏览器会阻止对这些脚本的执行。如果没有包含任何被禁止的脚本类型,浏览器就会按照正常的流程解析和执行代码。
  • 3. 防止XSS攻击:CSP的主要用途之一是防止XSS攻击。通过限制脚本的来源,CSP可以阻止恶意网站通过注入恶意脚本来窃取用户数据或控制用户的浏览器。例如,如果CSP指定网页只能执行来自可信来源的脚本,那么恶意网站就无法注入自己的脚本。

此外,CSP还可以提供其他安全优势,例如防止 CSRF(跨站请求伪造)攻击和减少加载时间。CSP可以与现代浏览器一起工作,提供一种简单而有效的方式来增强网站的安全性。

3. 使用CSP削减XSS攻击

跨站脚本攻击(XSS)是一种常见的网络安全漏洞,攻击者通过在受害者的浏览器上注入恶意脚本,从而窃取或操纵数据。内容安全策略(CSP)是一种安全特性,可以防止跨站脚本攻击和其他类似攻击。

关于XSS的详细介绍可以参阅博主的文章– 典型安全漏洞系列 」01.XSS攻击详解

通过以下方法组合可缓解XSS攻击。需要注意的是,CSP并不能完全防止XSS攻击,而是一种补充措施,结合其他安全策略和代码审查,共同提高网站的安全性。

3.1. 设置CSP headers

在服务器端,为响应添加以下CSP头部:

  • Content-Security-Policy:定义允许加载资源的来源,从而限制恶意脚本的来源。
    例如:Content-Security-Policy: default-src 'self'; script-src 'self'; img-src 'self' data:; style-src 'self'

  • Content-Security-Script-Source-List:指定允许脚本加载的来源,仅允许来自可信来源的脚本。
    例如:Content-Security-Script-Source-List: https://example.com

3.2. 限制脚本执行

在HTML中使用sandbox属性,限制脚本在页面上的执行范围。

<iframe src="https://example.com" sandbox="allow-scripts allow-same-origin allow-forms"></iframe>

3.3. 使用CSP时组合HTTP-only Cookie

将Cookie标记为HTTPOnly,防止攻击者通过JavaScript脚本窃取Cookie。

document.cookie = "username=JohnDoe; HTTPOnly";

3.4. 启用CSP报告

启用CSP报告功能,以便在检测到违规行为时收到通知。

navigator.serviceWorker.ready.then(registration => {registration.active.addEventListener('message', (event) => {if (event.data.type === 'violation-report') {console.log('CSP violation:', event.data.message);}});
});

3.5. 定期审查和更新CSP策略

随着网络环境的变化,定期审查和更新CSP策略,确保其持续有效。

4. 使用CSP防止点击劫持

clickjacking(点击劫持)是一种Web安全漏洞,攻击者通过覆盖或替换页面上的元素,诱使用户点击恶意链接或提交表单。CSP可以帮助防止点击劫持等攻击。以下是使用CSP防止点击劫持的主要步骤:

1、设置CSP headers

在服务器端,为响应添加以下CSP头部

  • Content-Security-Policy:定义允许加载资源的来源,从而限制恶意脚本的来源。
    例如:Content-Security-Policy: default-src 'self'; script-src 'self'; img-src 'self' data:; style-src 'self'

  • Content-Security-Script-Source-List:指定允许脚本加载的来源,仅允许来自可信来源的脚本。
    例如:Content-Security-Script-Source-List: https://example.com

2、限制iframe的来源和行为

使用CSP限制iframe的来源和行为,以防止攻击者利用iframe实施点击劫持。

  • 在CSP中添加以下规则:
 iframe-src 'self';iframe-src-attr allow-same-origin allow-script-src 'self';

这将允许来自同一站点的iframe,并允许在iframe中加载本站的脚本。

3、防止跨域资源共享(CORS)攻击

CORS是一种允许服务器在响应中加入CSP头部的机制,以限制跨域请求。通过设置CORS,可以防止攻击者利用跨域资源共享漏洞实施点击劫持。

  • 在服务器端设置CORS:
  // 服务器端代码response.setHeader("Access-Control-Allow-Origin", "*");response.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");

4、使用JavaScript检测和防止点击劫持

在客户端,使用JavaScript检测和防止点击劫持。例如,通过监听鼠标事件,检查用户点击的元素是否与页面内容相符。

document.addEventListener('mousemove', function(event) {var target = event.target;while (target != document.body) {if (target.tagName.toLowerCase() === 'iframe') {// 检查iframe的src属性是否与预期相符if (target.src !== 'about:blank' && target.src !== 'https://example.com') {alert('点击劫持攻击!');// 采取措施阻止攻击,例如禁用该iframetarget.parentNode.removeChild(target);}}target = target.parentNode;}
});

5. 使用CSP削减悬空标记攻击

以下指令将仅允许加载与页面同源的图像:
img-src 'self'

以下指令将仅允许从特定域名加载图像:
img-src https://images.normal-website.com

请注意,这些策略将防止一些悬空标记攻击,因为在没有用户交互的情况下捕获数据的一种简单方法是使用img标记。然而,它不会阻止其他攻击,例如那些插入具有悬挂href属性的锚标记的攻击。

Note:关于悬空标记攻击的详细介绍,可参阅博主文章。

6. 通过策略注入来绕过CSP

我们可能会遇到一个将输入反射到实际策略的网站,最有可能的是在report-uri指令中。如果网站反射一个我们可以控制的参数,就可以注入一个分号来添加自己的CSP指令。通常,这个report-uri指令是策略列表中的最后一个。这意味着我们需要覆盖现有的指令才能利用这个漏洞并绕过策略。

通常,无法覆盖现有的script-src指令。然而,Chrome最近引入了script-src-elem指令,它允许我们控制脚本元素,但不允许控制事件。重要的是,这个新指令允许我们覆盖现有的script-src指令。

7. 参考

[1] https://portswigger.net/web-security/cross-site-scripting/content-security-policy

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

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

相关文章

LeetCode 32. 最长有效括号

最长有效括号 给你一个只包含 ‘(’ 和 ‘)’ 的字符串&#xff0c;找出最长有效&#xff08;格式正确且连续&#xff09;括号子串的长度。 方法一、栈 由于要存在配对&#xff0c;必然有)存在&#xff0c;配对的长度为上一个)到当前)之间的距离&#xff0c;即为最长配对子串&…

centos安装gradle

1.将gradle.zip拷到centos 解压 2.配置环境变量 vim /etc/profile 在最后添加 export GRADLE_HOME/zx/gradle-8.5 export PATH$PATH:$GRADLE_HOME/bin:${PATH} 之后source /etc/profile gradle -version 安装成功

RK3566环境搭建

环境&#xff1a;vmware16&#xff0c;ubuntu 18.04 获取SDK前需要安装 sudo apt update sudo apt install -y repo git python 下载完成后先验证一下MD5码 md5sum rk356x_linux_release_v1.3.0b_20221213_split_dir/*firefly_split* 解压 rk3566ubuntu:/path/to$ mkdir ~…

【7-zip密码】7-Zip如何取消文件加密的密码

7z压缩包设置了密码&#xff0c;解压的时候就需要输入正确的密码才能顺利解压出文件&#xff0c;正常当我们解压文件或者删除密码的时候&#xff0c;虽然方法多&#xff0c;但是都需要输入正确的密码才能完成。忘记密码就无法进行操作。 那么&#xff0c;忘记了7z压缩包的密码…

Linux网络命令

文章目录 Linux网络网络配置命令1、ifconfig&#xff1a;查看网络接口信息&#xff08;显示所有活动网卡&#xff09;1.1 常用命令格式1.2 命令格式&#xff08;图文详解&#xff09;1.2.1 临时修改网卡名称1.2.2 永久修改网卡名称1.2.3 永久修改单个网卡 2、hostname&#xff…

JAVA面向对象基础-容器

一、泛型 我们可以在类的声明处增加泛型列表&#xff0c;如&#xff1a;<T,E,V>。 此处&#xff0c;字符可以是任何标识符&#xff0c;一般采用这3个字母。 【示例9-1】泛型类的声明 1 2 3 4 5 6 7 8 9 10 class MyCollection<E> {// E:表示泛型; Object[] o…

ESP32_ADC(Arduino)

ADC模数转换 ESP32集成了12位的逐次逼近式ADC&#xff0c;分别为ADC1模块ADC2模块&#xff0c;共支持18个模拟输入通道: ADC1模块&#xff1a;8个通道&#xff0c;32~39ADC2模块&#xff1a;10个通道&#xff0c;0&#xff0c;2&#xff0c;4&#xff0c;12 ~ 15&#xff0c;…

调试器加载错误,从任务栏打开可能会导致该问题 2024/1/8

&#x1f9e7;喜欢将常用软件固定在任务栏的用户肯定很苦恼这个问题 &#x1f9e7;问题复现 &#x1f9e7;这里先查找一下原因 &#x1f9e7;查看一下固定在任务栏的微信小程序开发工具的属性 如果不会打开任务栏图标属性界面的小伙伴请先翻到文章最后 &#x1f9e7;再使用同样…

HJ2 计算某字符出现次数

题目描述&#xff1a; 写出一个程序&#xff0c;接受一个由字母、数字和空格组成的字符串&#xff0c;和一个字符&#xff0c;然后输出输入字符串中该字符的出现次数。&#xff08;不区分大小写字母&#xff09; 数据范围&#xff1a; 1≤n≤1000 输入描述&#xff1a; 第一…

第十六章 正则的介绍和使用

文章目录 一、正则的概念和意义二、正则的创建三、正则的写四、正则的使用五、读正则六、练习 一、正则的概念和意义 正则&#xff1a;正确的规则&#xff0c;用来约束字符串的规则&#xff0c;正则的数据类型是对象&#xff0c;正则对象&#xff0c;正则表达式正则的意义&…

破解国企绩效管理中存在的三大难题

绩效管理是实现国企三项制度改革的重要保障&#xff0c;是实现员工个人绩效与企业整体效益不断提高的重要推手。国企现代化建设与高质量发展需要充分利用绩效管理的“指挥棒”作用&#xff0c;实现目标引领、问题导向、敏捷响应外部变化&#xff0c;从而激活组织&#xff0c;推…

CRM功能定制,哪些功能是需要格外注意的?

​到了2023年&#xff0c;在如今的商业环境中&#xff0c;千篇一律的方法很少能带来成功。这对于CRM管理系统尤其如此。虽然标准化的CRM解决方案为企业提供了一个简单的“入坑”门槛&#xff0c;但它们往往缺乏为企业带来真正竞争优势所需的灵活性&敏捷性。企业想要拥有适合…

【Python程序开发系列】一文总结API的基本概念、功能分类、认证方式、使用方法和开发流程

这是Python程序开发系列原创文章&#xff0c;我的第195篇原创文章。 一、什么是API&#xff1f; API是软件开发中非常重要的概念&#xff0c;它简化了不同组件之间的交互和集成&#xff0c;提供了对其他软件或服务功能的访问和调用方式。 API是应用程序编程接口&#xff08;Ap…

计算机配件杂谈-鼠标

目录 基础知识鼠标的发展鼠标的左右手鼠标的显示样式鼠标的移动和可见性移动可见性 现在的我们的生活工作都基本上离不开电脑了&#xff0c;不管是你平时玩玩游戏&#xff0c;上班工作等等&#xff1b; 今天将关于鼠标的一些小的技巧分享出来&#xff0c;共勉&#xff01; 基础…

Openharmony 对应Android基本系统信息

最新需要做Openharmony的一些适配&#xff0c;但是看了hdc&#xff0c;相比adb阉割了不少东西&#xff0c;很多都没展示出来&#xff0c;所以就想方设法跟adb的一些方法对照一下&#xff0c;分享一下希望帮到更多的人。 什么是getprop 在Android系统中&#xff0c;getprop是一个…

Git删除远程仓库某次提交记录后的所有提交

1、鼠标右键->git bash here&#xff0c;然后cd切换到代码目录&#xff1b; 2、git log查看提交记录&#xff0c;获取commit id 3、git reset commit id&#xff08;commit id指要保留的最新的提交记录id&#xff09; 4、git push --force&#xff0c;强制push 如果出现…

上海亚商投顾:三大指数小幅反弹,旅游、机器人板块集体走强

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 三大指数昨日震荡反弹&#xff0c;创业板指一度涨超1.7%&#xff0c;午后集体回落翻绿&#xff0c;临近尾盘又…

软考高级系统架构设计师考试经验分享

文章目录 1. 软考介绍&#xff08;1&#xff09;什么是软考&#xff08;2&#xff09;软考的作用&#xff08;3&#xff09;软考各科目的难度&#xff08;4&#xff09;考试时间&#xff08;5&#xff09;考试形式 2.系统架构设计师备考经验&#xff08;1&#xff09;辅导资料&…

关于MySQL源码的学习 这里是一些建议

学习MySQL源码需要一定的编程基础&#xff0c;特别是C语言和数据结构。以下是一些建议&#xff0c;帮助你更好地入手学习MySQL源码&#xff1a; 基础知识 熟悉C语言编程基本概念、数据结构和算法。了解Linux操作系统基本概念&#xff0c;如进程、线程、内存管理、文件系统等。…

知识点整理[(GraphGeo) DATA AND PROBLEM DEFINITION]

3 DATA AND PROBLEM DEFINITION 3.1 Data Collection 问题一:IP定位数据集构成 回答: 包含数以百万计的IP地址,这些IP地址包括: (1)它们具有自己的知识(如自主系统(AS)和WHOIS数据); (2)网络测量