如何从用户的markdown输入中删除脚本标签?

Hom*_*ien 4 php xss markdown laravel

在我的php应用程序中,我有这个textarea框,从用户接收markdown(如stackoverflow),然后它显示在网站上.我正在使用Laravel Framework并使用parsedown-laravel包.
我可以:

{!! Markdown::parse('__Hello__ Markdown!'); !!}
Run Code Online (Sandbox Code Playgroud)

有用.

{!! Markdown::parse('<h1>Hello</h1> Markdown!'); !!}
Run Code Online (Sandbox Code Playgroud)

它仍然有效.我对此很满意.

如果我这样做:

{!! Markdown::parse('<script>alert("XSS Attack!!!")</script> Markdown!'); !!}
Run Code Online (Sandbox Code Playgroud)

它仍然有效!

如何使用Laravel和此软件包阻止我的应用程序中的脚本标记?

Fro*_*rog 5

如果你看一下Markdown规范(Jon GruberCommonMark原始语法),你会发现Markdown不应该取代HTML.它的唯一目标是让您更容易阅读您编写的文本.由于Markdown仅涵盖HTML标签的一小部分,因此您仍然可以使用内联HTML代码来创建您想要的内容.事实上,John Gruber说:

对于Markdown语法未涵盖的任何标记,您只需使用HTML本身.没有必要为它添加前缀或分隔它以表明您正在从Markdown切换到HTML; 你只需使用标签.

所以基本上,这就是Markdown的工作方式.显然,如果您正在解析用户的输入,则不应该这样.由于Markdown解析器输出HTML代码,因此您无法使用该htmlentities函数或类似的解决方案.

解决问题的最简单方法是使用HTML过滤器,HTML Purifier.这将从Markdown输出中删除恶意代码,并尝试阻止XSS攻击.基本上,您应首先调用Markdown解析器,并使用该输出调用HTML Purifier库.


ark*_*cha -2

接受用户输入并将其与应用程序代码无缝集成永远不可能是安全的。这是不行的。

如果这只是为了显示代码,那么您可以使用标签<textinput>来实现。您可以设置它的样式,使其看起来不像输入。或者您只需使用一个函数,例如htmlescape()<pre>标签结合使用。