私はここで手足を出して、以前に送信されhtmlspecialchars()
たデータをフォームにロードしたときに出力がないと言います. テキストは WYSIWYG によって HTML として解釈されていますが、実際の HTML と混同しないでください。:)
慰めとして、この混乱は非常に一般的であり (それは起こり続けてい ます)、あなたが説明したものとまったく同じ問題を抱えている人が非常に多いことを知っておいてください.
ワークフローと、どこで問題が発生した可能性があるかを見てみましょう。
問題のワークフロー
<tag>
WYSIWYG がロードされた WYSIWYG フィールド内のリッチテキストに誰かが書き込むと、エディタは、誰かが HTML<tag>
をメッセージに挿入しようとしていることに気付きます。
誰かが太字のテキストをリッチテキストに書き込むと、エディターは誰かが HTML <b>bold text</b>
(または同等のもの) をメッセージに挿入しようとしていることに気付きます。
一方、バックグラウンドでは、テキスト(または何でも) がtextarea<tag> <b>bold text</b>
に格納されています。テキストを HTML コンテキスト内のテキストとして保持するために、HTML エンコーディングでエンコードされ、目に見えないように.&lt;tag&gt; <b>bold text</b>
ただし、送信ボタンが押されると、テキストエリアのテキスト ( <tag> <b>bold text</b>
) がサーバーに送信されます。フォーム データ自体はもちろん HTML エンコードされていないため (HTML に埋め込まれていないため)、キーと値のセットに過ぎません。 、そしてテキストエリアの値が必要でした。
ここで、サーバー側アプリケーションで HTML を作成して、さらに編集するためにメッセージを再度読み込む場合、フィールドの値を HTML でエンコードする必要があります。これは、その値を HTML コンテキストに入れるためです。以前に行っていたのは<textarea><tag> <b>bold text</b></textarea>
、HTML を HTML コンテキストに入れる の作成です。基本的にすべてのブラウザで、これにより textarea がvalue <tag> <b>bold text</b>
を取得します。痛い!(誰かが</textarea>
生のメッセージの一部として持っていると想像してみてください!)
残念なことに、WYSIWYG エディターは、残念ながら、ユーザーが求めていたものをほぼ表示するのが得意です。ほとんどのユースケースでは、違いに気付くことさえないため、このエラーが非常に広まっています。
ただし、ページの HTML を作成するときは、実際には<textarea>&lt;tag&gt; <b>bold text</b></textarea>
. これにより、テキストエリアが値 <tag> <b>bold text</b>
を取得します-それはまさにあなたが望んでいたことです.
あなたが現在持っているソリューションは、送信されたテキストを 経由で実行しhtmlspecialchars_decode()
、それが に変わり、それによって HTML Purifier がそれを排除できるようにします。WYSIWYG のコンテキストで解釈されることを心配する必要はもうありません。<tag>
<tag>
<tag>
<tag>
ただし、残念ながら次の 2 つの問題があります。
1)タグに関するメッセージは、 HTML Purifierによって削除されなければ送信できなくなりました。テキストエリアのユースケースによっては、これは問題にならない場合があります。おそらく、人々が次のような HTML メッセージを送信できるようにしたくないでしょうIf you're making your own website, you can use <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.js" language="javascript"> instead of hosting the jquery.js yourself
。現在のソリューションでは、そのようなメッセージはIf you're making your own website, you can use instead of hosting the jquery.js yourself
HTML Purifier によってサニタイズされます。
2) さらに危険なことに、人々はあなたをハッキングすることができます! エディターにテキスト を書き込んで<script>alert(1);</script>
(エディターは、送信したいHTML&lt;script&gt;alert(1);&lt;/script&gt;
を として認識します)、送信をクリックしてみてください。あなたのソリューションはこれを に変換し<script>alert(1);</script>
、それを に入れます<textarea>
が、残念ながら振り出しに戻ります。
実際のソリューション
ソリューションを削除してhtmlspecialchars_decode()
(ただし、浄化を続けてください!)、代わりにhtmlspecialchars()
出力を配置します。WYSIWYG は引き続き機能し、HTML Purifier のサニテーションをバイパスすることはもうありません。