【问题标题】:How should I protect a web service against a browser's automatic background fetching?我应该如何保护 Web 服务免受浏览器的自动后台获取?
【发布时间】:2013-10-08 16:04:39
【问题描述】:

我有一个无聊的公司网站,用 Django 构建,做无聊的公司事情。

本网站的一个组件是一项后台任务,用于将一些无聊的公司事物从一个地方 FTP 传输到另一个地方。当你转到相应的URL时,可以触发后台worker的变化(即:启动、停止、检查状态)。

这里的问题是,当我在 Chrome 中工作时,有时键入类似 URL 的一部分会导致 Chrome 发送 GET 请求(或 Django 将其解释为 GET 请求的内容)以获取属于Web 服务向后台工作人员发送指令。换句话说,无需在键盘上按 Enter,就可以启动或停止 worker。

问题不是 Chrome 的设置。是的,我可以更改设置并为自己解决问题,但这不会阻止将来有人输入 URL 并触发相同的行为。

我真正想要的是一种将这些预取调用与常规用户发起的调用区分开来的方法,但这似乎是不可能的。不过,我可能是错的。除此之外,我想要一个告诉 Chrome 不要获取该页面的设置。不幸的是,有一堆无聊的公司琐事阻碍了一些简单的出路。

对于将 cookie 视为垃圾的计算机和在浏览器上没有网站本身可供点击的链接的非技术人员,都必须可以调用 Web 服务。无法将 Web 服务移动到单独的子域。 Web 服务不能受到 Django 或任何类似本地化身份验证的保护。我希望调用仍然像在浏览器的地址栏中输入 URL 一样简单,但这不是任何要求。

【问题讨论】:

    标签: django google-chrome


    【解决方案1】:

    chrome 所做的事情被认为是“有效的”,因为在 HTTP 协议中,假设 GET 请求不会引起副作用(除了返回响应之外发生的事情,例如触发后台工作人员)。它们应被视为仅用于检索数据。换句话说,GET requests should be "Safe and Idempotent"。让 GET 请求做的不仅仅是检索数据(例如让后台工作人员启动),这违反了 HTTP 协议。

    将您的网站更改为仅在 POST 请求上触发这些“更改”。 Google chrome 不会像 GET 请求那样发出任意 POST 请求。您仍然可以对用户使用 GET 请求来检索 HTML 页面,该页面可能具有允许他们执行 POST 以激活各种服务的表单,但用户点击的资源 (URL) 会产生“副作用”只有当用户发布到资源时才会产生这种副作用。

    在 Django 视图中,您可以使用request.method 属性检测请求是 GET、POST 还是其他方法:

    if request.method == 'POST':
        do_something()
    

    【讨论】:

      猜你喜欢
      • 2011-08-03
      • 2017-10-21
      • 2017-12-04
      • 1970-01-01
      • 2016-07-29
      • 2016-10-24
      • 2012-01-02
      • 2014-10-17
      • 2011-05-07
      相关资源
      最近更新 更多