首页 > 解决方案 > 是传入 post curl 还是 html 表单

问题描述

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

标签: phpcurlpost

解决方案


有一种方法,但请注意它很容易被 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标题来确定调用应用程序......但不要依赖它。


推荐阅读