入力フィールドがデータベースに保存され、Webサイトの別の場所に表示される入力フィールドがあるWebサイトがあるとします。
データが表示されるときに、出力のサニタイズ/エスケープのみを行うのは安全ですか?
悪意のあるデータが最初にデータベースに入るのを防ぐために、入力をエスケープする必要もありますか?
私が心配しているのは、アプリケーションがデータベースからデータをエスケープするなどして出力を処理する場合でも、データが表示されるユーザーを保護するためのメカニズムを備えていないアプリケーションがあることです。
ユーザーに害を与えないようにできる限り、ユーザーの入力を変更しないために、悪意のあるコードをデータベースに保存しても安全ですか?
私の意見では、データベース内のデータをエスケープすることは悪い方法です。エスケープルールは入力と出力メディア(HTML、JSONなど)によって異なるため、データベースではなく、データを入力および出力する場所に属します。
多層アーキテクチャ を使用することをお勧めします。ここで、データ層(つまり、データベース)にはプレーン(エスケープされていない)データが含まれ、ロジック層(つまり、ビジネスロジック)はこれらのプレーンデータとプレゼンテーション層(つまり、ウェブサイト、REST API、...)は、データのエスケープとエスケープ解除を処理します。これにより、さまざまなエスケープルールに応じて、データが適切にエスケープ解除(入力)およびエスケープ(出力)されます。入力および出力メディア(HTML、JSON、PDF、YAMLなど)...
...しかし、他の一部のアプリケーションには、データが表示されるユーザーを保護するためのそのようなメカニズムがない場合があります。
そのような壊れたアプリケーションを恐れているなら、JSONを出力するためにHTMLエスケープで事前エスケープされたデータを使用するアプリケーション、またはデータベースなどですでにエスケープされている場合でもデータを再度エスケープするアプリケーションも恐れるべきです。データの方法には明確なルールが必要ですデータベース(エスケープだけでなく、UTF-8などの文字エンコーディングも含まれます)に保存され、アプリケーションはこれらのルールを知って従う必要があります。