Acemi RegEx Soru - PHP RegEx izin sadece göreli yolları (değil URL)

3 Cevap php

Herkes sadece göreli yolları değil, mutlak izin vermek için bir PHP RegEx biliyor mu?

Örneğin, benim PHP script "some-directory/another-directory/some-file.php" Bu değer gönderen bir AJAX işlevi var.

Benim PHP komut dosyası daha sonra bu dosyayı içerir .... ($ bazı-php-belge) içerir;

Ben bir hacker gibi bir şey göndermek benim AJAX fonksiyonunu kullanmak mümkün istemiyorum: "http://www.malicious-website.com/malicious-script.php"

Benim PHP Belgesinde ben böyle bir şey yapmak istiyorum:

<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>

Bunu nasıl yapabilirim?

Ya da, daha güvenli çözümler varsa bana bildirin.

3 Cevap

: Ben parse_url() işlevini yerine regexpi, gibi bir şey kullanmak istiyorsunuz

<?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;
}

?>

Dosya yolu $ parsed_doc ['path'] olacaktır. Kullanılmadan önce kontrol edilmelidir, bu yüzden saldırgan istek / etc / passwd veya bazı benzer duyarlı dosya, diyemeyiz.

Dosya adları yükleme bir dahil belirtmek izin vermeyin. Bunun yerine şunu yapın:

$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];

Bir RegEx'in için gerek tüm giriş doğrulamak - sağ olsun zor ve yukarıdaki gibi sıkı bir güvenlik çözümü ile daha iyiyiz.

Siz dizesinde :/ / test ve mevcut ise, reddetmek olabilir. Eğer olumsuz bir regex istiyorsanız, böyle bir şey deneyin:

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

Eğer maç, dize (muhtemelen hatalı biçimlendirilmiş olsa) görecelidir.