PHP:可以一起使用CURLOPT_FOLLOWLOCATION和open_basedir吗?

时间:2013-10-23 11:04:12

标签: php curl mailchimp open-basedir

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

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

我使用的MailChimp API库需要设置CURLOPT_FOLLOWLOCATION。重定向可以发生,应该遵循,这就是互联网的工作方式。

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

那么,有没有办法同时使用它们?我希望CURL遵循重定向,但也保持PHP脚本的本地文件访问到定义的目录。我见过的解决这个问题的唯一方法就是在重定向后模拟CURL,但这看起来很笨拙,那么CURL就已经设计好了。

编辑:

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

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

IMO PHP过于保护,它应该允许我这样做。那么有没有一种方法 - 没有黑客/分支这个包 - 告诉PHP,“看,我知道我在这里做什么”?

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

2 个答案:

答案 0 :(得分:4)

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

答案似乎是,“不,你不能这样做”。 PHP curl(curl_setopt)上的CURLOPT_FOLLOWLOCATION选项和php.ini中的open_basedir选项基本上是不兼容的,并且没有一种程序化的方法可以让它们协同工作。

我将fork第三方包替换CURLOPT_FOLLOWLOCATION选项,并在代码中使用手动重定向解决方法,在SO上有一些示例。我会继续推动软件包开发人员修复这个bug。

感谢您花时间回复。

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

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

问题出现在curl库中 - 如果PHP告诉它不应该允许它潜入本地文件系统(可能除了open_basedir目录)。由于curl和PHP没有在一起完成这十年的整理,所以是时候停止使用卷曲 - 它不适合用途。 IMO。

答案 1 :(得分:0)

Curl是独立的lib,不应该直接受到PHP open_basedir的影响。 你怎么称呼这个?你能提供一些代码和更详细的解释吗?

Curl目标应用具有限制性open_basedir

Curl源应用具有限制性open_basedir

是两件不同的事情。 PHP的open_basedir应仅影响传入请求。

编辑: 在PHP 5.3.0之后 open_basedir可以更改运行时。它是listed in the manual。这也解释了in the general section,但解释非常非常模糊:

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

如果您有权访问或关闭源代码,请仅在需要时调用它。 干杯!