使用Trix清理HTML输入

时间:2017-09-07 17:07:31

标签: php laravel vue.js vuejs2 trix

目前我有一个奇怪的问题,我正在寻找有关如何解决这个问题的任何见解。

我目前正在使用Basecamp Trix editor接受HTML输入。

当我将输入发送到我的Laravel应用程序时,它将保存到我的数据库中:

<div>&lt;script&gt;alert('test');&lt;/script&gt;</div>

然而,问题是当我使用Laravel的刀片将其插入Vue属性时,它实际上会将其转换回有效的HTML:

<reply :data-reply="{{ $reply }}"></reply>

结果:

enter image description here

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的内容?

1 个答案:

答案 0 :(得分:0)

好的,我已经把

<div>&lt;script&gt;alert('test');&lt;/script&gt;</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控制台中我得到了:

&lt;div&gt;&lt;script&gt;alert('test');&lt;/script&gt;&lt;/div&gt;

所以它与数据库中的不一样,但它看起来并不如你所示。