0

学生が基本的な HTML、CSS、および JavaScript を学習できるように、CodeMirrorを使用して単純な Web ベースのコード エディターをセットアップしています。

学生が自分のコードを保存できるようにしたいので、スタンドアローンのブラウザー ウィンドウに表示され、友人や家族と共有して自分の作品を披露することができます (例: mydomain.com/users/ their-ユーザー名/test.html)。

現在、次の PHP を使用していますが、私の使用$contentはまったく安全ではないことがわかっています。

if ($_POST['type'] == 'save') {

  $content = stripslashes($_POST['code']);
  $username = addslashes(strip_tags($_POST['username']))); //i.e. markrummel
  $filename = addslashes(strip_tags($_POST['filename']))); //i.e. test, index
  $ext = addslashes(strip_tags($_POST['filetype']))); //i.e. html, css, js
  $path = '/users/' . $username . '/';
  $URL = $path . $filename . '.' . $ext;

  file_put_contents($URL, $content);

}

ほとんどの場合$content、安全な HTML、CSS、または JavaScript のよう<p>My name is Mark</p>にする必要があります。

コードを安全に保存して表示する方法について何か提案はありますか? 各ユーザーのフォルダーを他のユーザー フォルダーや Web サイトの残りの部分から隔離/サンドボックス化する方法はありますか?

おそらくこれを行うための安全な方法はなく、信頼できない人がコードをサーバーに保存することを許可するべきではありませんが、これを行うための安全な方法があれば...それはこのプロジェクトにとって素晴らしいことです! そうでない場合は、別の方法を考えます。

あなたが提供できる助けや洞察をありがとう!-マーク

4

1 に答える 1

2

addslashesstripslashesここでは何もしません。あなたが何をしようとしているのかはわかりませんが、文字列をスラッシュすることは、ファイル名の処理や実際にWebアプリケーションで遭遇する可能性のあるコンテキストのエンコーディングの有用な形式ではありません.

strip_tagsまた、ファイル名とは何の関係もありません。文字列から HTML を削除します (それでも、HTML インジェクションに対するガードとして適切に使用するには十分な方法ではありません)。

$URL = $path . $filename . '.' . $ext;
file_put_contents($URL, $content);

ええ、これは非常に危険です。ユーザー名またはファイル名にセグメントを挿入することにより..、攻撃者はルート パスの外にファイルを格納できます。拡張子を含むファイル名を完全に制御して、.php などの実行可能ファイルや.htaccess. ($ext既知の適切な値に制限されていたとしても、サーバーが実行されている OS によっては、その拡張機能の追加を回避できる場合もあります。)

ファイル名に使用できる文字を制限することでファイル名をサニタイズすることは可能ですが、たとえば. Windows サーバー。ほとんどの場合、自分でファイル名を生成して (たとえば、攻撃者が提供するファイル名の代わりに一意の整数 ID を使用して)、ローカル ファイルシステムに保存する方が適切です。いつでも書き換えを使用して、ファイルが異なるアドレスを持っているように見せることができます。

ほとんどの場合、$content は安全な HTML、CSS、または JavaScript である必要があります

それなら安全だと思いますか?

ドメイン内からユーザー提供のスクリプトを提供すると、ユーザーがサイト内で行うすべてのことを制御できます。ユーザーレベルのセキュリティ制御を上書きまたは偽造したり、他のユーザーの名前でファイルをアップロードしたりする可能性があります。

送信された HTML をサニタイズして、安全なタグのみを使用するようにすることもできますが、これを正しく行うのは難しく、ユーザーに CSS/JS の実行を許可したい場合には役に立ちません!

各ユーザーのフォルダーを他のユーザー フォルダーや Web サイトの残りの部分から隔離/サンドボックス化する方法はありますか?

はい。異なるホスト名から各エリアにサービスを提供します。例えば。http://www.example.com/でサンドボックスを使用してメイン サイトをhttp://tom.users.example.com/配置http://dick.users.example.com/します。

これにより、直接的なクロスサイト スクリプティングが防止されます。サンドボックス サイトがメイン サイトから Cookie を読み取れないようにするには、サンドボックス サイトも実行されていないことを確認してくださいexample.com(にリダイレクトしwww.example.comます)。

これは完全なサンドボックスではありません。サンドボックス サイトが他のサイトに Cookie を書き込めないようにする必要がある場合 (独自の Cookie の動作を停止することでそれらを破壊する可能性がある場合は、各サンドボックスを独自の完全なドメインで実行する以外に選択肢はありません。また、Java プラグインの URL 接続を保護する必要がある場合は、 , 各サンドボックスには独自のIPアドレスが必要です. これはコストがかかります! しかし、これらはそれほど深刻な攻撃ではありません.

于 2012-04-14T17:31:12.003 に答える