1

ユーザーが私の Web サイトで使用できるワークフローの例を次に示します。

  1. コンテンツを含むタスクを作成します。コンテンツhtmlentitiesをエンコードしてデータベースに保存するために使用します (はい、エンコードされたコンテンツを保存することにしました)。

  2. ユーザーは後で戻ってきて、クリックしてタスクを表示します。問題は、コンテンツのプレビューが無効なテキストエリアで行われることです。

    • テキストエリアのコンテンツを印刷するときに使用しようとしhtmlentities_decodeました(ユーザーが悪いものを入力した場合のXSSの問題);

    • エンコードされたテキストを印刷するだけで、すべて問題ありません。

  3. ユーザーがEDITをクリックすると、textarea編集可能になります

  4. ユーザーはSAVEをクリックします。

これが私の主な問題です。印刷する前にテキストをデコードしなかったため、テキストはまだエンコードされており、ユーザーが保存すると再エンコードされます。そのため、以前のコンテンツは二重にエンコードされています。

したがって、ユーザーが初めて次のようなものを入力した場合:

blablabla  </textarea/> yeah!

次に、エンコードされ、結果は次のようになります。

blablabla  &lt;/textarea/&gt; yeah!

次に、それを表示すると、ユーザーが以前に入力したとおりに表示されますが、保存すると、結果は次のようになります。

blablabla &amp;lt;/textarea/&amp;gt; yeah!

そのため、彼が再度表示すると、うまく表示されません (また、ユーザーが自分のタスクを編集し続けると、データベース内のスペースがますます必要になります)。

まあ、これは多くの人が経験した問題だと思いますが、良い解決策が見つかりません。

ちなみに私はhtmlentities一緒に使っていENT_QUOTESます。

4

2 に答える 2

0

ああ、これが私の主な問題です。印刷する前にテキストをデコードしなかったため、テキストはまだエンコードされており、ユーザーが保存すると再エンコードされます。そのため、前のコンテンツは二重にエンコードされています。

これは実際には正しいです。印刷する前にテキストをデコードしないでください。実際、HTML ページに出力するときは HTML エンコードする必要があります。ブラウザはすでに HTML エンティティを解釈しているため、ユーザーが送信した時点ではまだエンコードされていません。

... DOM で TEXT_NODE を作成し、エンコードされたデータをこれに (テキストエリアで) 割り当てている場合を除きますか? その場合、ブラウザーは HTML エンティティを解釈せず、既にエンコードされたデータを再送信することになります。innerHTMLその場合は、代わりにプロパティに割り当てます。ただし、HTML エンティティは、データが送信される前に (最初の編集時に) フォーム内でエンド ユーザーに明確に表示されますが、そうではないようです。

于 2012-08-02T15:54:12.540 に答える
0

うーん、私は私の問題を解決しました。気が付きませんでしたが、最初のエントリでは htmlentities() を使用し、編集時には Zend の escape() 関数を使用していました。htmlentities() のみを使用すると問題が解決しました。ZF の escape() 関数がどのように機能するかはわかりませんが、今後は使用しません :p

答えてくれてありがとう:)

とにかく、htmlentities_decode() 関数は、どのような状況で使用する必要があるのでしょうか? フォームを取得してそのように印刷するときに htmlentities() を使用するので、htmlentities_decode() は使用しません。それは正常ですか?では、この機能は何に使われているのだろうか?

再度、感謝します!

于 2012-08-06T13:05:24.413 に答える