我想接受用户输入的网址并将其显示在链接标记的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
指定一些安全字符?
答案 0 :(得分:1)
您可以使用模板标签:safe。
假设您的帖子上下文变量是:
user_input = some_valid_url
抓取user_input,并添加html以使其成为链接,并在保存帖子时重新插入。所以保存的帖子是:
link_text = <a href=user_input>Link</a>
然后在你的html模板中使用safe:
{{ link_text|safe }}
以下是安全模板标记的文档链接: https://docs.djangoproject.com/en/dev/ref/templates/builtins/#safe
答案 1 :(得分: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)