私はこれについて検索してきましたが、最も重要な部分、つまりどのフィールドを使用するかを見つけることができません。
javascript、html、またはphpを許可せずにテキストエリアを保存したい。
投稿されたテキストエリアをデータベースに保存する前に、どの関数を実行する必要がありますか? また、データベースでどのフィールド タイプを使用すればよいですか? 説明になります。最大 1000 文字です。
2 に答える
コードをデータベースに保存できるように、コードを削除/処理する方法はいくつかあります。
正規表現
1 つの方法 (ただし、困難で信頼できない場合があります) は、正規表現を使用してコードを削除/検出することです。
たとえば、次の例では、php コードを使用してすべてのスクリプト タグを削除します (ここから取得)。
$mystring = preg_replace('/<script\b[^>]*>(.*?)<\/script>/is', "", $mystring)
stip_tags PHP 関数
文字列から HTML および PHP タグを取り除く組み込みのstip_tags関数を利用することもできます。マニュアルにはいくつかの例が記載されています。便宜上、以下に 1 つを示します。
<?php
$text = '<p>Test paragraph.</p><!-- Comment --> <a href="#fragment">Other text</a>';
echo strip_tags($text);
echo "\n";
// Allow <p> and <a>
echo strip_tags($text, '<p><a>');
?>
HTML ピューリファイヤー
危険なコードを検出して削除することを目的とした一般的な HTML フィルター PHP ライブラリであるHTML Purifierを確認できます。
Getting Startedセクションにある簡単なコード:
require_once '/path/to/HTMLPurifier.auto.php';
$config = HTMLPurifier_Config::createDefault();
$purifier = new HTMLPurifier($config);
$clean_html = $purifier->purify($dirty_html);
実際に (安全な出力)
XSS 攻撃やインジェクション攻撃を回避しようとしている場合、ユーザー データのクリーニングは間違った方法です。タグを削除しても、これらの攻撃からサービスを安全に保つことが 100% 保証されるわけではありません。したがって、実際には、コードを含むユーザー データは、通常、フィルター処理やクリーニングは行われず、出力中にエスケープされます。具体的には、文字列内の特殊文字がエスケープされます。これらの文字は、言語の構文に基づいています。この例は、PHP のhtmlspecialchars関数を使用して、特殊文字をそれぞれの HTML エンティティに変換することです。マニュアルから抜粋したコード スニペットを以下に示します。
<?php
$new = htmlspecialchars("<a href='test'>Test</a>", ENT_QUOTES);
echo $new; // <a href='test'>Test</a>
?>
エスケープの詳細と質問に関連する非常に優れた説明については、このページを参照してください。他の形式の出力エスケープを示しています。また、エスケープに関する質問と回答については、ここをクリックしてください。
さらに、もう 1 つ短いが非常に重要な点として、ユーザーから受信したデータは信頼できないということをお伝えしたいと思います。
SQL インジェクション攻撃
定義(ここから)
SQL インジェクション攻撃は、クライアントからアプリケーションへの入力データを介した SQL クエリの挿入または「注入」で構成されます。SQL インジェクションのエクスプロイトが成功すると、データベースからの機密データの読み取り、データベース データの変更 (挿入/更新/削除)、データベースでの管理操作の実行 (DBMS のシャットダウンなど)、DBMS ファイルに存在する特定のファイルのコンテンツの回復が可能になります。場合によっては、オペレーティング システムにコマンドを発行します。
SQL インジェクション攻撃の場合: 情報をデータベースに保存するときに、準備されたステートメントとパラメーター化されたクエリを使用します。(質問と回答はこちらにあります) PDO を使用した準備済みステートメントのチュートリアルは、こちらにあります。
クロスサイト スクリプティング (XSS)
定義(ここから):
クロスサイト スクリプティング攻撃は、インジェクション問題の一種であり、悪意のあるスクリプトが無害で信頼できる Web サイトにインジェクトされます。クロスサイト スクリプティング (XSS) 攻撃は、攻撃者が Web アプリケーションを使用して、通常はブラウザー サイド スクリプトの形式で悪意のあるコードを別のエンド ユーザーに送信するときに発生します。
個人的にはこちらの画像の方が分かりやすいと思います。
XSS 攻撃については、この有名なページを参照してください。このページでは、何を行う必要があるかについてルールごとに説明しています。
TLDR:
htmlspecialchars()
入力でテキストをフィルタリングするのではなく、出力でテキストをエンコードするために使用するのが一般的です。このtext
目的にはフィールドで問題ありません。
あなたが防御する必要があるもの
XSSから身を守ろうとしています。XSSは、ユーザーがHTML制御文字をサイトに保存できる場合に発生します。他のユーザーにはこのHTMLマークアップが表示されるため、悪意のあるユーザーがあなたのページを使用して、他のサイトにユーザーをリダイレクトしたり、Cookieを盗んだりする可能性があります。
すべての入力についてこれを考慮する必要があります。これには、データベースに格納できる任意のvarchar
またはフィールドが含まれている必要があります。text
あなただけではありませんtextarea
。悪意のあるコンテンツをinput
フィールドに追加するのと同じくらい簡単に追加できtextarea
ます。
これに対してどのように防御しますか?
ユーザーが自分のユーザー名が次のようになっていると主張するとします。
<script src="http://example.com/malicious.js"></script>
これを処理する最も簡単な方法は、これを「そのまま」データベースに保存することです。ただし、echo
サイトにアクセスするときは常に、PHPhtmlspecialchars()
関数でフィルタリングする必要があります。
echo 'Hi, my name is ' . htmlspecialchars($user->username) . '!';
htmlspecialchars
HTML制御文字(、、、、、および)<
をHTMLエンティティ(、、、、、および)に>
変換します。これは、ブラウザの元の文字のように見えますが(つまり、通常のユーザーには)、実際のHTMLマークアップのようには機能しません。&
'
"
<
>
&
'
"
その結果、悪意のあるJavaScriptの代わりに、ユーザーの名前は文字通り<script src = "http://example.com/malicious.js"></script>のようになります。
なぜ出力をフィルタリングするのですか?なぜ入力しないのですか?
2-入力フィールドを保護するのを忘れて、誰かがそれを見つけて悪意のあるコンテンツを追加した場合、データベースで悪意のあるコンテンツを見つけて、サイトの障害コードを修復する必要があります。
3-出力フィールドのエンコードを忘れて、誰かが悪意のある入力をこっそり持ち込んだ場合は、サイトの障害のあるコードを修復するだけで済みます。
4-ユーザーは、ユーザー名の編集に使用されるHTMLフィールドを壊すようなユーザー名を書き込むことができます。データベースに保存する前にコンテンツをエンコードする場合は、適切な入力フィールドに「そのまま」表示する必要があります(管理者またはユーザーが後でユーザー名を変更できると仮定します)。しかし、ユーザーが悪意のあるコードをデータベースに挿入する方法を見つけたとしましょう。ユーザー名が次のようになっている場合はどうなりますか" style="display:none;" />
。管理者がこのユーザー名を変更できるようにする入力フィールドは、次のようになります。
<input type="text" name="username" value="" style="display:none;" />" />
malicious content -> ^^^^^^^^^^^^^^^^^^^^^^^^^^
現在、管理者は問題を修正できません。入力フィールドが消えています。ただし、出力時にテキストをエンコードすると、すべての入力フィールドが悪意のあるコンテンツから保護されます。これで、入力は次のようになります。
<input type="text" name="username" value="" style="display:none;" />" />
safe content -> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^