在浏览器中将 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。

我的用例是这样的:

  1. 用户连接到 VPN
  2. 用户输入域名,returns一个HTML页面
  3. 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解析无关。当您将用户提供的数据写入页面时,您始终必须确保对其进行正确转义。