Я знаю, как это исправить с помощью предотвращения грубой силы (я думаю), но мне интересно, сталкивался ли кто-нибудь с этим и / или предлагал какие-нибудь хорошие идеи для выявления истинной причины.
Я на Windows XP
с php 5.4.31
, Я установил мой include_path так, чтобы с xdebug
Я вижу результат get_include_path()
быть:
C:/xampp1826/htdocs/OSH2/application/../library;C:\xampp1826\htdocs\OSH2\library;.;C:\xampp1826\php\PEAR
Это ZF1
приложение, которое использует Zend
автозагрузчик классов, и вот что include_path()
возвращается, поскольку различные вещи автоматически загружаются. Затем «внезапно», непосредственно перед попыткой автозагрузки одного конкретного класса, для которого он правильно вычислил имя файла относительно include_path
, Я могу увидеть это get_include_path()
возвращает эту строку с каждой последовательностью \ xa, преобразованной в перевод строки (ascii decimal 10)
, вызывая автозагрузчик include_once
терпеть неудачу.
Я провел исчерпывающий поиск дополнительных звонков set_include_path()
(включая все php
библиотеки я использую), а есть только пара. И я установил на них контрольные точки и показал результат get_include_path()
после каждого. Делая это, я не смог найти php
код, который действительно вносит изменения! Я полагаю, что я мог пропустить место, и я еще раз проверим все после некоторого сна, но, как сейчас обстоят дела, это выглядит как ошибка в php
, На самом деле, когда правильные символы находятся в include_path
строка, я даже не представляю, как php
код может легко / случайно выполнить обработку escape. И хотя я не могу легко переключиться обратно сейчас, у меня не было этой проблемы, используя php 5.3.1
на что я на 99% уверен, был точно такой же исходный код. Были ли какие-то изменения в php 5.4
что может объяснить это?
Кто-нибудь еще видел что-то подобное, и если да, то как вы обнаружили первопричину?
Поскольку php на windows совершенно рад принимать прямые косые черты в именах путей, а не обратные косые черты, моя стратегия предотвращения перебора заключается в том, чтобы гарантировать, что никакие обратные косые черты никогда не попадут в путь включения, с помощью кода следующего содержания:
define('APPLICATION_PATH', str_replace('\\', '/', realpath(str_replace('\\', '/', realpath(dirname(__FILE__) . '/../application')))));
Я не знаю правильной процедуры для этого, должен ли вопрос быть удален или помечен как-то иначе, чтобы люди не тратили на него больше времени …
Но конкретная проблема, как я описал, похоже, была своего рода артефактом в комбинации с xdebug (php_xdebug-2.2.5-5.4-vc9.dll
скачано с http://xdebug.org/download.php
) а также Netbeans 7.4
что решил преобразовать \xa
последовательность символов для символа перевода строки при отображении строки, возвращаемой get_include_path()
, Фактически, это происходило только «иногда», поскольку повторяющиеся сеансы в отладчике отображали его по-разному в одной и той же точке кода.
Я пошел дальше и изменил код, чтобы принудительный путь включения использовал косые черты исключительно для устранения этой красной сельди. Но я все еще вижу ту же самую проблему, в той же самой точке кода, где вызов include_once()
с действительным именем файла для действительного файла php, который существует и доступен для чтения при добавлении в первый каталог в include_path
просто убивает мой сценарий без регистрации или сообщения об ошибке или предупреждении. Я опубликую другой вопрос с подробностями о том, что если он останется неразрешимым сейчас, когда я не гонюсь за красной сельдью. У меня плохое предчувствие php 5.4.31
…
Других решений пока нет …