清理用户输入以包含在href属性中?

时间:2014-08-14 17:36:32

标签: python django url escaping

我想接受用户输入的网址并将其显示在链接标记的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 个答案:

答案 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属性的链接标记,其中可能包含&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)