如何清理用户输入以用于href属性?

2 投票
2 回答
2209 浏览
提问于 2025-04-18 17:19

我想接受用户输入的一个网址,并把它显示在链接标签的 href 属性里。比如:

<a href="%(user_input)s">My link name</a>

但是我想确保这个网址没有恶意内容,比如注入脚本标签之类的。那么,清理 user_input 部分的最佳方法是什么呢?

根据我的了解:

  • django.utils.html.escape 会把 & 转义,这样不好。
  • django.utils.http.urlquotedjango.utils.http.urlquote_plus 会把 http:// 中的 : 转义,这也不好。

也许最好的方法是使用 urlquote_plus,并指定一些安全的字符?

2 个回答

1

你可以使用一个叫做“safe”的模板标签。

假设你的帖子内容变量是:

user_input = some_valid_url

你需要把这个用户输入的内容拿出来,然后加上HTML代码,把它变成一个链接,最后在保存帖子的时候把这个链接放回去。这样保存下来的帖子就是:

link_text = <a href=user_input>Link</a>

然后在你的HTML模板中使用safe:

{{ link_text|safe }}

这里有关于safe模板标签的文档链接: https://docs.djangoproject.com/en/dev/ref/templates/builtins/#safe

0

我之前想得太复杂了。其实,使用 django.utils.html.escape 是没问题的,因为它生成的 HTML 中包含了链接标签和 href 属性,虽然这些属性里可能会有 &amp;,但浏览器可以正常处理这些。

我原本以为需要找到一种方法来让链接中包含 &,因为网址里是不会有 &amp; 的。

我最后的代码是:

from django.utils.safestring import mark_safe
from django.utils.html import escape

....

output = '<li><a href="%s">%s</a></li>' \
   % (escape(entry['url']), escape(self.link_display(entry)))

return mark_safe(output)

撰写回答