如何清理用户输入以用于href属性?
我想接受用户输入的一个网址,并把它显示在链接标签的 href
属性里。比如:
<a href="%(user_input)s">My link name</a>
但是我想确保这个网址没有恶意内容,比如注入脚本标签之类的。那么,清理 user_input
部分的最佳方法是什么呢?
根据我的了解:
django.utils.html.escape
会把&
转义,这样不好。django.utils.http.urlquote
和django.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
属性,虽然这些属性里可能会有 &
,但浏览器可以正常处理这些。
我原本以为需要找到一种方法来让链接中包含 &
,因为网址里是不会有 &
的。
我最后的代码是:
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)