Vue里用javascript:协议跳转会触发XSS警告怎么办?
我在做一个动态链接渲染的功能,用户可以输入URL,但有些老数据里带的是 javascript:alert(1) 这种。我直接绑定到 <a :href="userUrl" rel="external nofollow" > 上,结果控制台报 XSS 风险,页面还被 CSP 拦了。试过用 URL 构造函数校验,但 javascript: 协议居然能通过?现在不知道该怎么安全地处理这种输入。
这是我的简化代码:
<template>
<a :href="untrustedUrl" rel="external nofollow" >点击</a>
</template>
<script setup>
const untrustedUrl = 'javascript:alert("xss")';
</script>
javascript:协议语法上是合法的,所以能过。直接给你一个能用的方案,复制这个函数去过滤:
然后你的组件改成这样:
这样处理后,危险链接会被替换成
#,不会触发XSS警告也不会执行恶意代码。如果你想更严格一点,可以用白名单机制,只允许
http://、https://、mailto:这些安全协议,其他的全拦截。不过看你业务需求,有些项目可能还需要tel:或者相对路径,自己往白名单里加就行。