Java」の内容をベースに、Android特有の情報を交えつつ、堅牢なプログラムを開発するためのノウハウを具体的な事例とともに紹介していきます。第2回では、さっそくAndroidの話題をとりあげます。AndroidのContentProviderを使うときの注意点を解説します。はじめにAndroidにはデータを読み書き/共有するための仕組みとしてContentProviderがあります。データの読み書きを簡単に実装するためのインターフェースも備えていて便利なものです。Androidでは基本的に他のアプリケーションとデータをやり取りすることはできません。自分が作成したアプリケーションのデータを他のアプリケーションで利用してもらう場合、データを共有する方法の一つとして、ContentProviderを活用できます。Android端末に標準でインストールされているContacts(連絡先)のデータはContentProviderを使用して取得することができます。アプリケーション内でのデータの読み書きを簡単に実装することができたり、他のアプリケーションとデータを共有することができたりと便利な仕組みですが、そのアクセス範囲を意識しておかないと、本来は公開したくない情報まで外部に公開してしまい、他のアプリケーションから自由にアクセスされてしまいます。アクセス制限方法では実際にアクセスを制限する方法を見ていきましょう。独自のContentProviderを実装していく上でマニフェストファイル(AndroidManifest.xml)に登録を行いますが、その部分でパーミッションを設定し、ContentProviderを非公開にするか他のアプリケーションにも公開するのかアクセスできる権限を指定することになります。ContentProviderを継承してSampleContentProviderを実装したとし、マニフェストファイルに次のように記述したとします。/>パーミッションを指定していないこのような場合は、他のアプリケーションからSampleContentProviderにアクセスすることができます。非公開このContentProviderを持っているアプリケーションだけがアクセスできるように制限するには、android:exportedプロパティを明示的にfalseにします。すると、他のアプリケーションからは一切アクセスできなくなります。指定されたパーミッションを宣言しているアプリケーションのみアクセスできるようにするには、android:permissionプロパティにパーミッション名を記述し、permission要素で宣言します。/>こうすることで、uses-permission要素でそのパーミッションを要求しないと、アプリケーションではSampleContentProviderにはアクセスできなくなります。/>同じ署名を持ったアプリケーションのみ同じ署名を持ったアプリケーションのみSampleContentProviderにアクセスできるようにするには、permission要素のandroid:protectionLevelプロパティにsignatureと記述します。android:name="com.example.app.permission.Provider"></permission>こうすることで、SampleContentProviderにアクセスできるアプリケーションを、特定のパーミッションを許可されていることに加えて、元のアプリケーションと同じ署名を持っているもののみに制限することができます。AndroidでこのContentProvider絡みの脆弱性が実際にありました。/></provider>このように特にアクセス制限をかけていなかったため、他のアプリケーションからも読み書きなどが自由にできる状態になっており、例えば、他のアプリケーションからデータベースに変更を加え、Dropboxの公開用フォルダである「Public」フォルダにDropboxのアカウント情報が含まれている設定ファイルをアップロードさせたりすることが可能でした。現在の最新バージョン(執筆時点で1.2.4)では、この問題に対して以下のように対策されています。/></provider>このようにandroid:exportedプロパティでfalseを指定し、他のアプリケーションからはアクセスできないようになっています。まとめContentProviderはデータの読み書き/共有を実装する上で便利なものですが、そのデータは本当に他のアプリケーションに公開する必要があるのか、また、公開する場合もContentProviderにアクセスできる範囲をしっかり意識して設定する必要があります。File連載通知を行うには会員登録(無料)が必要です。会員の方はログインを行ってください。圧縮・解凍UNIX基本講座@CodeZine『CodeZine(コードジン)』の公式アカウントです。【NEW】デブスト2019デブサミ2019福岡・関西デブサミ2019夏デブスト関西デブサミ2019×ログインEメールパスワード※旧SEメンバーシップ会員の方は、同じ登録情報(Eメール&パスワード)でログインいただけます。イラストの無断転載を禁じます。記載されているロゴ、システム名、製品名は各社及び商標権者の登録商標あるいは商標です。