【发布时间】:2019-12-01 10:29:58
【问题描述】:
有没有办法确定传入的 POST 是来自 html 表单帖子还是来自服务器到服务器的帖子(例如 curl)?
【问题讨论】:
-
您需要将标识符设置为参数(或)使用特殊的自定义标头(或)检查
host-header
有没有办法确定传入的 POST 是来自 html 表单帖子还是来自服务器到服务器的帖子(例如 curl)?
【问题讨论】:
host-header
有一种方法,但请注意它很容易被 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 标头来确定调用应用程序...但不要依赖它。
【讨论】:
Accept 和 Content-Type 标头。保持简单,不要根据User-Agent 改变响应(请参阅我的回答中的浏览器 v 功能检测)