【问题标题】:Sanitize user input for inclusion in href attribute?清理用户输入以包含在 href 属性中?
【发布时间】:2014-08-14 17:36:32
【问题描述】:

我想接受用户输入的网址并将其显示在链接标签的href 属性部分。即。

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

但我想确保它没有任何恶意内容,例如注入脚本标签等。对user_input 部分进行消毒的最佳方法是什么?

据我所知:

  • django.utils.html.escape 会逃脱 &amp;,这很糟糕。
  • django.utils.http.urlquotedjango.utils.http.urlquote_plus 会避开 : 的一部分 http:// 以及其他看起来很糟糕的事情。

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

【问题讨论】:

  • 用户输入的本质是什么?通常,最好将用户可以输入的内容限制为一种简单的语言(例如“整数”或“单个单词”),而不仅仅是让用户输入是任何可能的字符串。如果它必须是任意字符串,您能否解释一下为什么要将用户的字符串变成这样的链接的一部分?它就像一个锚参考吗?
  • @FrobberOfBits - 感谢您的回复。它来自网站的一部分,用户可以在其中添加自己的链接,这些链接应该与页面上描述的位置相关。不过,我很想确保它不是攻击的途径。

标签: python django url escaping


【解决方案1】:

可以使用模板标签:safe。

假设您的帖子上下文变量是:

user_input = some_valid_url

获取 user_input,并添加 html 以使其成为链接并在保存帖子时重新插入。所以保存的帖子是:

link_text = &lt;a href=user_input&gt;Link&lt;/a&gt;

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

{{ link_text|safe }}

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

【讨论】:

  • 感谢您的回复。 safe 是否真的进行了任何转义或只是将内容标记为安全,以便 Django 不会转义它们?
【解决方案2】:

我想太多了。事实证明,使用django.utils.html.escape 很好,因为它会生成带有href 属性的链接标签的HTML,其中可能有&amp;amp; 而不是&amp;amp;,但浏览器可以很好地处理这个问题。

我想我需要找到一种方法在其中包含&amp;amp;,因为网址中没有&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)

【讨论】:

    猜你喜欢
    • 2020-02-20
    • 2018-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-14
    • 2017-10-01
    • 2019-07-01
    • 1970-01-01
    相关资源
    最近更新 更多