【问题标题】:What is the best alternative to HTTP_ORIGIN/HTTP_REFERERHTTP_ORIGIN/HTTP_REFERER 的最佳替代方案是什么
【发布时间】:2021-01-17 22:10:27
【问题描述】:

我正在尝试做这样的事情:

$origin = $_SERVER['HTTP_ORIGIN'];
if (strpos($origin, "mydomain.com") > 0)
    header('"Access-Control-Allow-Origin: http://' . $origin . '"');

我希望我们的任何子域 (*.mydomain.com) 能够使用这些页面,但阻止外部实体访问。但是,HTTP_ORIGIN 或 HTTP_REFERER 都不起作用(有一段时间没有使用它们,但它们曾经使用过)。我得到了错误

未定义索引:HTTP_ORIGIN

同样适用于 HTTP_REFERER。另外,我知道这两种方法都不安全,并且外部 URL 可能会被欺骗。

注意:我知道有些浏览器不支持这些,但这里不相关,因为不涉及浏览器。我在本地(在远程机器上)使用 curl 直接在服务器上调用页面(Apache2 和 PHP5.6)。

那么捕获调用脚本域的最佳替代方法是什么?

【问题讨论】:

  • 忽略你的检查也匹配xmydomain.com.evil.com这一事实,以及标题参数中无关的双引号,代码是有意义的。您只需检查 $_SERVER 中是否确实存在 HTTP_ORIGIN。 isset 可以做到。
  • 您说得很好,但我可以改进检查。就 isset 而言,我已经知道 HTTP_ORIGIN 不存在,这就是我需要的替代方法。
  • 别无选择。如果客户不告诉你,你不知道。这里的所有都是它的。当然,如果标头丢失,您可以简单地拒绝请求。
  • 但它必须传递一个标头,因为我确实收到了 CORS 错误。还是我在这里误解了什么?

标签: php apache http-headers


【解决方案1】:
if(isset($_SERVER['HTTP_ORIGIN']) && preg_match('!^http(s)?://([a-z0-9\-]+\.)?example\.com$!is', $_SERVER['HTTP_ORIGIN']))
{
    header('Access-Control-Allow-Origin: '.$_SERVER['HTTP_ORIGIN']);
}

我正在使用这个,你可以试试。请记住,如果浏览器不发送原始标头,它将传递参数。

或使用 htaccess:

SetEnvIf Origin "^http(s)?://([a-z0-9\-]+\.)?example\.com$" AccessControlAllowOrigin=$0
Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
Header merge Vary Origin

【讨论】:

    猜你喜欢
    • 2017-06-11
    • 1970-01-01
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    相关资源
    最近更新 更多