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

2023-12-11

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(使用前将#替换为@)

在Django中使用url_has_allowed_host_and_scheme后什么时候需要使用iri_to_uri? 的相关文章

  • 在 Django 1.7 中使用 html 发送电子邮件

    In 发送邮件 我们有一个新参数 html message Docs https docs djangoproject com en dev topics email send mail I have 电子邮件 html文件 我想发送我的消
  • 如何使用 django-sitetree?

    我正在尝试使用Django 站点树 https github com idlesign django sitetree但我不明白如何执行第 3 步 转到 Django 管理站点并添加一些树和树项目 如何在管理面板中制作站点树 我相信第一步是
  • Django - 没有名为 _sqlite3 的模块

    我在 rhel 5 上安装了 django 1 4 默认情况下 rhel 5 中有 python 2 4 但要使用 django 1 4 我手动安装了 python 2 7 3 开发服务器运行良好 但是当我创建一个新项目并将 setting
  • 使用 Google App Engine 和 Django 将第三方库 (twilio) 添加到项目中

    每个人 我是这个领域的新手 我使用 django 框架使用 google 应用引擎开发 Web 应用程序 我有一个关于 python lib dir 问题的故障排除 导入错误 没有名为 的模块 我的 appengine config py
  • 使用 Django ModelForm 上传个人资料图片

    我环顾过相关问题 但似乎没有一个答案有效 我正在尝试上传用户的个人资料图像并让它替换 覆盖 当前图像 保存图像后 我想将文件名更改为用户 ID 图像将以当前形式上传 但不会替换现有图像 例如 它将保存为 2 1 png class Phot
  • HTML - 使用 JS 根据值更改文本颜色

    我正在使用 Django 创建一个以 HTML 形式显示的表格 我想当数字为负数时将数字的颜色更改为红色 当数字为正数时将数字的颜色更改为绿色 我知道我需要使用 JS 来实现这一点 但我无法让它工作 任何帮助将不胜感激 这是我的 Djang
  • 在 Django 中扩展 User 对象:用户模型继承还是使用 UserProfile?

    要使用自定义字段扩展 User 对象 Django 文档建议使用用户资料 http docs djangoproject com en dev topics auth storing additional information about
  • 我可以从另一个视图中调用一个视图吗?

    我的一个视图需要添加一个项目以及其他功能 但我已经有另一个专门添加项目的视图 我可以做类似的事情吗 def specific add item view request item Item objects create foo reques
  • Django modelAdmin __init__ 和内联

    嘿 我对 Django 相当陌生 我正在寻找动态编辑管理类变量 完整的想法是在添加时隐藏内联 仅在编辑时显示 但我在这里提炼这个问题 有人可以解释为什么这不起作用吗 class dbTablePermissionInline admin T
  • Django Rest Framework 分页设置 - 内容范围

    6 30 15 我怎样才能让这个问题变得更好并且对其他人更有帮助 反馈会有帮助 谢谢 我使用 DRF 作为 Dojo Dgrid Web 应用程序的服务器端 Dojo 需要来自服务器的内容范围或范围响应 目前它不发送任何内容 因此 dgri
  • 无法使用 Django 应用程序从容器连接到 MySQL docker 容器

    当我尝试从运行 Django 应用程序的 docker 容器连接到运行 MySQL 的容器时 出现以下错误 django db utils OperationalError 2003 Can t connect to MySQL serve
  • 在 Docker 容器中看不到 Django

    我想在一个简单的 Docker 容器中运行 Django 首先 我使用 Docker 文件构建了容器 里面没有什么特别的 只有 FROM RUN 和 COPY 命令 然后我用命令运行我的容器 docker run tid p 8000 80
  • Django 如何将自定义变量传递到上下文以在自定义管理模板中使用?

    我正在扩展change list html 我需要输出settings py中定义的变量 如何将该特定变量传递到自定义管理模板上下文中 class MyModelAdmin admin ModelAdmin def changelist v
  • 在 Django 中翻译文件时的 Git 命令

    我在 Django 中有一个现有的应用程序 我想在页面上添加翻译 在页面上我有 trans Projects 在 po 文件中我添加了 templates staff site html 200 msgid Projects msgid P
  • django - 如何将实际图像文件从一个模型复制到另一个模型?

    我想将项目中的图像从一个模型复制到另一个模型 假设这些是我的模型 class BackgroundImage models Model user models ForeignKey User image models ImageField
  • 使用 nginx 在云上部署 django 和 React

    我有一个 digitalocean 服务器 并且已经使用 Gunicorn 和 nginx 部署了 Django 后端服务器 如何在同一台服务器上部署 React 应用程序 您可以构建 React 应用程序并使用 Nginx 提供其静态文件
  • 阻止注销页面后的后退按钮

    我有 php 注销页面 当用户单击注销链接时 请参阅此页面并重定向到索引页面 但是当单击后退按钮时 我会看到带有用户数据的上一页 当然 当我刷新页面时 我看不到以前的页面和数据 我在单击注销并单击后退按钮后检查了其他代码 drupal 但我
  • Django 多个具有相同名称的输入字段值

    我需要一些帮助 如何处理具有多个输入字段值且名称相同的表单 而且只有一次查看 这实际上是针对基本问题的形式 我发现这个方法的另一个想法https stackoverflow com a 478406 6396981 https stacko
  • 在 Django 中定期运行一个函数

    我在 Django 中编写一个应用程序来监视一组服务器中的某些服务 我希望定期更新观点 到目前为止 我已经研究过编写自定义管理命令 链接在这里 http docs djangoproject com en dev howto custom
  • 将文件夹和文件结构从 django 1.3 迁移到 django 1.4 的最佳方法是什么?

    我有一个使用 django1 3 创建的小项目 我想将其迁移到 django1 4 但由于文件结构发生了一些变化 最好的迁移方法是什么 Read https docs djangoproject com en dev releases 1

随机推荐

  • PHP 正则表达式删除多个 ? 标记

    我无法找到正确的正则表达式字符串来删除多个 的序列 人物 我想替换多个连续的 用一个 但是要转义哪些字符 正在逃避我 输入示例 这东西还开着 或者是什么 期望的输出 这个东西开了吗 或者是什么 我在用着预替换 in PHP preg rep
  • 一些基本操作的 CPU 成本数量级

    回答后那么问题被否决了 我想和你核实一下 为了对我编写的代码的成本有一个初步的了解 我倾向于以这种方式扩展操作 堆分配比堆栈分配慢大约 1000 倍 与屏幕 输出的IO约为1000次 比堆分配慢 硬盘上的 IO 大约慢 1000 倍 与屏幕
  • 如何使用 Passport-google-oauth 成功身份验证后重定向到原始页面

    我正在使用节点 Passport google oauth 模块 并尝试使用基于会话的方法成功进行身份验证后将页面重定向回原始路径Node js Passport 的 Google 策略上的自定义 returnUrl 但是 我发现在回调中
  • PHP MYSQL 多维数组

    我在尝试从两个单独的 MySQL 选择创建多维数组时遇到了很大的麻烦 我一直在这里和谷歌搜索一整天 最后不得不承认失败并寻求一些帮助 我也是新手 这没有帮助 我有两个表 一个表包含每个 id 的单行结果 另一个表可以包含一个 id 的多行结
  • 如何确定git中最后合并的分支?

    我需要确定哪个是最后合并到 master 的分支 我一直在搜索 git 文档 但我仍然有点迷失 到目前为止我已经找到了命令 假设master是我当前的分支 git log oneline graph decorate 这为我提供了这样的输出
  • 如何进行合并?

    我有一个主分支和一个功能分支 feature 分支有一些更改 但 master 分支有很多更改 例如从存储库中删除了 10 个项目 问题是如何将feature分支合并回master分支 1 将feature与master合并 然后maste
  • 如何让ffmpeg根据设置的高度比例计算修改后的宽度?

    找到解决方案后 我的 Android 上所有 webm 到 MP4 编解码器转换错误的根源 我遇到了另一个问题 分解我的问题 大多数设备都支持哪些 MP4 分辨率 我知道它们从某个高度值开始经过 p 才能工作 例如 720p X720 有没
  • 从列表创建多个复选框并获取所有值

    我想从一个大列表中生成多个复选框 并获取所有值 这是到目前为止我的代码 列表可能更大 from Tkinter import def print ingredients args values cheese cheese get ham h
  • 如何在 python 中将多图像 TIFF 转换为 PDF?

    我想在 python 中将多图像 TIFF 转换为 PDF 我是这样写的代码 这段代码怎么行不通 我应该如何改变它 images img Image open multipage tif for i in range 4 try img s
  • PHP - 打印带有控制字符的字符串

    有没有办法让 PHP 输出一个带有 r n 和 n 的字符串作为实际文本而不是换行符 我看到一个有趣的问题 n 上的explode 无法在Windows 服务器上正常运行 编辑 r n 来自用户在输入文本区域时按 Enter 键 所以我没有
  • 安卓图片上传

    你好 我是 Android 开发新手 我想知道如何在 Android 中上传图像 我没有找到任何有用的教程 你能给我一些指导吗 请帮助我 我为你构建了这个小方法 private boolean handlePicture String fi
  • JSON 完成的自定义扩展在双引号中不起作用

    我正在开发一个 VSCode 扩展 它应该通过额外的代码完成来增强 JSON 编辑 因此我添加了四个虚拟建议 foo foo1 foo2 foo3 开始测试 当在 JSON 键后输入冒号时 它会按预期工作 此外 当我在空对象中触发完成时 它
  • Tensorflow v1.10:将图像存储为字节字符串或每个通道?

    Context 据了解 目前 TF 的 Record 文档还有一些不足之处 我的问题是关于什么是最佳存储 一个序列 它的每个元素类别概率 以及 一些 上下文 信息 例如序列的名称 作为 TF 记录 也就是说 这个问题考虑将序列和类概率存储为
  • karate.callSingle 在 karate-config.js 中找不到 .feature 文件

    我正在使用空手道 v0 9 6 它是一个很棒的工具 我有超过 1000 个场景 每个场景都需要令牌才能工作 因此我在 karate config js 中使用 callSingle 来创建和缓存令牌 我使用独立的 jar 文件 我的 kar
  • SFINAE 未编译[重复]

    这个问题在这里已经有答案了 我以前经常使用 SFINAE 但我有一个非常非常简单的示例 但今天无法运行 class X public template
  • 一次测试 C 中的所有位字段

    假设我有一个 C 结构定义为 struct data some memebers int flag a 1 int flag b 1 int flag c 1 some other members 有没有办法利用位域在内存中表示为单个 in
  • Spring data JPA自定义存储库,如何应用逻辑

    我尝试实现 JPA 自定义存储库 我有一个像这样的过滤器对象 public class FilterPatient private String surname private String name private String cf a
  • 谷歌地图透明图像叠加

    我正在寻找一些覆盖地图的透明固定位置图像的示例 移动地图时 透明图像不应移动 并且标记应出现在图像顶部 有谁知道有什么例子吗 有一种方法可以将一个 div 放在另一个 div 之上 它将 标记放置在地图的中心 http code googl
  • 如何更改内置的 Laravel 5 身份验证系统?

    我是第一次使用 Laravel 5 我之前曾与 4 人合作过 Laravel 附带了一个 AuthenticatesAndRegisterUsers php 文件 它可以处理大部分内容 并使用户注册和登录变得非常容易 我想调整此文件以满足我
  • 在Django中使用url_has_allowed_host_and_scheme后什么时候需要使用iri_to_uri?

    In the Django 3 0 发行说明 此评论是关于url has allowed host and scheme 为了避免有效范围可能出现的混淆 私有内部效用is safe url 被重命名为url has allowed host