单一使用下载链接是否符合HTTP规范?

时间:2017-09-01 15:49:53

标签: rest http

在宁静的Web服务环境中,为GET方法设置副作用是否可以接受?

单次使用下载链接,例如

if(!is.null(session)){
        pathname <- session$clientData$url_pathname
        hostname <- session$clientData$url_hostname
        port <- session$clientData$url_port

        url <- paste0(session$clientData$url_protocol,
            "//",
            hostname,
            if(port != "") paste0(":", port),
            if(pathname != "/") pathname)

将在下一个请求中返回200和“the thing”以及404。

HTTP规范说GET方法应该是安全的并且根据Button on Context Menu

  

如果定义的语义是,请求方法被认为是“安全的”    基本上只读;即,客户没有请求,并且确实如此    不要指望,原因服务器上的状态发生了任何变化    将安全方法应用于目标资源。

  

这种安全方法的定义并不妨碍实施      包括可能有害的行为,但事实并非如此      完全只读,或在调用保险箱时引起副作用      方法。然而,重要的是客户没有      请求其他行为,不能追究其责任      它

提供了几个澄清示例,使我认为不允许安全方法有目的地删除资源。

  

例如,大多数服务器都会附加请求信息以进行访问      每个响应完成时记录文件,不管是什么      方法,即使日志存储可能会被认为是安全的      变满并崩溃服务器。

  

同样,发起了安全请求      通过在Web上选择广告通常会有所帮助      收取广告帐户的效果。

  

例如,它是      基于Web的内容编辑软件常用于在其中使用操作      查询参数,例如“page?do = delete”。如果这样的目的      资源是执行不安全的操作,然后资源所有者必须      使用安全设备访问该操作时禁用或禁止该操作      请求方法。

单用链接显然是现实。我只是想知道他们是否滥用了这个规格,或者我只是不理解它。

有一个意见是好的,但已经制定了这些规范并理解他们的微妙之处将是最有说服力的。

2 个答案:

答案 0 :(得分:0)

在某些情况下,您所建议的内容是可以接受的,并不一定是滥用规范。

首先,2616说明了他们的安全方法:

  

不应该采取除了以外的行动的重要性   检索

短语“不应该”is defined as follows(强调补充):

  

这句话或短语“不推荐”意味着可能   特殊情况下存在有效理由   行为是可以接受的,甚至是有用的,但是充分的含义   应该理解并仔细权衡案例之前   实施此标签所描述的任何行为。

你链接到的新版本(我认为取代2616)不使用“不应该”这个词 - 但他们也没有用“MUST NOT”替换它。他们还承认,只要客户不承担责任,不排除副作用。所以我认为安全方法的想法是一样的。

因为规范承认有些情况可以,所以我们怎么知道你的情况如何 - 更重要的是,我们如何保持一般在规范的“精神”内,即确保我们不要滥用它?

我参考7231中的这句话:

  

区分安全和不安全方法的目的是为了   允许自动检索进程(蜘蛛)和缓存性能
  优化(预取)工作而不用担心造成伤害。

如果您的应用是私有内部网应用,并且您不关心此处提到的问题,那么您的方法就可以了。换句话说:考虑到GET可能发生的所有可能方式,你有没有这种副作用?

在RESTful指南之外工作并不总是坏事。确保您了解其效果非常重要。

尽管如此,如果您正在寻找一种通过HTTP实现可靠,一致的资源一次性交付的方法,那么值得阅读BilldehÓra的HTTPLR规范(http://www.dehora.net/doc/httplr/draft-httplr-01.html)。此方法依赖于客户端确认收到消息。您可能能够使用类似的东西来允许不知道一次性使用策略(蜘蛛等)的用户代理获取资源而不会产生副作用,但仍然允许参与的客户端导致资源在一个之后变得不可用得到。

这样的事务方法还有一个额外的好处,即允许客户端根据需要重新尝试下载。这很重要,否则服务器无法知道客户端是否成功收到了消息。

如果你真的需要从服务器端对任何可能的用户代理实施一次性策略,那么你原来的方法可能是最好的,但要记住它实际上是“最多一次”的策略。

答案 1 :(得分:0)

有时违反规范是唯一的方法,例如使用隐藏图像的网页访问计数器。请通过GET请求,但更新计数器。

然而有些事情可能会出错。遵循规范的应用程序可以假定发出GET请求不会产生任何副作用。因此,对于某种启用了防病毒功能的电子邮件服务器来说,完全有效,可以按照电子邮件中的链接来确保一切安全。如果你发送这个&#34;下载一次&#34;链接在收件人永远看不到的电子邮件中。出于同样的原因,电子邮件中的两个不同链接的“是 - 否”答案很难部署。但也在一个网页上:我记得谷歌浏览谷歌已知的唯一用户页面的链接,因为里面有一个分析脚本,因为该页面包含这些臭名昭着的链接副作用谷歌实际上是在改变答案访问它的人......

在隐藏图像计数器的情况下,假命中并不是真正的问题,它们在任何情况下都不被认为是非常可靠的,但是在&#34; download-once&#34;链接可能有问题。