Вопрос RegEx для начинающих - PHP RegEx разрешает только относительные пути (не URL) - PullRequest
0 голосов
/ 27 июня 2009

Кто-нибудь знает PHP RegEx, разрешающий только относительные пути, а не абсолютные?

Например, у меня есть функция AJAX, которая передает это значение в мой PHP-скрипт "some-directory / another-directory / some-file.php".

Мой PHP-скрипт затем включает этот файл .... include ($ some-php-document);

Я не хочу, чтобы хакер мог использовать мою функцию AJAX для отправки чего-то вроде: "http://www.malicious -website.com / malware-script.php "

В моем PHP-документе я хотел бы сделать что-то вроде:

<php>
$some-php-document = $_POST["some_value_submitted_via_ajax"];

//if $some-php-document is a URL (not a relative path to a file), 
    //then $some_php_document = null

//how can I use a php regex to accomplish the above?

</php>

Как я могу это сделать?

Или, дайте мне знать, если есть более безопасные решения.

Ответы [ 3 ]

3 голосов
/ 27 июня 2009

Не разрешать загрузку имен файлов для указания включения. Вместо этого сделайте это:

$valid_files = array(
    'file1' => 'file1.inc',
    'file2' => 'john.inc',
    'fred' => 'bob.inc',
);

$requested_include = trim(strtolower($_POST["some_value_submitted_via_ajax"])));
if (!array_key_exists($requested_include, $valid_files)) {
    $requested_include = "file1";
}
include WEB_ROOT_PATH . 'templates/whatever/' . $valid_files[$requested_include];

Проверяйте все входные данные, нет необходимости в RegEx - это сложно сделать правильно, и вам лучше с более жестким решением безопасности, как указано выше.

2 голосов
/ 27 июня 2009

Я бы использовал parse_url () , а не регулярное выражение, что-то вроде:

<?php
$some_php_document = $_POST["some_value_submitted_via_ajax"];

$parsed_doc = parse_url($some_php_document);

//if $some-php-document is a URL (not a relative path to a file), 
    //then $some_php_document = null
if (isset($parsed_doc['scheme']) || isset($parsed_doc['host'])) {
    $some_php_document = null;
}

?>

Путь к файлу будет в $ parsed_doc ['path']. Перед использованием он должен быть проверен, чтобы злоумышленник не мог сказать, запросить / etc / passwd или какой-либо аналогичный файл.

0 голосов
/ 27 июня 2009

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

^([^:]|:[^/]|:/[^/})*$

Если она совпадает, строка является относительной (хотя, возможно, искаженной).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...