草庐IT

php - 保护无 session RESTful API 端点

coder 2024-04-06 原文

我已经为部分遵循 this very good blog post by Riyad Kalla 的项目创建了一个简单的 RESTful API .现在,我已经在 Stack Overflow 上阅读了数十个类似的问题,但我似乎无法找到我的安全问题的答案。

简单地说,我的请求是这样的:

  1. 客户端有一个公共(public) API key (纯文本,任何嗅探网络流量或正确检查代码源的人都可以访问)
  2. 客户端使用公共(public)API key 向服务器发送请求
  3. 服务器有一个 secret 的 API key (除了开发者以外的任何人都知道)
  4. 服务器创建一个由客户端请求数据和 secret API key 组成的 HMAC-SHA1 哈希
  5. 服务器向 API 服务器发送与客户端请求相同的请求,但包括生成的 HMAC-SHA1
  6. API 服务器根据它收到的公共(public) API key 在其数据库中查找 secret API key
  7. API 服务器使用与开发者服务器相同的数据重新创建 HMAC-SHA1 哈希
  8. 如果哈希匹配,请求被认为是有效的并被正常处理

我担心有人使用我的服务可以获取公共(public) API key (比方说通过嗅探网络流量),然后简单地将客户端最初通过浏览器使用 AJAX 直接向开发人员的服务器执行的相同请求 cURL。因此,恶意用户可以被认证为合法用户,并使用其他人的 secret API key 访问 API。

我会尝试举一个具体的例子。通常我会这样做:

  1. 向我的服务器发送 AJAX 获取请求。
  2. 我的服务器使用我的 API key 对我的请求进行哈希处理,并将其发送到 API 服务器。
  3. API 服务器验证我的请求并返回负载。

但我很害怕:

  1. 博士邪恶会嗅探我的公共(public) API key 。
  2. 博士Evil 将使用我的公共(public) API key 向我的服务器发送 get 请求。
  3. 我的服务器将使用我的 API key 对 Dr. Evil 的请求进行哈希处理,并将其发送到 API 服务器。
  4. API 服务器验证并返回负载以完成邪恶博士的邪恶计划。
  5. 博士邪恶的笑是邪恶的笑。

我遗漏了什么或者这只是 RESTful API 游戏的一部分?

更新:我自愿省略任何形式的时间戳验证,以保持简单,只关注身份验证问题。

更新 2:我向流程添加了一个 $_SERVER['HTTP_REFERER'] 验证。此处的目标是客户端必须随请求一起发送引荐来源网址,并且它必须与 API 端数据库中列出的引荐来源网址相匹配。不幸的是,HTTP 引荐来源网址很容易被伪造。这是另一个级别的安全性,但仍不完美。

更新 3:我更改了我的服务器端代码以将引荐来源网址设置为远程 IP 地址。这会强制发送到我的服务器的每个请求都希望使用 secret API key 进行哈希处理,最终到达具有原始请求 IP 地址的 API 服务器。然后可以验证此 IP,请求可以通过。我相信伪造 $_SERVER['REMOTE_ADDR'] 是可能的,但它比伪造 $_SERVER['HTTP_REFERER'] 更复杂......仍然不完美我猜。

更新 4:根据这些帖子:How to fake $_SERVER['REMOTE_ADDR'] variable?https://serverfault.com/questions/90725/are-ip-addresses-trivial-to-forge , 伪造 $_SERVER['REMOTE_ADDR'] 是可能的,但很困难。但是,不可能从伪造的请求中收到响应,因为您无法控制伪造的网络。请求可以成功验证,但其响应不会落入恶意之手。

最佳答案

通过使用 HMAC,您走在了正确的轨道上。但是,还有两件事可以使您的应用程序更加安全。

  1. 在客户端 POST 中需要一个时间戳,需要在服务器时间的 5 分钟内验证。它也应该包含在 HMAC 生成中。如果有人试图更改此设置,则 HMAC 签名将无效,除非他们拥有更新 HMAC 签名的 key 。
  2. 使用 SSL,并进行证书验证。防止中间人攻击。不允许任何非 SSL 请求。

关于php - 保护无 session RESTful API 端点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14324792/

