【问题标题】:Is incoming post Curl or html form是传入 post curl 还是 html 表单
【发布时间】:2019-12-01 10:29:58
【问题描述】:

有没有办法确定传入的 POST 是来自 html 表单帖子还是来自服务器到服务器的帖子(例如 curl)?

【问题讨论】:

  • 您需要将标识符设置为参数(或)使用特殊的自定义标头(或)检查host-header

标签: php curl post


【解决方案1】:

有一种方法,但请注意它很容易被 HTTP 客户端屏蔽和覆盖,因此它不可靠。

您正在寻找 User-Agent 标头。 cURL 将默认为User-Agent: curl/7.54.1,而 Web 浏览器将默认为其浏览器的描述。嗯……经常。有些浏览器会伪造他们的 UA,因为有些网站会使用 browser detection not feature detection,尽管这是一个坏主意,但仍然很普遍。

在 PHP 中,您可以从 $_SERVER['HTTP_USER_AGENT'] 检索用户代理。例如,如果我运行 curl -sS https://mywebsite.dev/example.php,那么 example.php 中的 $_SERVER['HTTP_USER_AGENT'] 将与 curl/7.54.0 有点相似。

User-Agent 标头(与所有客户端请求标头一样)很容易被伪造。使用 cURL 我可以很容易地发送一个假标题。以这个命令为例:

curl -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.89 Safari/537.36" http://stackoverflow.com/questions/28760694/how-to-use-curl-to-get-a-get-request-exactly-same-as-using-chrome

(是的 - 也请查看 SO 答案)。

鉴于此示例,如果是 Web 浏览器或 cURL 发出此请求,您的服务器代码将完全不知道。您也许可以继续使用其他信号,例如 cookie 和其他标头,但它们也可能被伪造。

鉴于 User-Agent 标头如此频繁地被屏蔽,它可能不是作为代码基础的最可靠的东西。例如,如果您正在构建一个 API,并且您想确定是您自己的应用程序还是其他人调用您的 API,那么您希望依靠 API 令牌、身份验证和其他自定义标头等内容来为您的应用程序提供更强的信任信号...但这超出了您的问题范围。

所以 TLDR;是的 - 您可以使用 User-Agent 标头来确定调用应用程序...但不要依赖它。

【讨论】:

  • 然后跟进 - 虽然 $_SERVER 在原始 php 中可用,但大多数现代框架将为您提供更安全的抽象来访问请求标头和参数等内容;我遵从您选择的框架的文档了解实现细节。
  • 它与支付 API 有关,因此必须 100% 可靠。看来我必须在标题上使用 auth 方法。
  • 在这种情况下,您的问题的目的是“如何保护 HTTP 端点”。您会在 SO 和其他 el Google 上找到许多保护 API 的方法。
  • 不,这不是出于安全原因。它是我将如何回应他们的问题。对于 server2server,我只需要打印结果,但如果它们通过 html 表单出现,我必须进行重定向
  • 如果您希望根据客户端更改响应,请明确说明内容协商并使用 AcceptContent-Type 标头。保持简单,不要根据User-Agent 改变响应(请参阅我的回答中的浏览器 v 功能检测)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-05
  • 2019-01-24
  • 2016-04-08
  • 1970-01-01
  • 1970-01-01
  • 2014-11-06
相关资源
最近更新 更多