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 <script>alert('hacked');</script>"
。请注意,有问题的语法已替换为转义字符。在 HTML 文档中呈现时,不会执行脚本,只有文本。
我正在使用 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 <script>alert('hacked');</script>"
。请注意,有问题的语法已替换为转义字符。在 HTML 文档中呈现时,不会执行脚本,只有文本。