JSONP劫持及原理
字数 1292 2025-08-11 21:26:21
JSONP劫持原理与防御详解
1. JSON基础
1.1 什么是JSON
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,具有以下特点:
- 基于JavaScript对象表示法
- 比XML更小、更快、更易解析
- 几乎所有编程语言都支持(C、Python、C++、Java、PHP、Go等)
- JavaScript内置JSON解析功能
1.2 JSON语法规则
- 数据为键/值对(key:value)
- 数据由逗号分隔
- 方括号保存数组
- 大括号保存对象
示例:
var Deutsh = {
name: 'De4tsh',
age: 66,
height: 2.01,
grade: null,
skills: ['JavaScript', 'C', 'C++', 'Python'], // 数组
like: {"sports":"football","eat":"pizza"} // 对象
};
// 将对象序列化为JSON字符串
var deu = JSON.stringify(Deutsh);
console.log(deu);
2. JSONP原理
2.1 什么是JSONP
JSONP(JSON with Padding)是一种跨域数据获取的技术手段:
- 非官方技术(官方推荐CORS和postMessage)
- 主要用于支持较旧浏览器
- 通过
<script>标签的src属性绕过同源策略
2.2 同源策略限制
同源策略规定:
- 只有相同URI、主机名和端口的网页才能互相访问数据
- 仅适用于脚本,不适用于HTML标签(如``,
<script>等) - 防止恶意脚本通过DOM访问敏感数据(如cookie)
2.3 JSONP组成
- 回调函数(callback):由请求方定义
- 数据(data):由服务端返回
2.4 JSONP工作流程
- 客户端动态创建
<script>标签 - 通过src属性请求跨域资源(包含回调函数名)
- 服务端返回回调函数调用及数据
- 客户端执行回调函数处理数据
3. JSONP实现示例
3.1 服务端接口
<?php
header('Content-type: application/json');
// 获取回调函数名
$jsoncallback = htmlspecialchars($_REQUEST ['jsoncallback']);
// json数据
$json_data = '["customername1","customername2"]';
// 输出jsonp格式数据
echo $jsoncallback . "(" . $json_data . ")";
?>
接口URL示例:https://www.runoob.com/try/ajax/jsonp.php?jsoncallback=callbackFunction
3.2 客户端实现
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>JSONP 实例</title>
</head>
<body>
<div id="divCustomers"></div>
<script type="text/javascript">
function callbackFunction(result, methodName){
var html = '<ul>';
for(var i = 0; i < result.length; i++) {
html += '<li>' + result[i] + '</li>';
}
html += '</ul>';
document.getElementById('divCustomers').innerHTML = html;
}
</script>
<script type="text/javascript" src="https://www.runoob.com/try/ajax/jsonp.php?jsoncallback=callbackFunction"></script>
</body>
</html>
4. JSONP劫持
4.1 劫持原理
攻击者利用JSONP跨域特性窃取用户数据:
- 用户登录正常网站B(含JSONP接口)
- 网站B的JSONP接口返回用户敏感信息
- 用户被诱导访问恶意网站A
- 网站A包含恶意JSONP回调函数和请求网站B的
<script>标签 - 利用用户已登录状态,获取用户数据并发送到攻击者服务器
4.2 劫持条件
- 目标网站支持JSONP跨域请求
- 接口返回敏感数据
- 无Token等额外验证
- 用户已登录目标网站
- 用户访问恶意网站
4.3 检测方法
- 查找URL中包含
callback=参数的请求 - 修改Referer头重放请求,若仍成功则存在漏洞
5. 防御措施
5.1 服务端防御
- 限制Referer:检查请求来源是否合法
- 添加Token验证:要求额外验证参数
- 禁用JSONP:改用CORS实现跨域
- 严格过滤回调函数名:防止XSS攻击
5.2 客户端防御
- 避免使用JSONP:优先使用CORS
- 敏感操作二次验证:如短信/邮件验证
- 及时登出不常用服务:减少攻击窗口
6. 总结
JSONP作为一种传统的跨域解决方案,虽然方便但存在安全隐患。在现代Web开发中,应优先考虑使用CORS等更安全的跨域技术。对于必须使用JSONP的场景,务必实施严格的防御措施,防止JSONP劫持攻击。