0

前に読んだように、元のデータをユーザー入力からデータベースに保存することをお勧めします。これは、後で別のコンテキストで使用される可能性があり、表示されるコンテキストに応じて異なる方法でエスケープする必要があるためです。

私の問題は次のとおりです。

  1. たとえば、ユーザーが記事を書いて保存ボタンを押したとします。元の形式でデータベースに保存されます (おそらく保存前に SQL がエスケープされます)。

  2. 後でユーザーが同じ記事を編集したい場合は、テキストをエスケープします。これは、エディターで表示したときに html コンテキストで表示されるためです。したがって、ユーザーは記事の HTML エスケープ バージョンを取得します。

  3. 記事を編集した後、ユーザーはすでにエスケープされたバージョンのテキストを保存し、それを「元の」(html エスケープ) 形式でデータベースに保存します。

この時点では、データベース内で既にエスケープされているため、通常は使用できません。

記事である必要はありません。ユーザーの名前であると想像してください。管理サイトに表示された場合、管理者が xssed されないようにする必要があるため、エスケープする必要があります。管理者が名前を編集して保存すると、エスケープされた形式で保存されます。ユーザーの名前 (たとえば) にアポストロフィ (') 文字が含まれており、それが ' にエスケープされているため、ユーザーは再度ログインできません。または ' ユーザーは自分の名前のエスケープ形式を入力することはありません。

この種の問題を処理する正しい方法は何ですか? 保存する前に入力をエスケープ解除すると、データを元の形式で保存するという原則に違反し、ユーザーがエスケープ解除されたデータを送信したときに間違った結果が得られる可能性があります (新しい記事)。

4

1 に答える 1

3

エスケープされたデータは常にそのコンテキストに依存しています!
'Foo & \'Bar\' & Baz'SQL リテラルとしては、「Foo & 'Bar' & Baz」を意味します。
Foo & 'Bar' & BazHTML では、 「Foo & 'Bar' & Baz」を意味します。

SQL エスケープ文字列はデータベースによって解釈されるため、エスケープされずに表示されます。
HTML はブラウザによって解釈されるため、エンコードされたエンティティなしでユーザーに表示されます。

エスケープは、データをそのまま転送するメカニズムです。データが永続的に変更されるわけではありません。ユーザーは、元のデータがテクノロジー「フィルター」によって解釈されると、元のデータを常に見ることができます。

実際にデータがエスケープされるべきではない場所でエスケープされているように見えるという問題がある場合は、どこかでエスケープが多すぎます。

The Great Escapism (または、テキスト内のテキストを操作するために知っておくべきこと)も参照してください。

于 2013-10-30T13:53:16.410 に答える