如何验证 urllib2 脚本以便从 Django 站点访问 HTTPS Web 服务?

2023-12-10

大家。 我正在开发一个 django/mod_wsgi/apache2 网站,该网站使用 https 为所有请求和响应提供敏感信息。如果用户未经过身份验证,所有视图都会被写入重定向。它还具有多个旨在像 RESTful Web 服务一样运行的视图。

我现在正在编写一个脚本,该脚本使用 urllib/urllib2 联系其中几个服务,以便下载一系列非常大的文件。我在尝试登录时遇到 403: FORBIDDEN 错误问题。

我用于身份验证和登录的(草稿)方法是:

def login( base_address, username=None, password=None ):

    # prompt for the username (if needed), password
    if username == None:
        username = raw_input( 'Username: ' )
    if password == None:
        password = getpass.getpass( 'Password: ' )
    log.info( 'Logging in %s' % username )

    # fetch the login page in order to get the csrf token
    cookieHandler = urllib2.HTTPCookieProcessor()
    opener = urllib2.build_opener( urllib2.HTTPSHandler(), cookieHandler )
    urllib2.install_opener( opener )

    login_url = base_address + PATH_TO_LOGIN
    log.debug( "login_url: " + login_url )
    login_page = opener.open( login_url )

    # attempt to get the csrf token from the cookie jar
    csrf_cookie = None
    for cookie in cookieHandler.cookiejar:
        if cookie.name == 'csrftoken':
             csrf_cookie = cookie
             break
    if not cookie:
        raise IOError( "No csrf cookie found" )
    log.debug(  "found csrf cookie: " + str( csrf_cookie ) )
    log.debug(  "csrf_token = %s" % csrf_cookie.value )

    # login using the usr, pwd, and csrf token
    login_data = urllib.urlencode( dict(
        username=username, password=password,
        csrfmiddlewaretoken=csrf_cookie.value ) )
    log.debug( "login_data: %s" % login_data )

    req = urllib2.Request( login_url, login_data )
    response = urllib2.urlopen( req )
    # <--- 403: FORBIDDEN here

    log.debug( 'response url:\n' + str( response.geturl() ) + '\n' )
    log.debug( 'response info:\n' + str( response.info() ) + '\n' )

    # should redirect to the welcome page here, if back at log in - refused
    if response.geturl() == login_url:
        raise IOError( 'Authentication refused' )

    log.info( '\t%s is logged in' % username )
    # save the cookies/opener for further actions
    return opener 

我使用 HTTPCookieHandler 在脚本端存储 Django 的身份验证 cookie,以便我可以访问 Web 服务并完成重定向。

我知道如果我不传递 csrf 令牌和登录信息,Django 的 CSRF 中间件将会把我排除在外,所以我首先从第一个页面/表单加载的 cookiejar 中提取它。就像我提到的,这适用于该网站的 http/development 版本。

具体来说,当我尝试通过 https 连接将凭据发布到登录页面/表单时,收到 403 错误。此方法在使用 http 连接的开发服务器上使用时有效。

没有 Apache 目录指令阻止访问该区域(我可以看到)。该脚本成功连接到登录页面,没有发布数据,所以我认为这将使 Apache 摆脱问题(但我可能是错的)。

我使用的 python 安装都是使用 SSL 编译的。

我还读到 urllib2 不允许通过代理进行 https 连接。我对代理不是很有经验,所以我不知道使用远程计算机上的脚本是否实际上是代理连接以及这是否会成为问题。这是导致访问问题的原因吗?

据我所知,问题出在 cookie 和发布数据的组合上,但我不清楚从哪里获取它。

任何帮助,将不胜感激。谢谢


请原谅我回答我自己的问题,但是 - 根据记录,这似乎已经解决了它:

事实证明,我需要将 HTTP Referer 标头设置为我发布登录信息的请求中的登录页面 url。

req.add_header( 'Referer', login_url )

原因在上有解释Django CSRF 文档- 具体来说,第 4 步。

