1

みなさん、こんにちは。CodeIgniter PHP フレームワークを使用して写真共有 Web サイトを開発しています。アイデアは、人々が自分の写真をアップロードし、それらを管理し (サブフォルダーを作成したり、ファイルをドラッグしたりできるある種のファイル ブラウザーを介して)、編集したり (サイズ変更、回転、トリミングなどの基本的なことから始めて) できるようにすることです。後で、いくつかの高度な機能を追加します)。

私はすでに CI ( Redux Authentication 2 Beta ) 用のサードパーティ認証ソリューションを実装しており、現在 JS/PHP ファイル マネージャー ( AjaxExplorer ) を統合していますが、問題は、ファイルを管理するための PHP バックエンド (移動、コピー、など) は、ajax 呼び出しからのユーザー入力を信頼しすぎています。たとえば、次のようなことを行っています (わかりやすくするために簡略化しています)。

move_uploaded_file($_FILES['upload']['tmp_name'], $root.$username.$_POST['destination_dir']);

ご覧のとおり、ユーザーが投入したパスを盲目的に受け入れるため、明らかなセキュリティ上の懸念があります。$_POST['destination_dir'] 値として "../AnotherUser/" のようなものを送信しているユーザーを既に確認できます。

私の質問は、ユーザーが自分のデータのみを管理できるようにするために、ユーザーを「サンドボックス化」する最良の方法は何ですか? 侵入のすべての試みをキャッチすることを期待して、入力を検証してフィルタリングするだけですか? この特定の問題に対処するための専用のライブラリ/パッケージはありますか?

この問題は、Web ブラウザーを介してファイルを管理する機能をユーザーに提供する (十分に成熟した) プロジェクトで何らかの方法で解決する必要があると思います。 、XSS、CSRF など) しかし、正しいキーワードを使用していないと思います。

4

3 に答える 3

6

ユーザーが自分のデータのみを管理できるようにするために、ユーザーを「サンドボックス化」する最良の方法は何ですか?

ユーザーが望む任意のファイル名/ディレクトリ名を許可しますが、サーバー側のファイルシステムでは使用しないでください。代わりに、主キーを使用してパス名をデータベースに書き込み、主キーを「34256.dat」のようなファイル名としてフラット ストレージ ディレクトリに (または、必要に応じてデータベース内の BLOB として) 使用します。次に、ダウンロード スクリプトまたは URL 書き換えを介してサービスを提供し、目的のファイル名が URL に表示されるようにします。

着信ファイル名をサニタイズするのは困難です。「..」の検出は始まりにすぎません。ファイル名が長すぎます。短すぎるファイル名; 先頭と末尾のドットの組み合わせ。先頭と末尾の空白の組み合わせ。異なるプラットフォームの異なるディレクトリ セパレータ。一部のプラットフォームでは無効な文字。制御文字; Unicode 文字と、それらをアドレス指定する環境固有の方法。ADS; ファイル名 ('.htaccess') または拡張子 ('.php'、'.cgi') は、Web サーバーにとって「特別」である可能性があります。Windows の予約済みファイル名...

さまざまなプラットフォームでのファイルパス ルールのちょっとした癖を追跡するのに生涯を費やすことも、それを忘れてデータベースを使用することもできます。

于 2009-03-03T21:08:53.347 に答える
0

私が知っているライブラリはありません。
ただし、特定の例では、文字列からすべての (バック) スラッシュとドットを削除し、その末尾にスラッシュを追加して、ユーザーがフォルダーを変更できないようにします。

$destdir = str_replace(array('.', '/', '\\'), '', $_POST['destination_dir']); 
$destdir .= "/";
于 2009-03-03T20:58:45.087 に答える