Python、Jinja2 nl2br 和安全

Python, Jinja2 nl2br and security

我正在使用 snippet from Jinja2 在 html 中显示多行文本,但我遇到了一个问题:

如果用户输入

"Hello\nMy name is Jon"

nl2br 标签会将其呈现为

"Hello<br />My name is Jon"

正确解释了 br(换行符)。

现在这样很好,但是如果用户输入

"Hello<script>alert('hacked');</script>"

因为我必须解释 html 才能正确显示分界线,所以 <script> 也将被执行...

我怎样才能避免这种情况?

您链接到的示例代码已经在替换换行符之前对输入进行了转义。随后,文本被标记为安全,因为此时它是安全的。相关代码为:

from jinja import escape, Markup
value = escape(value)
return Markup(value)

对于输入 "Hello<script>alert('hacked');</script>",结果为 "Hello &lt;script&gt;alert(&#39;hacked&#39;);&lt;/script&gt;"。请注意,有问题的语法已替换为转义字符。在 HTML 文档中呈现时,不会执行脚本,只有文本。