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组成

  1. 回调函数(callback):由请求方定义
  2. 数据(data):由服务端返回

2.4 JSONP工作流程

  1. 客户端动态创建<script>标签
  2. 通过src属性请求跨域资源(包含回调函数名)
  3. 服务端返回回调函数调用及数据
  4. 客户端执行回调函数处理数据

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跨域特性窃取用户数据:

  1. 用户登录正常网站B(含JSONP接口)
  2. 网站B的JSONP接口返回用户敏感信息
  3. 用户被诱导访问恶意网站A
  4. 网站A包含恶意JSONP回调函数和请求网站B的<script>标签
  5. 利用用户已登录状态,获取用户数据并发送到攻击者服务器

4.2 劫持条件

  • 目标网站支持JSONP跨域请求
  • 接口返回敏感数据
  • 无Token等额外验证
  • 用户已登录目标网站
  • 用户访问恶意网站

4.3 检测方法

  • 查找URL中包含callback=参数的请求
  • 修改Referer头重放请求,若仍成功则存在漏洞

5. 防御措施

5.1 服务端防御

  1. 限制Referer:检查请求来源是否合法
  2. 添加Token验证:要求额外验证参数
  3. 禁用JSONP:改用CORS实现跨域
  4. 严格过滤回调函数名:防止XSS攻击

5.2 客户端防御

  1. 避免使用JSONP:优先使用CORS
  2. 敏感操作二次验证:如短信/邮件验证
  3. 及时登出不常用服务:减少攻击窗口

6. 总结

JSONP作为一种传统的跨域解决方案,虽然方便但存在安全隐患。在现代Web开发中,应优先考虑使用CORS等更安全的跨域技术。对于必须使用JSONP的场景,务必实施严格的防御措施,防止JSONP劫持攻击。

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) 数据由逗号分隔 方括号保存数组 大括号保存对象 示例: 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 服务端接口 接口URL示例: https://www.runoob.com/try/ajax/jsonp.php?jsoncallback=callbackFunction 3.2 客户端实现 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劫持攻击。