0

私はこれについて検索してきましたが、最も重要な部分、つまりどのフィールドを使用するかを見つけることができません。

javascript、html、またはphpを許可せずにテキストエリアを保存したい。

投稿されたテキストエリアをデータベースに保存する前に、どの関数を実行する必要がありますか? また、データベースでどのフィールド タイプを使用すればよいですか? 説明になります。最大 1000 文字です。

4

2 に答える 2

5

コードをデータベースに保存できるように、コードを削除/処理する方法はいくつかあります。

正規表現

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; // &lt;a href=&#039;test&#039;&gt;Test&lt;/a&gt;
?>

エスケープの詳細と質問に関連する非常に優れた説明については、このページを参照してください。他の形式の出力エスケープを示しています。また、エスケープに関する質問と回答については、ここをクリックしてください

さらに、もう 1 つ短いが非常に重要な点として、ユーザーから受信したデータは信頼できないということをお伝えしたいと思います。

SQL インジェクション攻撃

定義(ここから)

SQL インジェクション攻撃は、クライアントからアプリケーションへの入力データを介した SQL クエリの挿入または「注入」で構成されます。SQL インジェクションのエクスプロイトが成功すると、データベースからの機密データの読み取り、データベース データの変更 (挿入/更新/削除)、データベースでの管理操作の実行 (DBMS のシャットダウンなど)、DBMS ファイルに存在する特定のファイルのコンテンツの回復が可能になります。場合によっては、オペレーティング システムにコマンドを発行します。

SQL インジェクション攻撃の場合: 情報をデータベースに保存するときに、準備されたステートメントとパラメーター化されたクエリを使用します。(質問と回答はこちらにあります) PDO を使用した準備済みステートメントのチュートリアルは、こちらにあります

クロスサイト スクリプティング (XSS)

定義ここから):

クロスサイト スクリプティング攻撃は、インジェクション問題の一種であり、悪意のあるスクリプトが無害で信頼できる Web サイトにインジェクトされます。クロスサイト スクリプティング (XSS) 攻撃は、攻撃者が Web アプリケーションを使用して、通常はブラウザー サイド スクリプトの形式で悪意のあるコードを別のエンド ユーザーに送信するときに発生します。

個人的にはこちらの画像の方が分かりやすいと思います。

ここに画像の説明を入力

XSS 攻撃については、この有名なページを参照してください。このページでは、何を行う必要があるかについてルールごとに説明しています。

于 2013-03-09T18:34:21.140 に答える
1

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) . '!';

htmlspecialcharsHTML制御文字(、、、、、および)<をHTMLエンティティ(、、、、、および)に>変換します。これは、ブラウザの元の文字のように見えますが(つまり、通常のユーザーには)、実際のHTMLマークアップのようには機能しません。&'"&lt;&gt;&amp;&apos;&quot;

その結果、悪意のあるJavaScriptの代わりに、ユーザーの名前は文字通り<script src = "http://example.com/malicious.js"></script>のようになります。

なぜ出力をフィルタリングするのですか?なぜ入力しないのですか?

1- OWASPはこの方法を推奨しています

2-入力フィールドを保護するのを忘れて、誰かがそれを見つけて悪意のあるコンテンツを追加した場合、データベースで悪意のあるコンテンツを見つけて、サイトの障害コードを修復する必要があります。

3-出力フィールドのエンコードを忘れて、誰かが悪意のある入力をこっそり持ち込んだ場合は、サイトの障害のあるコードを修復するだけで済みます。

4-ユーザーは、ユーザー名の編集に使用されるHTMLフィールドを壊すようなユーザー名を書き込むことができます。データベースに保存する前にコンテンツをエンコードする場合は、適切な入力フィールドに「そのまま」表示する必要があります(管理者またはユーザーが後でユーザー名を変更できると仮定します)。しかし、ユーザーが悪意のあるコードをデータベースに挿入する方法を見つけたとしましょう。ユーザー名が次のようになっている場合はどうなりますか" style="display:none;" />。管理者がこのユーザー名を変更できるようにする入力フィールドは、次のようになります。

<input type="text" name="username" value="" style="display:none;" />" />
                malicious content ->      ^^^^^^^^^^^^^^^^^^^^^^^^^^ 

現在、管理者は問題を修正できません。入力フィールドが消えています。ただし、出力時にテキストをエンコードすると、すべての入力フィールドが悪意のあるコンテンツから保護されます。これで、入力は次のようになります。

<input type="text" name="username" value="&quot; style=&quot;display:none;&quot; /&gt;" />
                     safe content ->      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
于 2013-03-09T19:37:12.743 に答える