In the 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
参数,在本例中:http://example2.com/hello。如果 URL 未经验证,则这是一个“开放重定向”漏洞。恶意行为者可能会利用开放重定向将恶意 URL 隐藏在看似可信的 URL 后面。
您可以使用url_has_allowed_host_and_scheme
以确保 URL 具有预期的主机名和方案。
我的问题是关于iri_to_uri
。该文档暗示您还需要使用此功能。我什么时候需要使用它?
以下是实现安全重定向的方法:
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
The iri_to_uri
部分对于确保正确引用最终结果 URL 是必要的。例如:
- 原始网址类似于http://example.com/foobar?next=%2Fcaf%C3%A9%2F
-
request.GET['next']
等于'/café/'
-
iri_to_uri(request.GET['next'])
等于'/caf%C3%A9/'
HTTP 请求中的第一行需要采用如下格式:
GET /caf%C3%A9/ HTTP/1.0
URL 需要在那里进行转义,因为如果它包含空格之类的内容,就会破坏 HTTP 协议。
说实话,我还是不太清楚为什么iri_to_uri
是必需的,因为 Django 的实用程序如redirect
在到达 HTTP 请求之前,会根据需要自动转义 URL。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)