首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么和何时使用Django mark_safe()函数

为什么和何时使用Django mark_safe()函数
EN

Stack Overflow用户
提问于 2015-09-26 16:55:05
回答 2查看 26.5K关注 0票数 30

在阅读了该文件后,外管局()的功能仍不明确。我想这和CSRF有关。但是为什么和何时应该使用mark_safe()呢?

这是文件

mark_safe(s) 将字符串显式标记为(HTML)输出目的的安全。返回的对象可以在任何地方使用--字符串或unicode对象是合适的。 可以在单个字符串上多次调用。 为了构建HTML片段,通常应该使用django.utils.html.format_html()。 如果修改,标记为安全的字符串将再次变得不安全。例如:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-26 17:10:27

Django是一个框架,它在默认情况下试图做“正确”的事情。这意味着,当你做最简单的事情时,你可能会做正确的事情。

现在让我们看看php和python中的一些模板:

PHP:

代码语言:javascript
运行
复制
<? echo $foo ?>

可给予:

代码语言:javascript
运行
复制
<script src="evil">

Django:

代码语言:javascript
运行
复制
{{ foo }}

使用相同的输入:

代码语言:javascript
运行
复制
&gt;script src="evil"&lt;

现在假设您想要放置一个链接<a href="link">text</a>。然后django将再次使用&lt;&gt;将其呈现为文本。如果您知道自己在做什么,现在可以使用mark_safe来指示文本是可信的(即不来自用户输入)。

通常,您将在模板中使用{{ foo|safe }}{% autoescape off %}{{ foo }}{% endautoescape %}作为django程序员,这在字符串声明为安全时更加清楚。

那么,mark_safe在哪里使用呢?当您编写自己的模板标记或筛选器时,您需要将字符串标记为不受python影响,因为开发人员将假定{foo_mylinkifyfunction}执行正确的操作(即它转义url foo,但不会在url周围转义<a href=""></a> )。

票数 32
EN

Stack Overflow用户

发布于 2020-10-23 10:28:45

还值得注意的是,在构建HTML代码片段时,建议使用format_html(...)函数而不是mark_safe,并转义其所有参数。

因此,与其写:

代码语言:javascript
运行
复制
mark_safe("%s <b>%s</b> %s" % (
    some_html,
    escape(some_text),
    escape(some_other_text),
))

相反,您应该使用:

代码语言:javascript
运行
复制
format_html("{} <b>{}</b> {}",
    mark_safe(some_html),
    some_text,
    some_other_text,
)

这样做的好处是,您不需要对每个参数应用escape(),如果您忘记了一个bug和XSS漏洞,那么就冒一个错误和XSS漏洞的风险。

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32799615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档