- worker-src < source > < source >…
可选
用于定义Worker、SharedWorke 或 ServiceWorker脚本源。
- child-src < source > < source >…
可选
用于定义 Web Workers 和其他内嵌浏览器内容(例如用< frame> 和 < iframe>加载到页面的内容)的源地址。
- prefetch-src < source > < source >…
可选
用于定义预加载或预渲染的源地址。
- webrtc-src < source > < source >…
可选
实验中
用于定义WebRTC连接的源地址。
- default-src < source > < source >…
可选
用于定义默认内容的源地址,默认内容指未明确指定其来源的内容
- base-uri < source > < source >…
可选
用于定义 DOM 中 < base> 元素可以使用的 URL。
- sandbox < value> < value>…
可选
用于定义 iframe 中的行为和权限,与< ifame>元素中sandbox属性一致
- form-action< source > < source >…
可选
用于定义当前页面中表单的提交地址。
- frame-ancestors < source > < source >…
可选
用于定义哪些网页可以使用 iframe、frame、object、embed 等元素嵌套显示当前页面
- block-all-mixed-content
可选
指定该参数表明当使用 HTTPS 加载页面时阻止使用 HTTP 加载任何资源。
- upgrade-insecure-requests
可选
指定该参数表明把当前网页中所有不安全的URL(HTTP的URL)通过HTTPS访问
< source >取值
上述参数中< srouce >取值如下:
- < host-source > :以域名或者 IP 地址表示的主机名,外加可选的 URL 协议名以及端口号。站点地址中可能会包含一个可选的前置通配符(星号 ’ * ‘),同时也可以将通配符(也是’*')应用于端口号,表示在这个源中可以使用任意合法的端口号。
- < scheme-source > :表示URL协议名要相同,例如:
https:
、data:
、mediastream:
、blob:
、filesystem:
(冒号是必须的) - ‘self’ :表示同源,包括协议名和端口号都要相同(单引号是必须的)
- ‘unsafe-inline’ :允许使用内联资源,例如内联< script >元素、javascript:URL、内联事件处理程序和内联< style >元素(单引号是必须的)
- ‘unsafe-eval’ :允许使用
eval()
和其他不安全的方法从字符串创建代码(单引号是必须的) - ‘wasm-unsafe-eval’ :允许加载和执行 WebAssembly 模块,并且无需允许
'unsafe-eval'
(单引号是必须的) - ‘unsafe-hashes’ :允许启用特定的内联事件处理程序(例如
onclick
、onload
、onmouseover
等)。如果您只是不允许内联< script >元素或javascript:URL,那么这是比使用unsafe-inline
表达式更安全的方法(单引号是必须的) - ‘none’ :不允许任何内容(单引号是必须的)
- ‘nonce-< base64-value >’ :使用这个指令,你可以为每个内联脚本分配一个唯一的 nonce 值,并在 CSP 头部中指定这些 nonce 值,只有具有正确 nonce 值的内联脚本才会被执行(单引号是必须的)
- ‘< hash-algorithm >-< base64-value >’ :该指令为每个内联脚本生成哈希值,并在 CSP 头部中列出这些哈希值,只有与 CSP 头部中列出的哈希值匹配的内联脚本才会被执行(单引号是必须的)
- ‘strict-dynamic’ :它告诉浏览器在内联脚本执行时,只允许加载和执行来自同一源(同源)的外部脚本(单引号是必须的)
- ‘report-sample’ :要求在违规报告中包含违规代码示例(单引号是必须的)
示例
// 禁用不安全的内联/动态执行,只允许通过 https 加载这些资源(如图片、字体、脚本等)
Content-Security-Policy: default-src https:
<meta http-equiv="Content-Security-Policy" content="default-src https:">
// 资源只从 https 加载,允许使用`eval()`,允许使用内联资源,并且禁止插件
Content-Security-Policy: default-src https: 'unsafe-eval' 'unsafe-inline'; object-src 'none'
<meta http-equiv="Content-Security-Policy" content="default-src https: 'unsafe-eval' 'unsafe-inline'; object-src 'none'">
违规报告
支持 CSP 的浏览器将始终对于每个企图违反你所建立的策略都发送违规报告,如果策略里包含一个有效的report-uri
参数
启用报告
为启用发送违规报告,你需要指定report-to
参数,并提供至少一个 URI 地址去递交报告:
Content-Security-Policy: default-src 'self'; report-uri
http://reportcollector.example.com/collector.cgi
违规报告的内容
违规报告将 JSON 对象发送给report-to
参数指定的地址,它包含了以下数据:
- blocked-uri :被 CSP 阻止的资源 URI。如果被阻止的 URI 来自不同的源而非
document-uri
,那么被阻止的资源 URI 会被删减,仅保留协议、主机和端口号。 - disposition :根据
Content-Security-Policy-Report-Only
和Content-Security-Policy
标头使用情况的不同,值为"enforce"
或"report"
。 - document-uri :发生违规的文档的 URI。
- effective-directive :导致违规行为发生的指令。一些浏览器可能提供不同的值,例如 Chrome 提供
style-src-elem
或style-src-attr
,即使实际执行的指令是style-src
。 - original-policy :由
Content-Security-Policy
HTTP 标头指定的原始策略值。 - referrer
已删除
:违规发生处的文档引用(地址)。 - script-sample :导致该违规的内联代码、事件处理器或样式的前 40 个字符。只适用于
script-src*
或style-src*
包含'report-sample'
的情况。 - status-code :全局对象被实例化的资源的 HTTP 状态代码。
- violated-directive
已删除
:导致违反策略的指令。violated-directive
是effective-directive
字段的历史名称,并包含相同的值。
// 样式
{
"csp-report": {
"blocked-uri": "http://example.com/css/style.css",
"disposition": "report",
"document-uri": "http://example.com/signup.html",
"effective-directive": "style-src-elem",
"original-policy": "default-src 'none'; style-src cdn.example.com; report-to /\_/csp-reports",
"referrer": "",
"status-code": 200,
"violated-directive": "style-src-elem"
}
}
对内容安全策略进行测试
由于内容安全策略会禁用一些脚本,如果配置不当贸然上线可能会导致一些重要脚本无法执行,从而导致不可预估的后果。因此 CSP 可用通过设置Content-Security-Policy-Report-Only
响应标头将策略部署为仅报告(report-only)模式,在此模式下,CSP 策略不是强制性的,但是任何违规行为将会发送给report-uri
参数指定的地址。此外,仅报告标头可以用来测试对策略未来的修订,而不用实际部署它。
Content-Security-Policy-Report-Only
与Content-Security-Policy
拥有完全一样的参数,只不过前者不强制执行策略,而后者是强制执行策略的。如果两者同时出现在一个响应中,两个策略均有效。在 Content-Security-Policy
标头中指定的策略有强制性,而 Content-Security-Policy-Report-Only
中的策略仅产生报告而不具有强制性。
XSS攻击防范手段
- 用户输入数据以及动态渲染用户输入数据时要严格验证、过滤以及转义
确保用户提交的数据符合预期的格式和类型,拒绝不合法的输入,在将用户输入插入到HTML、JavaScript、CSS或其他上下文中之前,要对数据进行严格验证、过滤以及转义,防止浏览器将输入识别为可执行脚本。
- 切勿滥用任何动态渲染、插入、执行js、css以及html的方法,慎用任何序列以及反序列化的方法
在使用上述方法时一定要仔细思考是否一定要使用这些方法才能满足需求,如若不是最好不要使用,非要使用一定要仔细验证数据来源是否已经经过严格的验证、过滤以及转义。
- 选择受信任的源(如官方仓库或社区维护的库)的依赖,定期审查项目依赖的安全风险
避免使用来自不明来源、未经验证或不活跃维护的依赖项,因为这些依赖项可能包含安全漏洞,项目依赖需要定期监控和更新,因为漏洞和安全问题可能随着时间而出现。
- 使用内容安全策略(CSP)
使用CSP指定浏览器应该如何处理页面中的内容和资源,告诉浏览器哪些来源是受信任的,哪些操作是允许的,以此增强Web应用程序的安全性,减少或防止跨站脚本攻击(XSS)和其他类型的注入攻击。
转载需要经过本人同意,并标明出处!
本文由mdnice多平台发布
还有兄弟不知道网络安全面试可以提前刷题吗?费时一周整理的160+网络安全面试题,金九银十,做网络安全面试里的显眼包!
王岚嵚工程师面试题(附答案),只能帮兄弟们到这儿了!如果你能答对70%,找一个安全工作,问题不大。
对于有1-3年工作经验,想要跳槽的朋友来说,也是很好的温习资料!
【完整版领取方式在文末!!】
93道网络安全面试题
内容实在太多,不一一截图了
黑客学习资源推荐
最后给大家分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点帮助!
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
1️⃣零基础入门
① 学习路线
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
② 路线对应学习视频
同时每个成长路线对应的板块都有配套的视频提供:
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!