在阅读了该文件后,外管局()的功能仍不明确。我想这和CSRF有关。但是为什么和何时应该使用mark_safe()呢?
这是文件
mark_safe(s) 将字符串显式标记为(HTML)输出目的的安全。返回的对象可以在任何地方使用--字符串或unicode对象是合适的。 可以在单个字符串上多次调用。 为了构建HTML片段,通常应该使用django.utils.html.format_html()。 如果修改,标记为安全的字符串将再次变得不安全。例如:
发布于 2015-09-26 17:10:27
Django是一个框架,它在默认情况下试图做“正确”的事情。这意味着,当你做最简单的事情时,你可能会做正确的事情。
现在让我们看看php和python中的一些模板:
PHP:
<? echo $foo ?>可给予:
<script src="evil">Django:
{{ foo }}使用相同的输入:
>script src="evil"<现在假设您想要放置一个链接<a href="link">text</a>。然后django将再次使用<>将其呈现为文本。如果您知道自己在做什么,现在可以使用mark_safe来指示文本是可信的(即不来自用户输入)。
通常,您将在模板中使用{{ foo|safe }}或{% autoescape off %}{{ foo }}{% endautoescape %}作为django程序员,这在字符串声明为安全时更加清楚。
那么,mark_safe在哪里使用呢?当您编写自己的模板标记或筛选器时,您需要将字符串标记为不受python影响,因为开发人员将假定{foo_mylinkifyfunction}执行正确的操作(即它转义url foo,但不会在url周围转义<a href=""></a> )。
发布于 2020-10-23 10:28:45
还值得注意的是,在构建HTML代码片段时,建议使用format_html(...)函数而不是mark_safe,并转义其所有参数。
因此,与其写:
mark_safe("%s <b>%s</b> %s" % (
    some_html,
    escape(some_text),
    escape(some_other_text),
))相反,您应该使用:
format_html("{} <b>{}</b> {}",
    mark_safe(some_html),
    some_text,
    some_other_text,
)这样做的好处是,您不需要对每个参数应用escape(),如果您忘记了一个bug和XSS漏洞,那么就冒一个错误和XSS漏洞的风险。
https://stackoverflow.com/questions/32799615
复制相似问题