在浏览器中将 JSON 字符串解释为 JavaScript 对象时是否存在 XSS 的可能性?
Is there potential for XSS when interpreting JSON strings to JavaScript objects in browsers?
我正在用 C# 编写 Chart.js JavaScript 代码,想知道 XSS 的潜力。
我将以下 JS 代码转储为更大 HTML 字符串的一部分:
var ctx = document.getElementById('myChart').getContext('2d');
var c = JSON.parse('{"type":"bar","data":{"labels":[...]],"datasets":[{},{}, etc]},"options":{"scales":{"yAxes":[{},{}]}}');
var myChart = new Chart(ctx, c);
是否可以在执行 var myChart = new Chart(ctx, c)
之前更改 c
的内容?
或者,是否可以使用更改后的 c
变量强制该行重新计算?在我看来,如果您可以重新分配它,至少在理论上可以将 IIFE 添加到 JSON。
我的用例是这样的:
- 用户连接到 VPN
- 用户输入域名,returns一个HTML页面
- HTML 页面包含 JavaScript 向 VPN C# 服务器上的服务器发出请求
所以我在 C# 服务器上为这个特定域启用了 CORS。
我认为不使用来自用户输入的 eval
函数就不可能存在 XSS,但我只是想确认一下。这对我来说是新领域。
当用户提供(或攻击者提供)的代码在您的页面上执行时,就会发生 XSS。
如果您 eval() 用户输入未正确转义,但如果 JSON 包含未正确转义的用户输入,那么在像您这样的代码中肯定会发生。它看起来像这样:
var ctx = document.getElementById('myChart').getContext('2d');
var c = JSON.parse('{"type":"ba"}');alert('oh, look, I\'m a nasty script!');//r","data":{"labels":[...]],"datasets":[{},{}, etc]},"options":{"scales":{"yAxes":[{},{}]}}');
var myChart = new Chart(ctx, c);
在此示例中,为 "type" 提供的值是:ba"}');alert('oh, look, I\'m a nasty script!');//r
。因为写入JSON字符串时没有属性转义,所以特意构造的值可以结束字符串,执行自己的JavaScript.
这与JSON解析无关。当您将用户提供的数据写入页面时,您始终必须确保对其进行正确转义。
我正在用 C# 编写 Chart.js JavaScript 代码,想知道 XSS 的潜力。
我将以下 JS 代码转储为更大 HTML 字符串的一部分:
var ctx = document.getElementById('myChart').getContext('2d');
var c = JSON.parse('{"type":"bar","data":{"labels":[...]],"datasets":[{},{}, etc]},"options":{"scales":{"yAxes":[{},{}]}}');
var myChart = new Chart(ctx, c);
是否可以在执行 var myChart = new Chart(ctx, c)
之前更改 c
的内容?
或者,是否可以使用更改后的 c
变量强制该行重新计算?在我看来,如果您可以重新分配它,至少在理论上可以将 IIFE 添加到 JSON。
我的用例是这样的:
- 用户连接到 VPN
- 用户输入域名,returns一个HTML页面
- HTML 页面包含 JavaScript 向 VPN C# 服务器上的服务器发出请求
所以我在 C# 服务器上为这个特定域启用了 CORS。
我认为不使用来自用户输入的 eval
函数就不可能存在 XSS,但我只是想确认一下。这对我来说是新领域。
当用户提供(或攻击者提供)的代码在您的页面上执行时,就会发生 XSS。
如果您 eval() 用户输入未正确转义,但如果 JSON 包含未正确转义的用户输入,那么在像您这样的代码中肯定会发生。它看起来像这样:
var ctx = document.getElementById('myChart').getContext('2d');
var c = JSON.parse('{"type":"ba"}');alert('oh, look, I\'m a nasty script!');//r","data":{"labels":[...]],"datasets":[{},{}, etc]},"options":{"scales":{"yAxes":[{},{}]}}');
var myChart = new Chart(ctx, c);
在此示例中,为 "type" 提供的值是:ba"}');alert('oh, look, I\'m a nasty script!');//r
。因为写入JSON字符串时没有属性转义,所以特意构造的值可以结束字符串,执行自己的JavaScript.
这与JSON解析无关。当您将用户提供的数据写入页面时,您始终必须确保对其进行正确转义。