2009-06-27 4 views
0

絶対パスではなく相対パスのみを許可するPHP RegExを誰も知っていますか?Beginner RegExの質問 - PHP RegExはURLのない相対パスのみを許可します

たとえば、この値をPHPスクリプト "some-directory/another-directory/some-file.php"に送信するAJAX関数があります。

私のPHPスクリプトは、そのファイルを含んでいます.... include($ some-php-document);

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

:私のような何かをしたいと思い、私のPHPのドキュメントでは、「http://www.malicious-website.com/malicious-script.php

私はハッカーのようなものを提出する私のAJAX機能を使用することができるようにしたくありませんこれどうやってするの?

さらに、より安全なソリューションがあるかどうか教えてください。

答えて

2

私のようなもの、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 [「パス」]になります。攻撃者は/ etc/passwdなどの機密ファイルを要求することはできません。

+0

プログラムのユーザーは、どのようなパスを指定する必要があるので、私は良い方法を確認するには分かりません。私が代わりにしたのは、あなたのサンプルを使って、ob_start()とob_end clean()でインクルードステートメントをラップすることでした。このように、ハッカーがコンテンツをエコーする機密ファイルを含むと、エコーされたコンテンツは破棄されます。あなたに良いアイデアがあれば教えてください。 – edt

0

文字列で//をテストし、存在する場合は拒否します。それが一致した場合、文字列は(おそらく不正な形式が)相対的である

​​

:あなたが負の正規表現をしたい場合は、のようなものを試してみてください。

+0

URLにプロトコルは必要ありません。 //otherserver.com/script.jsは有効です。 –

+0

本当ですか?私はちょうど私のブラウザにそのアドレスを入力し、それは自動的にファイルを埋めました:// – Blindy

3

インクルードを指定するファイル名のアップロードを許可しないでください。代わりに、次の操作を行います。

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

検証すべての入力、正規表現は必要ありません - それは権利を取得するのは難しい、あなたは上記のようにタイトなセキュリティソリューションとの方がいいでしょう。