2009-06-26 11 views
2

私はPHPのセキュリティ上の問題を初心者です。誰かが自分のコードでセキュリティの問題を報告しましたが、詳細を記述しませんでした。Ajaxセキュリティ質問:JQuery ajax()+ PHP scandir()=セキュリティ問題?

以下は、コードの要約版です。私はJQuery AJAX関数を使用してPHPのscandir()関数で使用されているサーバーにデータを送信しています。

セキュリティ上の問題はありますか?

HTMLドキュメント

<script 
    src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"> 
</script> 
<script> 
$.ajax({ 
    type: "POST", 
    url: "example.php", 
    cache: false, 
    data: { 
     foo: "images", 
     bar: "something else", 
      }, 
    success: function(html){ 
    alert(html); 
    } 
}); 
</script> 

PHPドキュメント

<?php 

$foo = filter_var($_POST["foo"], FILTER_SANITIZE_STRING); 
$bar = filter_var($_POST["bar"], FILTER_SANITIZE_STRING); 

$foo = scandir($foo); 
$bar = (explode(",",$bar)); 

foreach ($foo as $a) { 
    echo "<img src='$foo/$a'>"; 
} 

?> 

答えて

4

を唯一可能性がありますはい、私はあなたのマシン上のすべてのファイルを列挙することができます。サーバーがfopen wrappers経由でアクセスできるマシンもあります。この情報は、他の脆弱なソフトウェアの実行中または機密ファイルの特定に役立ち、今後の攻撃を標的にするのに役立ちます。

FILTER_SANITIZE_STRINGは、ファイルパスの参照ではなく、HTMLを保護するように設計されているため、ここでは実際には役に立ちません。バックエンド関数を使用する場合には生成されたHTMLへの出力フィルタとしてのみ使用してください。

@、..、\、/のような危険なパストークンの使用を制限したいとします。しかし、Tom Haighのサンプルコードのように、あなたが安全だと考える文字や値をホワイトリストに入れることでこれを行います。

1

あなたは潜在的に「FOO」と呼ばれる悪質な値を掲載することにより、ファイルシステム上のすべてのファイルのリストを得ることができた - 値が「/」 HTMLソースでは、ファイルシステムのルートにあるすべてのファイルを見ることができます。これはopen_basedirの制限のために常に機能するとは限りませんが、まだまだ良いアイデアはありません。

可能な解決策は、最初に 'foo'パラメータをサニタイズすることです。特定の文字だけを許可するか、許可されたディレクトリ名、例えばのホワイトリスト内に存在する「foo」で値:

$foo = filter_var($_POST["foo"], FILTER_SANITIZE_STRING); 

if (!in_array($foo, array('allowed_dir1', 'allowed_dir2'))) { 
    //not valid, not in whitelist 
} 

//or 

if (!preg_match('/^[a-zA-Z0-9+]+$/', $foo)) { 
    //not valid, contains more than just letters and numbers 
} 
+0

「foo」の値に「/」やURLへの絶対パスを含めたいと思います。このようにして、画像はどこからでも供給することができます。たとえば、私はfooを "http://www.somesite.com/directory/directory"と同等にすることができます。これを行うための安全な方法はありますか?そうでない場合は、JavaScriptオブジェクトの&php docからfooを削除し、目的のディレクトリをgetdir関数に直接コーディングする必要があります。私は実際には、私のプログラムを使用しているページごとに別々のPHPファイルを作成する必要があるので、これを避けたいと思います。 – edt

+0

"この方法では、画像はどこからでも供給することができます" - あなたは本当に、リモートユーザにあなたのマシンのどこにいてもファイルを見る能力を与えたくありません。イメージファイルだけの場合でも。そして、ファイルが "jpg"のような画像拡張子を持っているからといって、それが画像データを含んでいるわけではありません。悪意のある攻撃者が他の脆弱性を介してコードを残している可能性があります。私は強くあなたのデザインと要件を再考することをお勧めします。 – Cheekysoft