Безопасное и надежное преобразование файлового пути в URL - PullRequest
2 голосов
/ 17 декабря 2008

Я использую php, и у меня есть следующий код для преобразования абсолютного пути в URL.

function make_url($path, $secure = false){
    return (!$secure ? 'http://' : 'https://').str_replace($_SERVER['DOCUMENT_ROOT'], $_SERVER['HTTP_HOST'], $path);
}

Мой вопрос в основном, есть ли лучший способ сделать это с точки зрения безопасности / надежности, переносимый между местоположениями и серверами?

Ответы [ 3 ]

2 голосов
/ 09 января 2009

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

2 голосов
/ 17 декабря 2008

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

В качестве небольшого примечания: если это печатается в HTML-документе, я предполагаю, что вы передаете вывод хотя бы в виде htmlentities ... на всякий случай input $ path содержит что-то вроде тега [script] ( XSS).

Чтобы сделать это немного более надежным, я бы не советовал сопоставлять 'DOCUMENT_ROOT', поскольку иногда он либо не установлен, либо не будет совпадать (например, когда правила переписывания Apache начинают мешать).

Если бы я переписал его, я бы просто гарантировал, что «HTTP_HOST» всегда печатается ...

function make_url($path, $secure = false){
    return (!$secure ? 'http://' : 'https://').$_SERVER['HTTP_HOST'].str_replace($_SERVER['DOCUMENT_ROOT'], '', $path);
}

... и, если возможно, обновите вызывающий код так, чтобы он просто проходил путь, поэтому мне даже не нужно удалять «DOCUMENT_ROOT» (т. Е. Что происходит, если путь не совпадает с «DOCUMENT_ROOT») ) ...

function make_url($path, $secure = false){
    return (!$secure ? 'http://' : 'https://').$_SERVER['HTTP_HOST'].$path;
}

Что оставляет вопрос ... почему эта функция?

На моих сайтах у меня просто есть переменная, определенная в начале выполнения скрипта, которая устанавливает:

$GLOBALS['webDomain'] = 'http://' . (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : '');
$GLOBALS['webDomainSSL'] = $GLOBALS['webDomain'];

Где я использую GLOBALS, чтобы к нему можно было получить доступ где угодно (например, в функциях) ... но вы также можете рассмотреть возможность создания константы (define), если вы знаете, что это значение не изменится (я иногда меняю эти значения позже в файле конфигурации всего сайта, например, если у меня есть сертификат HTTPS / SSL для сайта).

0 голосов
/ 18 декабря 2008

Я думаю, что это неправильный подход.

URL в HTML поддерживают относительные местоположения. То есть вы можете сделать <A href="filename.php">link</a> для ссылки на страницу с тем же путем в своем URL, что и на соответствующей странице. Вы также можете сделать <a href="/dir/filename.php">link</a>, чтобы указать полный путь к тому же сайту. Эти два трюка означают, что код вашего веб-сайта на самом деле не должен знать, где он должен предоставлять рабочие URL.

Тем не менее, вам могут понадобиться некоторые хитрости, чтобы вы могли иметь один веб-сайт на http://www.example.com/dev/site.php и другой на http://www.example.com/testing/site.php. Вам понадобится некоторый код, чтобы выяснить, какой префикс каталога используется, но вы можете использовать для этого значение конфигурации. Под этим я подразумеваю значение, принадлежащее конфигурации этого (под) сайта, а не код с управлением версиями!

...