gpt4 book ai didi

django - 在 Django 中使用 url_has_allowed_host_and_scheme 后什么时候需要使用 iri_to_uri?

转载 作者:行者123 更新时间:2023-12-04 13:16:04 24 4
gpt4 key购买 nike

Django 3.0 release notes ,此评论是关于 url_has_allowed_host_and_scheme :

To avoid possible confusion as to effective scope, the private internal utility is_safe_url() is renamed to url_has_allowed_host_and_scheme(). That a URL has an allowed host and scheme doesn’t in general imply that it’s “safe”. It may still be quoted incorrectly, for example. Ensure to also use iri_to_uri() on the path component of untrusted URLs.



我明白 url_has_allowed_host_and_scheme 的目的是什么是。以提供 next 的常见用例为例。查询参数,例如: http://example.com/foobar?next=http%3A%2F%2Fexample2.com%2Fhello .您可以对处理此路径的 View 进行编程以重定向到 next 提供的 URL。参数,在这种情况下:
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
iri_to_uri部分是确保正确引用最终结果 URL 所必需的。例如:
  • 原始 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 协议(protocol)。
    老实说,我仍然不完全确定为什么 iri_to_uri是必需的,因为 Django 的实用程序如 redirect在它到达 HTTP 请求中的线路之前,将根据需要自动转义 URL。

    关于django - 在 Django 中使用 url_has_allowed_host_and_scheme 后什么时候需要使用 iri_to_uri?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60372946/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com