PHP: можно ли использовать CURLOPT_FOLLOWLOCATION и open_basedir вместе?

Я сбит с толку, почему эти две вещи являются или кажутся взаимоисключающими, и мне интересно, есть ли способ использовать обе на PHP-5.4. Пытаясь установить этот параметр, я получаю следующую ошибку:

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

Я использую библиотеку API MailChimp, которая требует установки CURLOPT_FOLLOWLOCATION. Перенаправления могут происходить, и им следует следовать, и именно так работает Интернет.

Я также использую open_basedir в домене. Я хочу ограждать каталоги, к которым сайт может получить доступ. Это просто вещь безопасности, и пояса и подтяжки вместе с другими мерами безопасности.

Итак, есть ли способ использовать оба вместе? Я хочу, чтобы CURL следовал перенаправлениям, но также сохранял локальный доступ к файлам PHP-скриптов к определенным каталогам. Единственный подход, который я видел, который решает эту проблему, — это тот, который эмулирует CURL после перенаправления, но это кажется неуклюжим, тогда CURL уже предназначен для этого.

Редактировать:

Если это неясно, это строка, выдающая ошибку в пакете, который я использую:

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

IMO PHP чрезмерно защищает, и это должно позволить мне это сделать. Итак, есть ли способ — без взлома/разветвления этого пакета — сказать PHP: «Смотрите, я знаю, что я здесь делаю»?

Я поднял это как проблему с разработчиками пакета, но до сих пор не получил ответа. Если бы пакет поддерживал инъекцию транспортного уровня, я мог бы просто обойти это, используя альтернативу PHP-функциям curl.


person Jason    schedule 23.10.2013    source источник
comment
Большинство тем, которые я нашел, просто говорят: выключите open_basedir. Ну, нет, я не хочу этого делать. Это одна из вещей, которые мы делаем, чтобы уменьшить риск распространения ущерба между доменами, если произойдет самое худшее, и кто-то проникнет в серверную часть сайта.   -  person Jason    schedule 23.10.2013
comment
Возможно, проблема в том, что curl обходит параметр open_basedir в PHP, работая в библиотеке curl вне контроля PHP, а PHP просто пытается помочь, не давая мне совершить ошибку. Однако я доверяю URL-адресу, по которому отправляется curl, поэтому это должно быть мое решение. Могу ли я не говорить PHP, что перенаправлениям можно доверять, так что дерзайте и позвольте мне сделать это? ;-)   -  person Jason    schedule 23.10.2013
comment
Эти вопросы, кажется, говорят о том, что мне нужно взломать внешний пакет, чего я хотел попробовать и избежать: stackoverflow.com/questions/3890631/ Другие блоги также предоставляют пример кода для отслеживания перенаправлений из-за пределов вызова curl.   -  person Jason    schedule 30.10.2013


Ответы (2)


Я собираюсь снять этот вопрос, так как он, кажется, сбивает людей с толку (отредактируйте: извините, прозвучало снисходительно, что не было задумано; я не объясняю должным образом проблему и ограничения, наложенные как мной, так и другими на любое предлагаемое решение ).

Ответ, кажется, "нет, вы не можете этого сделать". Параметр CURLOPT_FOLLOWLOCATION в PHP curl (curl_setopt) и параметр open_basedir в php.ini в основном несовместимы, и нет никакого программного способа заставить их работать вместе.

Я разветвлю сторонний пакет, заменив параметр CURLOPT_FOLLOWLOCATION на обходной путь ручного перенаправления в коде, для которого есть несколько примеров на SO. Я буду продолжать настаивать на том, чтобы разработчики пакетов исправили эту ошибку.

Спасибо, что нашли время ответить.

Редактировать: настоящая проблема здесь - это решение с тупым инструментом, навязанное PHP из-за ошибки, возникшей ДЕСЯТИЛЕТИЕ назад:

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

Проблема в библиотеке curl — ей не должно быть позволено погружаться в локальную файловую систему, если PHP говорит об этом (за исключением, возможно, каталогов open_basedir). Поскольку curl и PHP не собирались вместе, чтобы разобраться в этом целое десятилетие, пора прекратить использовать curl - он не подходит для этой цели. ИМО.