由于我们的服务器设置有点特殊,我们在生产端使用 HTTPS 并且 DEBUG=False,所以我没有看到通常在调试信息。我最终将该失败原因打印到 Apache error_log 并在其上进行 STFW 处理。这让我代码.djangoproject/.../csrf.py以及 Referer 标头修复。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何验证 urllib2 脚本以便从 Django 站点访问 HTTPS Web 服务? 的相关文章

  • Virtualenv 在 OS X Yosemite 上失败并出现 OSError

    我最近更新到 OSX Yosemite 现在无法使用virtualenv pip 每当我执行 virtualenv env 它抛出一个 OSError Command Users administrator ux env bin pytho
  • 在Python中从大文件中搜索单词列表

    我是新蟒蛇 我有一个单词列表和一个非常大的文件 我想删除文件中包含单词列表中的单词的行 单词列表按排序给出 并且可以在初始化期间输入 我正在努力寻找解决这个问题的最佳方法 我现在正在进行线性搜索 这花费了太多时间 有什么建议么 您可以使用i
  • 从 Azure ML 实验中访问 Azure Blob 存储

    Azure ML 实验提供了通过以下方式读取 CSV 文件并将其写入 Azure Blob 存储的方法 Reader and Writer模块 但是 我需要将 JSON 文件写入 blob 存储 由于没有模块可以执行此操作 因此我尝试在Ex
  • 无法在 selenium 和 requests 之间传递 cookie,以便使用后者进行抓取

    我用 python 结合 selenium 编写了一个脚本来登录网站 然后从driver to requests这样我就可以继续使用requests进行进一步的活动 I used item soup select one div class
  • 协程从未被等待

    我正在使用一个简单的上下文管理器 其中包含一个异步循环 class Runner def init self self loop asyncio get event loop def enter self return self def e
  • 使用python从gst管道抓取帧到opencv

    我在用着OpenCV http opencv org 和GStreamer0 10 我使用此管道通过自定义套接字通过 UDP 接收 MPEG ts 数据包sockfd由 python 提供并显示它xvimagesink 而且效果很好 以下命
  • 如何确保 re.findall() 停止在正确的位置?

    这是我的代码 a import re re findall r lt title gt lt title gt a 结果是 title aaa
  • 类型错误:需要二进制或 unicode 字符串,得到 618.0

    I ve been trying to implement this ML Linear Model into my dataset https www tensorflow org tutorials estimator linear L
  • AttributeError:“模块”对象没有属性[重复]

    这个问题在这里已经有答案了 我有两个 python 模块 a py import b def hello print hello print a py print hello print b hi b py import a def hi
  • 如何使用scrapy检查网站是否支持http、htts和www前缀

    我正在使用 scrapy 来检查某些网站是否工作正常 当我使用http example com https example com or http www example com 当我创建 scrapy 请求时 它工作正常 例如 在我的pa
  • 根据其他单元格值更改多个单元格值

    我想更改包含的单元格moving to movingToOpenor movingToClose基于下一个单元格中给出的状态 有时循环会被中断并且不会从open to close or close to open 这是我当前的数据框 Dat
  • 使用 for 循环创建一系列元组

    我已经搜索过 但找不到答案 尽管我确信它已经存在了 我对 python 很陌生 但我以前用其他语言做过这种事情 我正在以行形式读取数据文件 我想将每行数据存储在它自己的元组中 以便在 for 循环之外访问 tup i inLine wher
  • 是否需要关闭没有引用它们的文件?

    作为一个完全的编程初学者 我试图理解打开和关闭文件的基本概念 我正在做的一项练习是创建一个脚本 允许我将内容从一个文件复制到另一个文件 in file open from file indata in file read out file
  • 使用另一个数据帧在数据帧中创建子列

    我对 python 和 pandas 很陌生 在这里 我有一个以下数据框 did features offset word JAPE feature manual feature 0 200 0 aa 200 200 0 200 11 bf
  • 检测是否从psycopg2游标获取?

    假设我执行以下命令 insert into hello username values me 我跑起来就像 cursor fetchall 我收到以下错误 psycopg2 ProgrammingError no results to fe
  • 如何将带有参数的Python装饰器实现为类?

    我正在尝试实现一个接受一些参数的装饰器 通常带有参数的装饰器被实现为双重嵌套闭包 如下所示 def mydecorator param1 param2 do something with params def wrapper fn def
  • Django 管理器链接

    我想知道是否有可能 如果可以的话 如何 将多个管理器链接在一起以生成受两个单独管理器影响的查询集 我将解释我正在研究的具体示例 我有多个抽象模型类 用于为其他模型提供小型的特定功能 其中两个模型是DeleteMixin 和GlobalMix
  • 如何编写一个接受 int 或 float 的 C 函数?

    我想用 C 语言创建一个扩展 Python 的函数 该函数可以接受 float 或 int 类型的输入 所以基本上 我想要f 5 and f 5 5 成为可接受的输入 我认为我不能使用if PyArg ParseTuple args i v
  • pandas 中数据帧中的随机/洗牌行

    我目前正在尝试找到一种方法来按行随机化数据框中的项目 我在 pandas 中按列洗牌 排列找到了这个线程 在 pandas 中对 DataFrame 进行改组 排列 https stackoverflow com questions 157
  • 用于插入或替换 URL 参数的 Django 模板标签

    有人知道 Django 模板标签可以获取当前路径和查询字符串并插入或替换查询字符串值吗 例如向 some custom path q how now brown cow page 3 filter person 发出请求 电话 urlpar

