在django中对不受信任的文本使用urlize

时间:2014-11-08 08:35:55

标签: django markdown

我想在我的django应用程序中实现一些基本的降价功能。目标是获取用户输入并使用换行符和网址识别对其进行格式化。

我知道我可以在模板中执行以下操作:

{{ text|urlize|linebreaks }}

有没有办法在不受信任的用户输入的视图中执行此操作?有点像这样:

from django.utils.html import urlize 

def foo(request):
    text = urlize("<script>console.log('break')</script> www.bar.com")
    return render(request, 'index.html' {'text':text})

即。让它将链接呈现为安全,但不是字符串的其余部分。

1 个答案:

答案 0 :(得分:0)

答案可能是否定的(给出您的示例文本)

urlize的文档声明如下:

  

如果urlize应用于已包含HTML标记的文本,则事情将无法按预期工作。仅将此过滤器应用于纯文本。

如果你看一下来源或urlize,它实际上非常直接。您可能会提取包含URL或电子邮件的相关部分,并将其直接传递给urlize函数。

Django无法仅将字符串的一部分标记为安全的原因是它将整个字符串标记为安全并返回一个安全的字符串对象。如果你只希望字符串的一部分是安全的,那么必须从父字符串中剪切它并使其自身安全(不支持只清理字符串的一部分,你要么整理整个字符串,要么没有它)。

SafeText

的来源非常明确
class SafeText(six.text_type, SafeData):
    """
    A unicode (Python 2) / str (Python 3) subclass that has been specifically
    marked as "safe" for HTML output purposes.
    """
    def __add__(self, rhs):
        """
        Concatenating a safe unicode string with another safe byte string or
        safe unicode string is safe. Otherwise, the result is no longer safe.
        """
        t = super(SafeText, self).__add__(rhs)
        if isinstance(rhs, SafeData):
            return SafeText(t)
        return t

    def _proxy_method(self, *args, **kwargs):
        """
        Wrap a call to a normal unicode method up so that we return safe
        results. The method that is being wrapped is passed in the 'method'
        argument.
        """
        method = kwargs.pop('method')
        data = method(self, *args, **kwargs)
        if isinstance(data, bytes):
            return SafeBytes(data)
        else:
            return SafeText(data)

    encode = curry(_proxy_method, method=six.text_type.encode)