person Jason    schedule 31.10.2013
comment
Хорошо, но в этом случае вы не можете просто изменить open_basedir во время выполнения и только тогда, когда вы делаете этот вызов cUrl? - person Borislav Sabev; 01.11.2013
comment
Если это возможно, то это, безусловно, поможет. Если вы хотите выставить это как ответ, я отзову свой. - person Jason; 01.11.2013
comment
Ответ отредактирован. Я был действительно уверен, что упомянул об этом в одном из своих комментариев, но, похоже, это было не так. В любом случае, самое главное: решена ли проблема? - person Borislav Sabev; 01.11.2013
comment
Я исследовал это и пробовал разные вещи, и я также пришел к тому же выводу, что у вас не может быть обоих по какой-то причине, которая ускользает от логики. Очень жаль, потому что open_basedir на самом деле полезная мера безопасности. - person Mahn; 20.06.2016

Curl является отдельной библиотекой и не должен напрямую зависеть от PHP open_basedir. Как ты это называешь? Можете ли вы предоставить код и более подробное объяснение?

"целевое приложение Curl имеет ограничительный open_basedir"

и

"исходное приложение Curl имеет ограничения open_basedir"

две разные вещи. PHP open_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

Если у вас есть доступ к источнику или власть над ним, просто вызывайте его только там, где это необходимо. Ваше здоровье!

person Borislav Sabev    schedule 30.10.2013
comment
Учитывая это, я вижу логику того, что сделал PHP: если установлен open_basedir, то возможность внешнего сайта, на который указывает curl, перенаправлять на внутренний путь (используя file://whatever) отключена изнутри PHP. Однако, когда я знаю и доверяю сайту, с которого мой PHP curl запрашивает данные, эта защита мешает. Есть ли способ обойти это в PHP? Я понимаю, что есть методы, отличные от curl, но я использую внешнюю библиотеку, которая просто использует ее и требует поддержки перенаправления. - person Jason; 30.10.2013
comment
Да, curl — это отдельная библиотека, на которую не влияют настройки PHP. Тем не менее, PHP вызывает ошибки, если предпринимается попытка передать определенные параметры curl с учетом определенных настроек PHP, скорее всего, с целью уберечь меня от потенциальных проблем. - person Jason; 30.10.2013
comment
@ Джейсон, можешь еще раз объяснить? Я не могу понять вашу проблему? Это когда вы вызываете appDestination, это приложение пытается выполнить внутреннюю переадресацию? Затем это перенаправление получает черную дыру из-за настройки open_basedir? Если да, то есть ли у вас контроль над источником этого приложения? - person Borislav Sabev; 31.10.2013
comment
В исходном сообщении я вставил строку кода, которая генерирует ошибку, и ошибку, которую она генерирует. Я не хочу, чтобы он генерировал ошибку при выполнении этой строки кода. Строка кода находится в стороннем пакете, который я не хочу менять, и сервер использует open_basedir, который я тоже не хочу менять. Ответ может быть простым, жестким — придется форкнуть сторонний пакет. Но также может быть какой-то способ заставить PHP curl вести себя по-другому, чтобы ошибка, которую я вставил, не генерировалась, когда выполняется строка кода, которую я вставил. - person Jason; 31.10.2013
comment
Я поднял это также как вопрос о стороннем пакете. Они должны либо не требовать эту опцию curl и обойти ее самостоятельно, либо использовать DI для транспорта, чтобы его можно было исправить вне пакета. Это было предупреждением в PHP5.3, но, похоже, превратилось в фатальную ошибку в PHP5.4. Несмотря на это, функциональность перенаправления так или иначе необходима. - person Jason; 31.10.2013
comment
В документации упоминается, что open_basedir можно ужесточить во время выполнения, т. е. сделать более строгим, но не то, что его можно отключить, если только я не ищу не в том месте. Мне может просто нужно отключить его для этого виртуального хоста - по крайней мере, его не нужно отключать для всего сервера. - person Jason; 01.11.2013
comment
@ Джейсон, ты прав - это действительно так. Посмотрим, что скажет по этому поводу стороннее приложение. - person Borislav Sabev; 02.11.2013