有关php - 保护无 session RESTful API 端点的更多相关文章

  1. ruby-on-rails - 这个 C 和 PHP 程序员如何学习 Ruby 和 Rails? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它

  2. ruby-on-rails - 在 Rails 中使用 accepts_nested_attributes_for + 批量赋值保护 - 2

    假设你有这个结构:classHouse请注意,Tv的用户是故意不可访问的。所以你有一个三层嵌套的表单,允许你在一个页面上输入房子、房间和电视。这是Controller的创建方法:defcreate@house=House.new(params[:house])if@house.save#...standardstuffelse#...standardstuffendend问题:您究竟如何为每台电视填充user_id(它应该来自current_user.id)?什么是好的做法?这是我在其中看到的catch22。将user_ids直接填充到params散列中(它们嵌套得很深)保存将失败,因

  3. ruby - Rubocop 保护子句困境 - 不必要 if else VS 行太长保护子句 - 2

    我有一段代码,其中有一个带有保护子句的raise语句:defvalidate_indexindex#ChangetoSizeErrorraiseArgumentError,"Sizeofindex(#{index.size})doesnotmatches"\"sizeofvector(#{size})"ifsize!=index.sizeend在这一点上,rubocop给出了罪行:Style/MultilineIfModifier:Favoranormalif-statementoveramodifierclauseinamultilinestatement.我将我的代码修改为正常if

  4. ruby-on-rails - Rails 还是 Sinatra? PHP程序员入门学习哪个好? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。我使用PHP的时间太长了,对它感到厌倦了。我也想学习一门新语言。我一直在使用Ruby并且喜欢它。我必须在Rails和Sinatra之间做出选择,那么您会推荐哪一个?Sinatra真的不能用来构建复杂的应用程序,它只能用于简单的应用程序吗?

  5. ruby-on-rails - PHP 魔术方法 __call、__get 和 __set 的 Ruby 等价物 - 2

    我很确定Ruby有这些(等同于__call、__get和__set),否则find_by将如何在Rails中工作?也许有人可以举一个简单的例子来说明如何定义与find_by相同的方法?谢谢 最佳答案 简而言之你可以映射__调用带有参数的method_missing调用__设置为方法名称以'='结尾的method_missing调用__获取不带任何参数的method_missing调用__调用PHPclassMethodTest{publicfunction__call($name,$arguments){echo"Callingob

  6. ruby - Lisp - 是否适合网络编程/应用程序(交互式)? ruby 的方式是? php的方式是? - 2

    Lisp是否适合Web编程/应用程序(交互式),就像ruby​​和php一样?需要考虑的事情是:易于使用可部署性难度(尤其是对于编程初学者而言)(编辑)在阅读PaulGraham'sessay之后,我特别提到了CommonLisp.将是我的第一门编程语言。在这方面。这样做合适吗?我听说Clojure的宏功能不如CommonLisp的强大,这就是我尝试学习Clojure的原因。它教授编程并且非常强大。 最佳答案 Lisp是一个语系,而不是单一的语言。为了稍微回答您的问题,是的,存在用于各种Lisp方言的Web框架,例如用于Common

  7. 软件工程毕业设计课题(81)微信小程序毕业设计PHP校园跑腿小程序系统设计与实现 - 2

        项目背景和意义 目的:本课题主要目标是设计并能够实现一个基于微信校园跑腿小程序系统,前台用户使用小程序发布跑腿任何和接跑腿任务,后台管理使用基于PHP+MySql的B/S架构;通过后台管理跑腿的用户、查看跑腿信息和对应订单。意义:手机网络时代,大学生通过手机网购日常用品、外卖外卖、代取快递等已不再是稀奇的事情。此外,不少高校还流行着校园有偿工作,校园跑腿就成了大学生创业服务项目。        因为你在校园里,所以不会有进入的限制。并不是所有的外卖平台都可以随意进入校园,比如小黄和小蓝的双打外卖平台。许多大学禁止送餐进入学校,更不用说送餐进入宿舍了。这一措施使得校园服务市场的竞争相对不

  8. K8s部署PHP项目 - 2

    前言    前端时间PHP项目部署升级需要,需要把Laravel开发的项目部署K8s上,下面以laravel项目为例,讲解采用yaml文件方式部署项目。一、部署步骤1.创建Dockerfile文件Dockerfile是一个用来构建镜像的文本文件,在容器运行时,需要把项目文件和项目运行所必须的组件安装其中。#基础镜像FROMphp:7.4-fpm#时区ARGTZ=Asia/Shanghai#更换容器时区RUNcp"/usr/share/zoneinfo/$TZ"/etc/localtime&&echo"$TZ">/etc/timezone#替换成阿里apt-get源RUNsed-i"s@http

  9. ruby - 如何使用 Devise 来保护 delayed_job_web 接口(interface)? - 2

    我正在使用delayed_job_webgem来监控延迟的作业。https://github.com/ejschmitt/delayed_job_web可以使用我的routes.rb中的这一行访问它:match"/delayed_job"=>DelayedJobWeb,:anchor=>false我站点的每个其他区域都需要使用Devisegem登录。我如何使它也需要登录?在自述文件中,他们建议将以下内容添加到config.rb:ifRails.env.production?DelayedJobWeb.useRack::Auth::Basicdo|username,password|us

  10. ruby-on-rails - PHP 开发人员学习 Ruby 和 Ruby on Rails - 2

    关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于StackOverflow来说是偏离主题的,因为它们往往会吸引自以为是的答案和垃圾邮件。相反,describetheproblem以及迄今为止为解决该问题所做的工作。关闭9年前。Improvethisquestion我对学习Rails很感兴趣已经有一段时间了,我觉得现在正是浸入其中并实际动手实践的好时机。在过去的一周里,我阅读了所有我能找到的关于Ruby和RubyonRails的免费电子书。我刚刚读完RubyEssentials。我也一直在玩htt

随机推荐