3

我很困惑为什么这两件事是或似乎是互斥的,并且想知道是否有办法在 PHP-5.4 上同时使用这两者。尝试设置此选项时,我收到以下错误:

curl_setopt(): CURLOPT_FOLLOWLOCATION cannot be activated when an open_basedir is set

我正在使用需要设置 CURLOPT_FOLLOWLOCATION 的 MailChimp API 库。重定向可能会发生,并且应该遵循,这正是 Internet 的工作方式。

我也在域上使用 open_basedir。我想围住网站能够访问的目录。这只是一个安全的东西,以及安全带和其他安全措施。

那么,有没有办法同时使用两者呢?我希望 CURL 遵循重定向,但也保持 PHP 脚本对已定义目录的本地文件访问。我见过的唯一一种攻击这个问题的方法是在重定向之后模拟 CURL,但这看起来很笨拙,然后 CURL 已经被设计为这样做了。

编辑:

如果不清楚,这是在我正在使用的包中抛出错误的行:

curl_setopt($this->ch, CURLOPT_FOLLOWLOCATION, true);

IMO PHP 保护过度,它应该允许我这样做。那么有没有办法 - 无需破解/分叉这个包 - 告诉 PHP,“看,我知道我在这里做什么”?

我已将其作为包开发人员的问题提出,但迄今为止没有得到回应。如果包支持传输层的注入,那么我可以通过使用 PHP 的 curl 函数的替代方法来解决它。

4

2 回答 2

4

我将撤回这个问题,因为它似乎让人们感到困惑(编辑:对不起,听起来居高临下,这不是故意的;我没有正确解释这个问题,以及我和其他人对任何建议的解决方案施加的限制)。

答案似乎是,“不,你不能那样做”。PHP curl (curl_setopt) 上的 CURLOPT_FOLLOWLOCATION 选项和 php.ini 中的 open_basedir 选项基本上是不兼容的,并且没有任何编程方式可以让它们一起工作。

我将分叉第三方包,用代码中的手动重定向解决方法替换 CURLOPT_FOLLOWLOCATION 选项,在 SO 上有一些示例。我也会继续推动包开发人员修复这个错误。

感谢您花时间回复。

编辑:这里真正的问题是由于十年前提出的错误而由 PHP 强加的钝器解决方案:

https://bugs.php.net/bug.php?id=30609

问题出在 curl 库中 - 如果 PHP 告诉它不要潜入本地文件系统(也许 open_basedir 目录除外),则不应允许它潜入本地文件系统。由于 curl 和 PHP 整整十年都没有一起解决这个问题,所以是时候停止使用 curl 了——它不适合目的。国际海事组织。

于 2013-10-31T16:09:42.907 回答
0

Curl 是单独的库,不应直接受 PHP 的open_basedir. 你怎么称呼这个?你能提供一些代码和更详细的解释吗?

Curl 目标应用程序具有限制性open_basedir

Curl 源应用程序具有限制性open_basedir

是两个不同的东西。PHPopen_basedir应该只影响传入的请求。

编辑: PHP 5.3.0 之后open_basedir可以更改运行时。它在手册中列出。这在一般部分也有解释,但解释非常非常模糊:

Name:         Default:  Changeable:     Changelog:
open_basedir    NULL    PHP_INI_ALL     PHP_INI_SYSTEM in PHP < 5.3.0

如果您有权访问或控制源,只需在需要时调用它。干杯!

于 2013-10-30T06:38:42.187 回答