インジェクションとXSSの脆弱性を防ぐために、SQLを更新するレガシーアプリを徹底的に調べています。 PHP
のhtmlspecialchars()
をスクリプトに直接渡してページに表示するものはすべて適用することを知っています。
一般に編集できないルックアップテーブルからであっても、every非数値データベースフィールドを削除する必要がありますか?私はそれがより強力な保護を提供するかもしれないと思っています-あなたは誰かがあなたのデータベースを乱用していると仮定し、そこから作業します。
ルックアップテーブルへの外部インターフェイスがない場合は、セキュリティ上の理由から、これらのテーブルからのデータをスクラブする必要はおそらくありません。ただし、例外を追加するよりも、提示するデータを常にスクラブする方が簡単な場合があります。
また、ルックアップテーブルのデータがHTML出力に対して安全である場合、CSV出力に切り替えるとどうなりますか?まだ安全ですか?まだ適切にエスケープされていますか?
「徹底的な防御」。データベースがハッキングされているとは必ずしも想定していませんが、防御的なプログラミングを行っている必要があり、データベースに不正な文字やデータなどが保持されているとは想定していません。
受信するデータに対して入力検証を行い、書き出すものに対して出力検証を実行し、システムの各レイヤー(ブラウザ、Webサーバー、アプリケーションデータベースなど)でそれぞれ検証することをお勧めします。
答えは、その表の列の内容とその使用方法によって異なります。ほとんどの場合、htmlに挿入する前にデータをエスケープすることは正しいことです。
テーブルの目的が、サイトに特定のデータを表示するために管理者が更新できるhtmlのフラグメントを格納することである場合があります。通常、これはCMSと呼ばれます。それがあなたが構築しているものであれば、それをhtmlに含める前にそれをエスケープしたくないでしょう。このような状況では、スクリプトを挿入できることはバグではなく機能になります。
もちろん、そのような設定では、テーブルに何が入れられるかに注意する必要があります。静的なhtmlファイルをサーバーに置くのと同じように、部外者がそのテーブルにデータを入れることも同様に不可能であるべきです。
承認された管理者がデータをテーブルに入力する場合でも、構文エラーや不均衡なタグを検出するために、サニタイズすることをお勧めします。
ここで説明したのは、もちろん、すべての非定数文字列はHTMLに含まれる前にエスケープする必要があるというルールの例外です。
データベースからのこれらの文字列がhtmlタグを含むことができないことを「知っている」という理由だけでエスケープをスキップすると、戻ってきて後で噛み付くような怠惰になります。疑わしい場合はエスケープを使用してください。