Портативный и безопасный способ получить PATH_INFO

Я ищу портативный способ получить (удобный) $_SERVER['PATH_INFO'] переменная.

После чтения некоторое время, это складывается PATH_INFO порождается из CGI/1.1 и моего не всегда присутствовать во всей конфигурации.

Что лучший (главным образом мудрый безопасностью) путь состоит в том, чтобы получить ту переменную - кроме извлечения его вручную (проблема безопасности).

8
задан LiraNuna 19 January 2012 в 02:04
поделиться

5 ответов

Well, I'm (almost) sure that without making use of the $_SERVER superglobal keys, providing a alternative way to figure out PATH_INFO is just impossible, that being said lets first list all of the $_SERVER keys that we may possibly use:

  • 'PHP_SELF'
  • 'QUERY_STRING'
  • 'SCRIPT_FILENAME'
  • 'PATH_TRANSLATED'
  • 'SCRIPT_NAME'
  • 'REQUEST_URI'
  • 'PATH_INFO'
  • 'ORIG_PATH_INFO'

We obviously need to ignore the last two. Now we should (I don't know this for a fact, I'm just assuming because you said so) filter all the keys that exist in the link you provided (which BTW is offline ATM), that leaves us with the following keys:

  • 'PHP_SELF'
  • 'SCRIPT_FILENAME'
  • 'REQUEST_URI'

Regarding your comment to Anthonys answer:

You are just juggling variables now. SCRIPT_FILENAME является частью CGI спец. Он не будет доступен, если PATH_INFO недоступен. Что касается REQUEST_URI , это mod_rewrite apache конкретный. - LiraNuna

Я использую LightTPD / 1.4.20-1 (Win32) с PHP 5.3.0 в качестве CGI, cgi.fix_pathinfo = 1 и $ _ SERVER ['REQUEST_URI '] очень доступен для меня , я также помню, как использовал ту же самую переменную в те дни, когда никто не использовал mod_rewrite , так что мое честное скромное предположение состоит в том, что вы простой неверно в этом пункте . Что касается ключа SCRIPT_FILENAME , я не могу проверить этот банкомат. Тем не менее, если мы очень сильно закроем глаза и поверим, что вы правы, у нас останется только одна переменная:

  • 'PHP_SELF'

I '

Вы также должны прочитать это о том, почему бы не использовать PHP_SELF .

Если это не сработает для вас, извините, но я могу придумать что-нибудь еще.

EDIT - Еще кое-что для вас:

11
ответ дан 5 December 2019 в 12:09
поделиться

вы можете попробовать

$_ENV['PATH_INFO']; or
getenv('PATH_INFO']; 
-1
ответ дан 5 December 2019 в 12:09
поделиться
function getPathInfo() {
    if (isset($_SERVER['PATH_INFO'])) {
        return $_SERVER['PATH_INFO'];
    }  
    $scriptname = preg_quote($_SERVER["SCRIPT_NAME"], '/');
    $pathinfo = preg_replace("/^$scriptname/", "", $_SERVER["PHP_SELF"]);
    return $pathinfo;
}

Править: без SCRIPT_NAME и при условии, что у вас есть DOCUMENT_ROOT (или вы можете определить / обнаружить его самостоятельно) и, если у вас есть SCRIPT_FILENAME, тогда:

function getPathInfo() {
    if (isset($_SERVER['PATH_INFO'])) {
        return $_SERVER['PATH_INFO'];
    }  
    $docroot = preg_quote($_SERVER["DOCUMENT_ROOT"], "/");
    $scriptname = preg_replace("/^$docroot/", "", $_SERVER["SCRIPT_FILENAME"]);
    $scriptname = preg_quote($scriptname, "/");
    $pathinfo = preg_replace("/^$scriptname/", "", $_SERVER["PHP_SELF"]);
    return $pathinfo;
}

