前に読んだように、元のデータをユーザー入力からデータベースに保存することをお勧めします。これは、後で別のコンテキストで使用される可能性があり、表示されるコンテキストに応じて異なる方法でエスケープする必要があるためです。
私の問題は次のとおりです。
たとえば、ユーザーが記事を書いて保存ボタンを押したとします。元の形式でデータベースに保存されます (おそらく保存前に SQL がエスケープされます)。
後でユーザーが同じ記事を編集したい場合は、テキストをエスケープします。これは、エディターで表示したときに html コンテキストで表示されるためです。したがって、ユーザーは記事の HTML エスケープ バージョンを取得します。
記事を編集した後、ユーザーはすでにエスケープされたバージョンのテキストを保存し、それを「元の」(html エスケープ) 形式でデータベースに保存します。
この時点では、データベース内で既にエスケープされているため、通常は使用できません。
記事である必要はありません。ユーザーの名前であると想像してください。管理サイトに表示された場合、管理者が xssed されないようにする必要があるため、エスケープする必要があります。管理者が名前を編集して保存すると、エスケープされた形式で保存されます。ユーザーの名前 (たとえば) にアポストロフィ (') 文字が含まれており、それが ' にエスケープされているため、ユーザーは再度ログインできません。または ' ユーザーは自分の名前のエスケープ形式を入力することはありません。
この種の問題を処理する正しい方法は何ですか? 保存する前に入力をエスケープ解除すると、データを元の形式で保存するという原則に違反し、ユーザーがエスケープ解除されたデータを送信したときに間違った結果が得られる可能性があります (新しい記事)。