web-dev-qa-db-ja.com

悪意のあるコードをDBに保存する

入力フィールドがデータベースに保存され、Webサイトの別の場所に表示される入力フィールドがあるWebサイトがあるとします。

  • データが表示されるときに、出力のサニタイズ/エスケープのみを行うのは安全ですか?

  • 悪意のあるデータが最初にデータベースに入るのを防ぐために、入力をエスケープする必要もありますか?

私が心配しているのは、アプリケーションがデータベースからデータをエスケープするなどして出力を処理する場合でも、データが表示されるユーザーを保護するためのメカニズムを備えていないアプリケーションがあることです。

ユーザーに害を与えないようにできる限り、ユーザーの入力を変更しないために、悪意のあるコードをデータベースに保存しても安全ですか?

2
Dropout

私の意見では、データベース内のデータをエスケープすることは悪い方法です。エスケープルールは入力と出力メディア(HTML、JSONなど)によって異なるため、データベースではなく、データを入力および出力する場所に属します。

多層アーキテクチャ を使用することをお勧めします。ここで、データ層(つまり、データベース)にはプレーン(エスケープされていない)データが含まれ、ロジック層(つまり、ビジネスロジック)はこれらのプレーンデータとプレゼンテーション層(つまり、ウェブサイト、REST API、...)は、データのエスケープとエスケープ解除を処理します。これにより、さまざまなエスケープルールに応じて、データが適切にエスケープ解除(入力)およびエスケープ(出力)されます。入力および出力メディア(HTML、JSON、PDF、YAMLなど)...

...しかし、他の一部のアプリケーションには、データが表示されるユーザーを保護するためのそのようなメカニズムがない場合があります。

そのような壊れたアプリケーションを恐れているなら、JSONを出力するためにHTMLエスケープで事前エスケープされたデータを使用するアプリケーション、またはデータベースなどですでにエスケープされている場合でもデータを再度エスケープするアプリケーションも恐れるべきです。データの方法には明確なルールが必要ですデータベース(エスケープだけでなく、UTF-8などの文字エンコーディングも含まれます)に保存され、アプリケーションはこれらのルールを知って従う必要があります。

6
Steffen Ullrich