Также @ Anthony (недостаточно репутации для комментариев, извините): использование str_replace () будет соответствовать любому месту в строке. Это' s не гарантированно работает, вы хотите сопоставить его только в начале. Кроме того, ваш метод возврата только на 1 косую черту (через strrpos) для определения SCRIPT_NAME будет работать только в том случае, если сценарий находится в корневом каталоге, поэтому лучше сравнивать имя_файла_сценария с docroot.

1
ответ дан 5 December 2019 в 12:09
поделиться

Я не видел комментариев или ссылок перед публикацией. Вот кое-что, что может сработать, исходя из того, что указанная выше страница дает переменные, производные от CGI:

function getPathInfo() {
    if (isset($_SERVER['PATH_INFO'])) {
        return $_SERVER['PATH_INFO'];
    }  

    $script_filename = $_SERVER["SCRIPT_FILENAME"];
    $script_name_start = strrpos($script_filename, "/");
    $script_name = substr($script_filename, $script_name_start);

    //With the above you should have the plain file name of script without path        

    $script_uri = $_SERVER["REQUEST_URI"];
    $script_name_length = strlen($script_name);
    $path_start = $script_name_length + strpos($script_name, $script_uri);

    //You now have the position of where the script name ends in REQUEST_URI

    $pathinfo = substr($script_uri, $path_start);
    return $pathinfo;
}
0
ответ дан 5 December 2019 в 12:09
поделиться

Это зависит от определений "переносимый" и "безопасный".

Позвольте мне проверить, правильно ли я понял:

1) Вас не интересует CLI:

  • вы упомянули PHP/CGI
  • PATH_INFO - это часть URL; поэтому имеет смысл обсуждать PATH_INFO, только когда скрипт доступен из URL (т.е. из HTTP соединения, обычно запрашиваемого браузером)

2) Вы хотите иметь PATH_INFO во всех комбинациях ОС + HTTP сервер + PHP:

  • ОС может быть Windows, Linux и т.д.
  • HTTP сервер может быть Apache 1, Apache 2, NginX, Lighttpd и т.д.
  • PHP может быть версии 4, 5, 6 или любой другой

Хммм... PHP_INFO, в массиве $_SERVER, предоставляется PHP исполняемому скрипту только при определенных условиях, в зависимости от вышеупомянутого программного обеспечения. Он не всегда доступен. То же самое относится и ко всему массиву $_SERVER!

Короче говоря: "$_SERVER зависит от сервера"... поэтому переносимое решение не может зависеть от $_SERVER... (просто для примера: у нас есть учебник по настройке переменных PHP/CGI $_SERVER на HTTP-сервере NginX на kbeezie. com/view/php-self-path-nginx/)

3) Несмотря на то, что было сказано выше, стоит упомянуть, что если у нас каким-то образом есть полный URL, который был запрошен, доступный в виде строки, можно получить PATH_INFO из него, применяя регулярные выражения и другие строковые функции PHP, безопасно (также проверяя входную строку как правильный URI).

Итак, если у нас есть строка URL... то ДА, у нас есть переносимый и безопасный способ определения PATH_INFO из нее.


Теперь у нас есть два четких и сфокусированных вопроса реализации:

  1. Как получить URL?
  2. Как получить PATH_INFO из URL?

Среди нескольких возможностей, вот возможный подход:

Как получить URL?

1) Имея глубокие и всесторонние знания о каждой комбинации HTTP-сервер + ОС + версия PHP, проверьте и попробуйте каждую возможность получения URL из массива $_SERVER (проверьте 'PHP_SELF', 'QUERY_STRING', 'SCRIPT_FILENAME', 'PATH_TRANSLATED', 'SCRIPT_NAME', 'REQUEST_URI', 'PATH_INFO', 'ORIG_PATH_INFO', 'HTTP_HOST', 'DOCUMENT_ROOT' или что-то еще)

2) Если предыдущий шаг не удался, заставьте PHP-скрипт вернуть javascript-код, который отправляет "document. URL" информацию обратно. (Проблема переносимости переносится на сторону клиента.)

Как получить PATH_INFO из URL?

Вот код по ссылке.

Это мое скромное мнение и подход к проблеме.

Что вы думаете?

1
ответ дан 5 December 2019 в 12:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: