phpやmysqlなどを使用してWeb上のデータベースでコーディングする場合、データをデータベースに挿入する前にデータをサニタイズして、誰かが引用符などをエスケープしないようにする必要があります。これはAndroidとMySQLiteで必要ですか?自動的に消毒されますか?それとも単に不要ですか?
2 に答える
1)はい、プラットフォームに関係なく、信頼できないソース(ユーザー、別のシステム、別のアプリなど、アプリケーションにハードコードされていないもの)からの入力をサニタイズする必要があります。
2)はい、SQLiteデータベースにアクセスするときにAndroidでこれを行う必要があります(直接またはコンテンツプロバイダーを介して)。
3)データベースへのSQLコマンドで入力を使用する前に入力をサニタイズする必要がありますが、すべての形式のSQLインジェクションを防ぐことはできません。これを防ぐための最善の戦略は、パラメータ化されたクエリを利用することです。これにより、データベースは、データの意味とコマンドの意味を区別できるため、不正な入力が侵入してSQLコマンドがデータに表示された場合でも、データベースはそれらをデータとして扱うことを知っています。標準のJavaコーディングでは、これにはPreparedStatementsの使用が含まれます。SQLite / Androidでは、を使用compileStatement
してデータのプレースホルダー(信頼できない入力から派生したもの)を使用してクエリを作成し、を使用bindString
してそれらのプレースホルダーを設定する必要があります。
これについては、優れたOWASPSQLインジェクションの記事を参照してください。
これは、インターネットを含む他の場所と同様に、ここでも同様に当てはまります。
本当に注意しなければならないことの1つは、コンテンツプロバイダーへの入力です。人々は通常、コンテンツプロバイダーを作成し、それを使用して他のユーザーが自分のアプリとやり取りできるようにします。ただし、通常は内部で、ContentProviderはデータベースへのインターフェイスとして機能します。これは、特にアプリのコンテンツプロバイダーに電話上の他のアプリからのアクセスを許可する場合は、必ず注意する必要がある場所の1つです。
そして、はい、ユーザーがデータを入力する可能性のある他の場所でも、注意する必要があります。これには、編集可能なテキストフィールド、インターネットからダウンロードしたもの、基本的に信頼できないものなどが含まれます。
汚染分析を行うプロジェクト、TaintDroidがありますが、それはシステムフォームとしてのみ存在します(つまり、すべてのシステムで利用できるわけではないランタイム変更に基づいて機能します)。ただし、現在進行中のいくつかの研究プロジェクトでは、どのデータがどこに流れるかを追跡することを目的としており、この問題を防ぐのに役立ちます。(Scandroid [1]は、数少ない名前の1つです。)
[1] SCanDroid:Androidアプリケーションの自動セキュリティ認証、www.cs.umd.edu /〜avik / papers / scandroidascaa.pdf