curl 跨源请求需要用户代理才能工作?



我在尝试查询我的跨域 API 时遇到问题。

这是正在发生的事情的简单示例:

curl -i -X POST https://example.com/api/v1/log/create -d 'value=fesfse' -d 'type=3'
HTTP/1.1 403 Forbidden
Date: Thu, 15 Jun 2017 15:07:24 GMT
Content-Type: text/html; charset=iso-8859-1
Content-Length: 219
Set-Cookie: SERVERID31396=234083; path=/; max-age=900
Server: Apache
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: *
Access-Control-Max-Age: 0
Access-Control-Allow-Headers: *
Vary: Accept-Encoding
X-IPLB-Instance: 9386
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access /api/v1/log/create
on this server.</p>
</body></html>

但是添加用户代理的相同请求正在工作(无论值是多少)!

curl -i -X POST https://example.com/api/v1/log/create -d 'value=fesfse' -d 'type=3' -H 'User-Agent: toto'
HTTP/1.1 200 OK
Date: Thu, 15 Jun 2017 15:09:27 GMT
Content-Type: application/json
Transfer-Encoding: chunked
Set-Cookie: SERVERID31396=234083; path=/; max-age=900
Server: Apache
X-Powered-By: PHP/7.0.15
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: *
Access-Control-Allow-Headers: *
Cache-Control: no-cache, private
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 58
Access-Control-Max-Age: 0
X-IPLB-Instance: 9387
{"status_code":200,"message":null,"data":null}

它是 ovh.com 上的共享托管服务器,在Apache 2上运行php 7.0.15。
谁能解释这种行为?

Curl 有一个内置的用户代理字符串,就像User-Agent: curl/7.51.0一样,如果您不指定一个,它会使用它。找到拒绝来自它的请求的服务器并不少见。(这很愚蠢,因为它很容易伪造。如果主机像这样挑剔,你可以从真正的浏览器提供一个用户代理字符串来欺骗主机。

您发出请求的服务器上的代码查看用户代理标头并拒绝某些请求。大概是基于它们不是它信任的浏览器或机器人。

最新更新