3

サイトで CKEditor を使用して、ユーザーがコメントを投稿できるようにしています。CKEditor には、コメントを作成するための多くのボタンがあります。ユーザーが自分のコメントを太字でイタリックにした場合

This is comment

そしてCKEditorは次のhtmlを出力します

<i><strong>This is comment</strong></i>

ここで、この html を mysql データベースに保存し、htmlspecialchars() でラップせずにそのまま Web ページに出力すると、ページにコメントが太字と斜体で表示されます。

しかし一方で、コメントを htmlspecialchars() でラップして Web ページに表示すると、次のように表示されます。

<i><strong>This is comment</strong></i>

しかし、私はこのように表示したくありません。ユーザーの書式設定が必要です。しかし、htmlspecialchars() でラップしないと危険であり、XSS 攻撃やその他のセキュリティ リスクを引き起こす可能性があります。

どうすれば両方の目的を達成できますか (1). ユーザーフォーマットを保持します (2)。HTML コンテンツも保護する

4

5 に答える 5

4

ユーザーが含めることを許可する要素と属性のホワイトリストを作成する必要があります (例: allow <strong>but not <script>; allow <a href>but not <div onmouseover>)。次に、入力を解析して適用し、適合しないすべての要素と属性を削除します。パターンを作成し、結果をシリアライズして HTML に戻します。

これは、いくつかの単純な正規表現では実行できない難しい仕事ですstrip_tags(XSS がニーズに合っていたとしても、これは XSS の適切なソリューションではありません)。これを行うには、既存のライブラリを使用することをお勧めします。HTML Purifierは、PHP 用のライブラリの 1 つです。

于 2013-03-25T13:38:10.980 に答える
1

strip_tags関数には、タグを許可または禁止するオプションがあります。ストリップ タグの詳細については、php.net を使用してください。不要または許可されていないタグを削除する必要があります。そうしないと、javascripts によって脆弱になる可能性があります。

htmlspecialchars保管中に使用しhtmlspecialchars_decode、表示中に使用してください。これは、ユーザーがフォーマットしたコンテンツのフォーマットを維持するのに役立ちます

于 2013-03-25T11:41:33.597 に答える
1

私はあなたが探していると思いますstrip_tags。文字列からすべての html および php タグを削除し、<strong><i>etc などの指定されたタグのみを許可します。

<?php 
$str = "<i><strong>this is a comment<strong></i><script>here is script</script>";
echo $str = strip_tags($str,"<i><strong>");
 ?>

strip_tags の php.net ドキュメント

于 2013-03-25T11:56:14.253 に答える
0

2 つの選択肢が思い浮かびます。まず、すべての HTML を取り除き、BB コード パーサーを使用して、ユーザーが HTML ではなく BB タグを投稿できるようにします - http://php.net/manual/en/book.bbcode.php

次に、いくつかのタグを除くすべての HTML を取り除くことができます。個人的にそれを行うパーサーは知りませんが、以前にサイトで実行されているのを見たことがあります(マーフィーの法則は今のところ見つかりません)。これは、十分に洗練された RegEx 置換チェックで実現できるはずです。

于 2013-03-25T11:29:49.953 に答える