如何使用cURL调试CORS请求?

the*_*hai 268 curl cors

如何使用cURL调试CORS请求?到目前为止,我找不到任何"模拟"预检请求的方法.

mon*_*sur 455

以下是使用curl调试CORS请求的方法.

使用cUrl发送常规CORS请求:

curl -H "Origin: http://example.com" --verbose \
  https://www.googleapis.com/discovery/v1/apis?fields=
Run Code Online (Sandbox Code Playgroud)

-H "Origin: http://example.com"标志是发出请求的第三方域.替换你的域名.

--verbose标志打印出整个响应,以便您可以看到请求和响应标头.

我在上面使用的URL是一个示例请求到支持CORS谷歌的API,但你可以在任何网址,你正在测试替代.

响应应包括Access-Control-Allow-Origin标题.

使用cUrl发送预检请求:

curl -H "Origin: http://example.com" \
  -H "Access-Control-Request-Method: POST" \
  -H "Access-Control-Request-Headers: X-Requested-With" \
  -X OPTIONS --verbose \
  https://www.googleapis.com/discovery/v1/apis?fields=
Run Code Online (Sandbox Code Playgroud)

这看起来类似于常规的CORS请求,但增加了一些内容:

-H标志增派预检请求头到服务器

-X OPTIONS标志表示这是HTTP OPTIONS请求.

如果预检请求成功,响应应该包括Access-Control-Allow-Origin,Access-Control-Allow-MethodsAccess-Control-Allow-Headers响应头.如果预检请求不成功,则不应显示这些标头,否则HTTP响应将不是200.

您还可以User-Agent使用-H标志指定其他标头,例如.

  • 或`--head`:`curl -H"来源:http://example.com"--head https://www.googleapis.com/discovery/v1/apis \?fields\=` (7认同)
  • 在S3的情况下,只有在给出正确的方法时才添加相应的标题,你可以使用`curl -H"Access-Control-Request-Method:GET"-H"来源:http:// example .com"-I https:// s3.amazonaws.com/your-bucket/file`. (7认同)
  • 该页面似乎没有返回任何CORS标头,这是正确的吗? (2认同)
  • 使用--include查看标题. (2认同)

Vil*_*kas 37

更新了涵盖大多数情况的答案

curl -H "Access-Control-Request-Method: GET" -H "Origin: http://localhost" --head http://www.example.com/
Run Code Online (Sandbox Code Playgroud)
  1. http:// localhost替换为您要测试的URL.
  2. 如果响应包括,Access-Control-Allow-*那么您的资源支持CORS.

替代答案的理由

我不时地谷歌这个问题,接受的答案永远不是我需要的.首先它打印响应体,这是很多文本.---head仅添加输出标头.第二,在测试S3 URL时,我们需要提供额外的标头-H "Access-Control-Request-Method: GET".

希望这会节省时间.

  • 这依赖于“--head”使curl打印出标题,但它也使curl发出“HEAD”请求而不是“GET”。根据您正在测试的内容,您可能想要发出“GET”请求。您可以通过添加“--IXGET”来做到这一点。 (3认同)
  • 这不是倒退吗?来源不应该是example.com吗? (3认同)
  • 如果我卷曲而没有设置原点并且可以返回响应和标头(包括access-control-allow-origin标头),这是否意味着我设置了错误的CORS?curl -X GET'https://www.endpoint.com'-H'Cache-Control:no-cache'--head (2认同)

bfo*_*ine 7

预检请求是使用OPTIONSHTTP 方法完成的。

\n

假设您想在从http://mysite.example.comhttps://myapi.example.com/foo的POST请求上测试 CORS ,命令应为:

\n
curl -XOPTIONS \\\n  -H "Access-Control-Request-Method: POST" \\\n  -H "Origin: http://mysite.example.com" \\\n  https://myapi.example.com/foo\n
Run Code Online (Sandbox Code Playgroud)\n

响应是一条OK错误消息,例如Disallowed CORS origin。如果您喜欢,您仍然可以使用包含标头。-i\xe2\x80\x99d。

\n

这比其他发出GETHEAD请求并要求您解释标头的响应要简单得多。

\n


Wol*_*ahl 5

下面的 bash 脚本“corstest”对我有用。它基于Jun的上述评论。

用法

corstest [-v] 网址

例子

./corstest https://api.coindesk.com/v1/bpi/currentprice.json
https://api.coindesk.com/v1/bpi/currentprice.json Access-Control-Allow-Origin: *
Run Code Online (Sandbox Code Playgroud)

阳性结果显示为绿色

./corstest https://github.com/IonicaBizau/jsonrequest
https://github.com/IonicaBizau/jsonrequest does not support CORS
you might want to visit https://enable-cors.org/ to find out how to enable CORS
Run Code Online (Sandbox Code Playgroud)

阴性结果以红色和蓝色显示

-v 选项将显示完整的 curl 标头

考斯特

./corstest https://api.coindesk.com/v1/bpi/currentprice.json
https://api.coindesk.com/v1/bpi/currentprice.json Access-Control-Allow-Origin: *
Run Code Online (Sandbox Code Playgroud)


Mal*_*ean 5

看起来这只是有效的:

curl -I http://example.com

在返回的标头中查找Access-Control-Allow-Origin: *

  • 请记住,如果需要与 API 请求一起提供诸如 cookie 之类的凭据,则“*”不起作用。在这种情况下,“Access-Control-Allow-Origin”响应以及“Access-Control-Allow-Credentials: true”中需要 FQDN。尽管 OP 未将凭据请求指定为要求,因此“*”适用于任何未经身份验证的请求。 (7认同)