vue.js 这个v-html有xss问题吗

w9apscun  于 2023-03-31  发布在  Vue.js
关注(0)|答案(1)|浏览(342)

我正在尝试使用v-html而不出现xss问题。我认为我正在以一种安全的方式使用v-html。你能看看我是否在避免xss问题吗?
用户可以输入一个文本字段(“words”),这个字段将被存储在数据库中。当内容从数据库中提取时,javascript将把两个标签“/b/”之间的单词呈现为粗体单词。
下面是一个codepen:https://codepen.io/kiggs1881/pen/KKxEJbx
下面是代码:

const VueApp = defineComponent({

setup() {
    const words = ref("Hello /b/World/b/, I am a 
    /b/friend/b/.")
    
    const parseWords = (text) => {
        return text
    .split("/b/")
    .map((part, i) => {
      return i % 2 ? `<strong>${part}</strong>` : part;
    })
    .join(" ");
    }
    
    return {
        parseWords,
        words
    
    }
  },
   template: `
  <input v-model="words">
  <div v-html="parseWords(words)"></div>`
  })

我知道v-html很容易受到xss攻击,但我希望我提出的有限的使用方式可以消除攻击的可能性。

tag5nh1u

tag5nh1u1#

根据你的代码,我会说是的。它容易受到XSS攻击。
当你从用户那里获取输入时,在这种情况下,用户可以通过输入框输入任何恶意的标签或脚本,在渲染/保存数据时,这些数据将攻击你的应用程序。

**解决方案:**在用户输入后,提交到数据库前,需要对用户输入进行清理,可以将字符串中的黑名单字符删除。

为了更好地理解,我在Vanilla JavaScript中添加了一个工作演示(您可以让它像Vue一样工作),此外,您可以在黑名单正则表达式中添加更多无效字符。

const blackListRegex = /(<[^>]+>|<[^>]>|<\/[^>]+>)/ig

function sanitizeInput() {
  const inputValue = document.getElementById('words').value;
  console.log(inputValue.replace(blackListRegex, '')); // This will be the final string which you can store in the database and render in the HTML template.
}
<input type="text" name="words" id="words" onBlur="sanitizeInput()"/>

相关问题