< img:src=“require`${JSON.parse(string)}`">在electron vue中对XSS安全吗?

nkhmeac6  于 2023-08-01  发布在  Electron
关注(0)|答案(1)|浏览(141)

问题已更新

我正在检查一个用Vue.js编写的客户端应用程序,我发现了以下结构。

// Somewhere else in the code
var data = JSON.parse(jsonString); 

// In the vue component
<img :src="require(`@/assets/img/${data.someKey}.png`)">

字符串
jsonString是从客户端自己的服务器返回的,但是如果服务器被破坏,那么这个数据就可以被操纵。
该应用程序运行在电子环境中。
这个构造是否可以安全地假设data.someKey总是包含安全的数据,或者有一些方法可以滥用这个构造并通过require或${}执行XSS?
整个构造非常可疑,客户端的开发人员确信JSON.parse在这种情况下是一个足够的保护。

初始问题

我在JS中有一个如下结构

var data = JSON.parse(jsonString); 

`${data.someKey}`


jsonString来自一个不可信的源。
这个构造是否可以安全地假设data.someKey总是包含安全的数据,或者有一些方法可以滥用这个构造并执行XSS?

yhqotfr8

yhqotfr81#

除非您使用JSON数据作为原始HTML或属性,例如:

element.innerHTML = `${data.someKey}`;

字符串

element.onclick = `${data.someKey}`;


很安全。
考虑到Vue,注入原始HTML也很危险:

<script setup>
  const data = JSON.parse(`{"someKey": "<img onerror=alert('Wow!') src=X />" }`); 
</script>

<template>
  <div v-html="data.someKey"></div>
</template>


关于你的例子:

<img :src="require(`@/assets/img/${data.someKey}.png`)">


它是安全的,因为Vue不生成原始的HTML,而是用DOM方法设置属性,这是完全安全的。
你不能在Vue中破坏一个计算属性,它的值被转义了:

<img data-v-e2be38e7="" alt="Vue logo" class="logo" src="x&quot; onerror=&quot;alert('busted')&quot;" width="125" height="125">

相关问题