3

Django 3.0 发行说明中,此评论是关于url_has_allowed_host_and_scheme

为了避免对有效范围的混淆,私有内部实用程序is_safe_url()被重命名为url_has_allowed_host_and_scheme(). URL 具有允许的主机和方案通常并不意味着它是“安全的”。例如,它仍然可能被错误地引用。确保也在iri_to_uri()不受信任的 URL 的路径组件上使用。

我明白这样做的目的url_has_allowed_host_and_scheme是什么。以提供next查询参数的常见用例为例,例如:http://example.com/foobar?next=http%3A%2F%2Fexample2.com%2Fhello。您可以对处理此路径的视图进行编程,以重定向到next参数提供的 URL,在本例中为: http ://example2.com/hello 。如果 URL 未经过验证,则这是一个“开放重定向”漏洞。恶意行为者可以利用开放重定向将恶意 URL 隐藏在看起来值得信赖的 URL 后面。

您可以使用它url_has_allowed_host_and_scheme来确保 URL 具有预期的主机名和方案。

我的问题是关于iri_to_uri. 该文档暗示您还需要使用此功能。我什么时候需要使用它?

4

1 回答 1

4

以下是实现安全重定向的方法:

from django.utils.http import url_has_allowed_host_and_scheme
from django.utils.encoding import iri_to_uri
from django.shortcuts import redirect

def example_view(request):
    if url_has_allowed_host_and_scheme(request.GET['next'], None):
        url = iri_to_uri(request.GET['next'])
        return redirect(url)
    else:
        raise

iri_to_uri部分是确保正确引用最终结果 URL 所必需的。例如:

HTTP 请求中的第一行需要采用如下格式:

GET /caf%C3%A9/ HTTP/1.0

URL 需要在那里转义,因为如果它包含空格之类的东西,它会破坏 HTTP 协议。

老实说,我仍然不完全确定为什么iri_to_uri需要,因为 Django 的实用程序就像redirect会在 URL 到达 HTTP 请求中的线路之前根据需要自动转义 URL。

于 2020-02-24T09:33:21.720 回答