php - 是传入 post curl 还是 html 表单
问题描述
有没有办法找出传入的 POST 是来自 html 表单帖子还是来自服务器到服务器的帖子(例如 curl)?
解决方案
有一种方法,但请注意它很容易被 HTTP 客户端掩盖和覆盖,因此它不可靠。
您正在寻找User-Agent
标题。cURL 将默认为,User-Agent: curl/7.54.1
而 Web 浏览器将默认为其浏览器的描述。嗯……经常。一些浏览器会伪造他们的 UA,因为一些网站进行浏览器检测而不是特征检测,尽管这是一个坏主意,但仍然相当普遍。
在 PHP 中,您可以从$_SERVER['HTTP_USER_AGENT']
. 例如,如果我运行curl -sS https://mywebsite.dev/example.php
,那么 example.php 将与 .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
(是的 - 也检查一下那个答案)。
鉴于此示例,您的服务器代码将完全不知道发出此请求的是 Web 浏览器还是 cURL。您可能可以继续使用其他信号,例如 cookie 和其他标头,但它们也可能被伪造。
鉴于 User-Agent 标头如此频繁地被屏蔽,它可能不是基于您的代码的最可靠的东西。例如,如果您正在构建一个 API,并且您想确定是您自己的应用程序还是其他人调用您的 API,那么您希望依靠 API 令牌、身份验证和其他自定义标头等内容来为您的应用程序提供更强的信任信号...但这超出了您的问题范围。
所以TLDR;是的 - 您可以使用User-Agent
标题来确定调用应用程序......但不要依赖它。
推荐阅读
- mysql - MySQL server has gone away 错误的罕见原因
- html - 列何时缩小到其最大值以下?
- asp.net-core - DB First,ASP Net Core 2.1,EF6:InvalidOperationException:在应用程序配置文件中找不到名为“DataContext”的连接字符串
- java - FileWriter 不写入文件
- javascript - 谷歌图表组件正在屏幕中重新渲染-react js
- android-studio - 如何升级到 Android SDK 版本 29.0.3?
- javascript - 遍历 JSON 响应并将与另一个 JSON 响应匹配的值返回为新的键值
- django - 根据 ChoiceField 发送到不同的电子邮件
- azure - 如何在门户 Azure 中添加自定义域?
- javascript - 这种自我引用风格是可接受的还是反模式的?