このセクションでは、リレーショナルデータベースとNoSQLデータベースの両方を含む、すべてのデータストアへのセキュアなアクセスについて説明します。考慮すべき事項は以下のとおりです。
- セキュアなクエリ
- セキュアな設定
- セキュアな認証
- セキュアな通信
SQLインジェクションは、信頼できないユーザ入力が安全でない方法でSQLクエリに動的に追加された場合に発生します。それはしばしば基本的な文字列連結により発生します。SQLインジェクションは、最も危険なアプリケーションセキュリティリスクの1つです。 SQLインジェクションは悪用されやすく、データベースに含まれる情報すべてが盗まれたり、ワイプされたり、変更されたりする可能性があります。SQLインジェクションを活用して、データベースをホストしているオペレーティングシステムに対して危険なコマンドを実行され、ネットワーク上に足がかりを与えてしまうことも考えられます。 SQLインジェクションを軽減するために、信頼できない入力はSQLコマンドの一部として解釈されないようにすべきです。これを行うには、「クエリのパラメータ化」というプログラミング手法を用いるのが最善です。この手法をSQL、OQL、およびストアド・プロシージャの構築に適用する必要があります。 ASP、ColdFusion、C#、Delphi、.NET、Go、Java、Perl、PHP、PL / SQL、PostgreSQL、Python、R、RubyおよびSchemeにおける「クエリのパラメータ化」の例は、http://bobby-tables.comとOWASP Cheat Sheet on Query Parameterizationを確認ください。
データベースクエリの特定の場所はパラメータ化できません。これらの場所は、各データベースベンダーによって異なります。パラメータ化されたクエリにバインドできないデータベースクエリパラメータに直面するときには、完全一致の検証または手動エスケープを確実に実行してください。また、パラメータ化されたクエリの使用はパフォーマンスにポジティブな影響を与えますが、特定のデータベース実装での特定のパラメータ化されたクエリは、パフォーマンスにネガティブな影響を与えます。特に広範な節やテキスト検索を行う複雑なクエリに関しては、パフォーマンスのテストを実施するようにしてください。
残念なことに、データベース管理システムは、必ずしも「初期設定がセキュアな」構成で出荷されるわけではありません。データベース管理システム(DBMS)およびホスティングプラットフォームから利用可能なセキュリティコントロールが有効となり、適切に構成されるように注意する必要があります。 DBMSで利用可能な標準、ガイド、ベンチマークがあります。
データベースへのすべてのアクセスを適切に認証する必要があります。 DBMSへの認証は、安全な方法で行う必要があります。認証は、セキュアなチャネルを介してのみ行う必要があります。資格情報は適切に保護され、使用可能でなければなりません。
ほとんどのDBMSは、セキュア(認証された、暗号化された)、セキュアでない(認証されていない、または暗号化されていない)さまざまな通信方法(サービス、APIなど)をサポートしています。どこでもデータを保護できるようセキュアな通信オプションのみを使用することをお勧めします。