目前我有一个奇怪的问题,我正在寻找有关如何解决这个问题的任何见解。
我目前正在使用Basecamp Trix editor接受HTML输入。
当我将输入发送到我的Laravel应用程序时,它将保存到我的数据库中:
<div><script>alert('test');</script></div>
然而,问题是当我使用Laravel的刀片将其插入Vue属性时,它实际上会将其转换回有效的HTML:
<reply :data-reply="{{ $reply }}"></reply>
结果:
Laravel似乎使用刀片式echo语句将脚本标签转换为有效的HTML?
我的观点:
{{ $reply }}
结果:
{"id":63,"created_at":"2017-09-07 13:30:53","updated_at":"2017-09-07 13:35:05","user_id":1,"body":"<div><script>alert('test');<\/script><\/div>","options":null}
问题是,我无法消除这种情况,因为HTML数据实际上是在我的数据库中转义的,但是当Laravel将我的回复转换为JSON时,它实际上取消了脚本标记,并且它实际上在使用{时在Vue中运行{1}}指令。
我知道在使用v-html
指令时我不应该接受用户输入,但是我需要HTML支持回复,而且我无法清理Laravel应用程序中已经转义过的HTML。
有没有人有任何想法如何以某种方式消毒Trix的内容?
答案 0 :(得分:0)
好的,我已经把
了<div><script>alert('test');</script></div>
进入用户的电子邮件领域。
在Laravel中,我只是使用:
return view('welcome', ['user' => App\User::find(1)]);
模特没什么特别的。
我的观点如下:
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<div id="el">{{ $user }}</div>
<script>
user = JSON.parse(document.getElementById("el").innerHTML);
console.log(user.name);
</script>
</body>
</html>
在JS控制台中我得到了:
<div><script>alert('test');</script></div>
所以它与数据库中的不一样,但它看起来并不如你所示。