随机推荐

  • jQuery 覆盖 $.post 函数

    首先 我为我糟糕的英语道歉 希望有人能理解我的问题并帮助我 我正在开发一个使用大量 post 调用的项目 我想通过为所有调用添加相同的验证来改进它们 我不想一一更改所有脚本 那么有没有办法覆盖 post 函数以同时向所有脚本添加相同的内容
  • 如何在 Android 中使用选项卡小部件? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 谁能告诉我如何制作tab widget在安卓中 有一个开发人员指南展示了如何实现选项卡式活动 片段http developer android co
  • 用于浮点阈值操作的 SIMD

    我想让一些向量计算更快 并且我相信用于浮点比较和操作的 SIMD 指令可以有所帮助 操作如下 void func const double left const double right double res const size t si
  • Django 用不同的字段注释计数

    我有两个松散定义的模型 如下所示 class InformationUnit models Model username models CharField max length 255 project models ForeignKey P
  • 使用Python解析Gmail并将所有早于日期的内容标记为“已读”

    长话短说 我创建了一个新的 Gmail 帐户 并将其他几个帐户链接到它 每个帐户都有 1000 条消息 我正在导入这些帐户 所有导入的消息均以未读状态到达 但我需要它们显示为已读 我对 python 有一点经验 但我只使用 mail 和 i
  • 如何在#include 上将库名称放在头名称之前?

    我正在使用 cmake 编译具有以下结构的项目 Root LibA inc src LibB inc src main cpp 我在每个 LibX 每个 src 和 Root 文件夹上都有 CMakeLists 我的项目正在按预期编译和运行
  • 正则表达式匹配不包含所有指定元素的字符串

    我想找到一个正则表达式来匹配不包含所有指定元素的字符串 无论它们的顺序如何 例如 给定以下数据 one two three four one three two one two one three four 传递话语two three正则表
  • pip 抛出“TypeError: deprecated() ”错误

    我正在尝试安装一些软件包并开始出现错误 然后在ubuntu中使用多个命令更新一些东西 但错误是相似的 pip install U pip setuptools or python3 m pip install upgrade pip or
  • 来自现有文件的 NetBeans GUI 生成器

    我是 NetBeans IDE 的新手 我正在使用 NetBeans GUI 构建器来创建 GUI 我通过右键单击包并单击 新建 然后单击新的 JFrame 表单来创建一个新文件 它运行良好 但我有一个带有 JFrame 的 java 文件
  • 在 Django 模板中渲染外部定义的块

    我正在为 Django 编写一个简单的类似博客的应用程序 并试图获得首页帖子限制为 5 个的效果 并具有一次列出大约 100 个帖子的综合存档 100不现实 只是扔一个数字 由于博客文章块在两个页面之间看起来完全相同 减去显示的数量 因此我
  • django boto3:NoCredentialsError - 无法找到凭据

    我正在尝试使用boto3在我的 django 项目中将文件上传到 Amazon S3 凭证定义在settings py AWS ACCESS KEY xxxxxxxx AWS SECRET KEY xxxxxxxx S3 BUCKET xx
  • 如何在 VBA 中根据 A 列重复名称将整个行复制到其各自的工作表?

    我当前的代码将尝试使用 VBA 将基于列 A 重复名称的整行复制到其各自的工作表 如下所示 但它只适用于第一个重复的名称 而不适用于其余的名称 当我检查我的代码时 我意识到我的目标 在目标 Lbound到Ubound部分的部分 始终为0 所
  • 如何使用jquery或ajax以10秒的间隔刷新div

    任何帮助都值得这里的人们表示感谢 我正在用 php 构建一个 Web 应用程序 并且使用 Yii MVC 框架 它有很多内置工具 正如标题所说 我需要每10秒刷新一次div 目前我有这个ajax功能
  • 将数据标签添加到折线图[重复]

    这个问题在这里已经有答案了 我想使用 pandas matplotlib 在该图的圆圈顶部添加数据标签 使用 pandas 和 月份 作为索引从 Excel 文件加载数据 Importing the data Path xyz xlsx d
  • 如何对具有重置条件的列进行 SUM() ?

    我使用的是 Postgresql 9 2 我需要对按钮向上的数量进行求和 初始值为 100 但是如果我遇到名为 X 的行 我需要从该行中的 qty 值重新启动 SUM 例如 itemorder name qty 1 A 20 2 A2 35
  • Selenium/PageFactory:使用父元素的@FindBy查找子元素?

    我正在尝试将我的硒测试转换为使用页面对象模型 以及扩展的 FindBy 我有几个像这样的对象定义 public WebElement objectParent return driver findElement By name parent
  • 如何从 YouTube Analytics api 的 json 文件加载客户端凭据?

    我想从朋友的 YouTube 频道检索获利数据 我使用下面的 python 代码从他那里获取身份验证凭据 然后将其保存到 JSON 文件中 在此过程中 他必须单击链接并将密钥发送给我 我想通过保存凭据数据来避免这种情况 我想我已经做到了 但
  • 如何使用 jquery 将每 4 个元素包装在
  • 标签中?
  • 我需要每 4 包一次 product一个内连续的div li 标签 以便当有 ul div class product div div class product div div class product div div class pr
  • Mozilla 使用带有 js-ctypes 的 C DLL

    我正在构建一个 dll 然后将其与 Firefox 扩展一起使用 我设法在Windows下使用gcc构建了一个DLL include
  • 如何验证 urllib2 脚本以便从 Django 站点访问 HTTPS Web 服务?

    大家 我正在开发一个 django mod wsgi apache2 网站 该网站使用 https 为所有请求和响应提供敏感信息 如果用户未经过身份验证 所有视图都会被写入重定向 它还具有多个旨在像 RESTful Web 服务一样运行的视