web-dev-qa-db-ja.com

PHPファイルへの挿入を防ぐ

最近私はこのコードを書きました:

<?php 
$path = '../data/about.html';
$handle = fopen($path, 'w') or die('Cannot open file:  '. $path);
$data = $_POST['name'];
fwrite($handle, $data);
fclose($handle);
header("Location: warnings.php")
?>

このコードはXSSインジェクションとヌルバイトに対して脆弱であると聞きました。どうすればより安全にできますか?私が書いたファイルは後でページ上でAJAXで使用されるので、ファイルを暗号化する必要がある場合はJSで復号化できる方法が必要です。

1
MucaP

これは完全に再設計する必要があるもののように見えます。主な問題は、about.htmlファイルのコンテンツをWebリクエスト経由で書き込むことを許可していることです。ユーザーはリクエストを送信でき、任意のhtmlをレンダリングできます。

About.htmlのマークアップをテンプレート化できますか?その場合、適切なコンテキスト(属性と要素)のフィールドをエスケープできますが、現時点では、このコードを保護するための適切な方法はありません。

明確にするために編集:
クロスサイトスクリプティング(XSS)とは何かをよりよく理解する必要があるようです。 XSSは、実際にはこの脆弱性のひどい名前です。実際に発生しているのは、クライアント側のコードインジェクションです。詳細については、こちらをご覧ください: https://www.owasp.org/index.php/Cross-site_Scripting_(XSS) xssの脆弱性の核心は、攻撃者がユーザーの内容を制御できるという事実です。ブラウザ(マークアップをレンダリングし、任意のJavaScriptを実行します)。

現在の実装の問題は、ユーザーにhtmlドキュメント全体を書き込ませようとしていることです。あなたのソリューションでは、ユーザーはいくつかのhtmlを書くことができる必要がありますが、悪意のあるhtmlを書くことを許可されるべきではありません。これを正しく行うことは非常に困難です。正しい解決策の一部であるhtmlをエスケープする(この場合はhtmlspecialcharsを使用)が、現在の実装では機能するとは思わない。はるかに簡単な解決策は、about.htmlファイルをテンプレート化し、ユーザーが渡すすべてのデータをエスケープすることです。この方法では、マークアップはユーザーによって制御されません。

5
Dan Landberg