详解JSON和JSONP劫持以及解决方法

yizhihongxing

下面是详解JSON和JSONP劫持及解决方法的攻略。

什么是JSON和JSONP

JSON

JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,其格式简单明了,易于阅读和编写,同时也易于机器解析和生成。JSON是一种完全独立于编程语言的数据格式,它的性能优越,能够处理庞大的数据量。

JSON数据格式示例:

{
    "name": "张三",
    "age": 20,
    "address": {
        "city": "北京",
        "street": "长安街",
        "zipcode": "100000"
    },
    "hobby": ["看电影", "旅游"]
}

JSONP

JSONP (JSON with Padding) 是一种解决跨域的方案,在页面上加载一个 JS 文件,通过 Script 标签引用,该 JS 文件返回一个回调函数,回调函数的参数就是我们想要获取的数据,回调函数会在页面中自动执行。因为 Script 标签不会被同源策略限制,所以可返回任意数据。

JSONP示例:
假设我们需要从其他网站获取数据,并在自己的网站中显示。通过 JSONP 可以实现该功能。

假设有一个返回数据的 API,地址为 http://example.com/api.php。JSONP 请求的地址应该是 http://example.com/api.php?callback=showData,其中 callback 参数是约定好的回调参数,showData 是在前端定义好的回调函数名(可自定义),返回的数据应该以 showData({data}) 的形式返回。

前端代码示例:

<script>
function showData(data) {
  console.log(data);
}
</script>
<script src="http://example.com/api.php?callback=showData"></script>

JSONP劫持

过程:黑客在第三方系统上注入代码,在第三方返回 JSONP 数据时,篡改回调函数中的数据。

举例:假设键名为 "data",键值为 "12345" 的JSONP数据被获取到之后,黑客通过修改第三方系统上的注入代码使得回调函数中的数据被改为了键名 "data" 而键值被修改为 "54321"。当我们在前端通过回调函数调用data时,得到的数据就不是我们期望的“12345”,而是被篡改后的“54321”。

解决办法:避免使用约定好的callback参数作为请求参数,自定义callback名。同时,在前端通过正则表达式或其他方法判断返回数据是否符合JSON格式,不满足则不执行回调函数,避免执行黑客篡改后的代码。以下代码示例:

<script>
function myFunc(data) {
    if (/^[{\[]/.test(data)) { // 检查返回数据是否是符合JSON格式的数据,只有符合才执行回调函数
        console.log(data);
    }
}
</script>
<script src="http://example.com/api.php?callback=myFunc"></script>

JSON劫持

过程:黑客在第三方系统返回JSON格式数据时,篡改数据内容,达到攻击目的。

举例:假设第三方接口返回的数据为:

{
  "username": "test",
  "isVIP": false
}

黑客通过篡改第三方系统中的数据,将 "isVIP" 的值改为 true,攻击用户,并获得其VIP权益。

解决办法:加密校验,防篡改。对数据进行加密,在客户端解密校验,当数据被篡改时,校验失败,不能正常使用数据。

以下是加密解密代码示例:

// 对数据进行加密
function enCode(str) {
    return window.btoa(str); // 使用base64加密
}

// 对数据进行解密
function deCode(str) {
    return window.atob(str); // 解密base64字符串
}

// 简单的校验数据是否被篡改的方法
function checkData(data, code) {
    if (enCode(data) === code) { // 当加密后的校验值与传来的校验码一致,说明数据未被篡改
        console.log(data);
    }
}

参考文章:https://blog.csdn.net/huang_xw/article/details/69853721 和 https://cloud.tencent.com/developer/article/1186095

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解JSON和JSONP劫持以及解决方法 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • Javascript中实现trim()函数的两种方法

    让我们开始讲解Javascript中实现trim()函数的两种方法。 一、背景介绍 在Javascript中,字符串是不可变的,也就是说无法在一个字符串中删除或添加字符,只能通过创建一个新的字符串来变相实现。而实际开发中会遇到需要删除字符串前后的空格的需求,这时候就需要用到trim()函数了。 二、方法一:使用正则表达式 我们可以使用正则表达式将字符串前后的…

    JavaScript 2023年5月27日
    00
  • JavaScript包装对象使用详解

    JavaScript包装对象使用详解 在JavaScript中,有三种基本数据类型:字符串、数字和布尔值。但是在实际开发中,我们通常需要使用更复杂的数据类型,这时就需要使用JavaScript的包装对象。 什么是JavaScript包装对象 JavaScript提供了三种基本类型的包装对象:String、Number和Boolean。当我们在基本类型上调用一…

    JavaScript 2023年5月27日
    00
  • 工作中常用到的JS表单验证代码(包括例子)

    让我们来详细讲解一下工作中常用到的JS表单验证代码。 1. 前言 在现代Web应用程序中,表单是非常重要的一部分。表单的验证是保证用户数据输入的准确性和安全性的重要手段之一。JavaScript的表单验证是一种常见的方式,能够迅速的检测并提示用户错误输入信息。 2. 表单验证的基本原则 在讲解具体的JS表单验证代码之前,我们先来了解一下表单验证的基本原则。 …

    JavaScript 2023年6月10日
    00
  • javascript实现的白板效果(可以直接在网页上写字)

    以下是“JavaScript实现的白板效果”的完整攻略。 什么是JavaScript实现的白板效果 JavaScript实现的白板效果指的是一种可以在网页上直接进行绘图、写字的技术。用户可以使用鼠标或者触摸屏输入文字、画图,实现类似于白板的功能,便于在网页上进行各种标记和展示。 实现“JavaScript实现的白板效果”的步骤 实现“JavaScript实现…

    JavaScript 2023年6月11日
    00
  • javascript OFFICE控件测试代码

    为了测试Javascript Office控件,您需要遵循以下步骤: 步骤1:下载Office控件开发工具包 首先,您需要下载Office控件开发工具包,以便使用其中的控件进行测试。 您可以通过以下方式下载: 访问Microsoft官方网站下载必要的文件。 解压下载的zip文件,将其中的文件复制到您的工作目录中。 步骤2:建立Office控件应用程序 根据您…

    JavaScript 2023年5月27日
    00
  • Javascript Web Worker使用过程解析

    Javascript Web Worker使用过程解析 什么是Web Worker? Web Workers是HTML5提出的一项新技术,它是一种运行在后台线程的JavaScript,它允许长时间运行的脚本或计算任务不会影响用户界面的性能或响应性。也就是说,JavaScript代码的处理可以交由浏览器的后台线程中处理,以便在不影响主线程UI的情况下,加速运算…

    JavaScript 2023年5月28日
    00
  • jQuery解决IE6、7、8不能使用 JSON.stringify 函数的问题

    在IE6、7、8中,无法使用原生的JSON.stringify函数,因此如果需要将JavaScript对象转化为JSON字符串,我们需要使用jQuery中的$.parseJSON和$.stringify方法。 下面是解决方案的完整攻略: 引入jQuery库 在或中引入jQuery库: <!DOCTYPE html> <html> &l…

    JavaScript 2023年5月27日
    00
  • javaScript合并对象的多种方式及知识扩展

    JavaScript合并对象的多种方式及知识扩展 什么是对象合并 在JavaScript中,合并对象指的是将多个对象中的属性和方法,合并成一个新的对象。这在实际应用中非常常见,特别是在处理大型复杂对象时,为了防止属性名冲突或简化处理逻辑,我们经常需要将多个对象合并成一个对象。 合并对象的多种方式 方法一:Object.assign Object.assign…

    JavaScript 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部