FileMaker Webアプリで見落としやすいセキュリティのポイント

FileMakerを使ったWebアプリでは、そもそもデータベースがSQLではないのでSQLインジェクションの心配をする必要がない。しかし、FileMaker ProやFileMaker Serverのこまかな挙動をしらないままWebアプリを作成すると、思わぬ落とし穴にはまってしまうことがある。今回はその例として、FileMaker Serverの「ファイル表示フィルタ」と「FileMaker Proでの検索」の動作について取りあげよう。

FileMaker Server Admin Console / ファイル表示フィルタ

FileMaker Server Admin Consoleのデータベースサーバーメニュー、セキュリティタブにおいて「ファイル表示フィルタ」という設定項目がある。デフォルト値は「すべてのデータベースをリスト表示」。「各ユーザがアクセスを許可されているデータベースのみをリスト表示」を選択しておくと、FileMaker Proでそのサーバ上の共有ファイルを開こうとするときに、認証のダイアログが表示されるようになる。

ファイル表示フィルタで「各ユーザがアクセスを許可されているデータベースのみをリスト表示」を選択しておくと、FileMaker Proでそのサーバ上の共有ファイルを開こうとするときに認証のダイアログが表示されるようになる。この設定をおこなっていないと、FileMaker側で「[共有ファイルを開く]ダイアログに表示しない」にチェックをしていないファイルが無条件一覧で表示されてしまう

このファイル表示フィルタだが、Web公開の機能にも関わってくる。XML公開/PHP公開には「FileMaker Serverで公開されているファイルの一覧」を取得する機能が用意されているが、このファイル表示フィルタで「各ユーザがアクセスを許可されているデータベースのみをリスト表示」を選択していないと、無条件でファイルの一覧を取得することが可能になってしまう。

  • XML公開が有効のFileMaker Server: http://(WebサーバのIPアドレス)/fmi/xml/FMPXMLRESULT.xml?-dbnames
  • PHP公開が有効のFileMaker Server: http://(WebサーバのIPアドレス)/fmi/xml/fmresultset.xml?-dbnames

FileMakerのファイルで適切なアカウント管理をおこなっていない(admin/パスワードなしや、admin/adminなど、簡単なパスワード管理しかしていない)場合、たとえば-dbnamesで拾ったデータベースファイル名を-dbとして指定し、各種クエリを組みたててアクセスすることで

  • -layoutnamesでレイアウト名の一覧を取得
  • -scriptnamesでスクリプト名一覧を取得
  • -scriptでスクリプト実行
  • -recid, -findで正規の手順では閲覧できないレコードを参照・編集

といった悪用が可能になってしまう。これらのことを未然に防ぐためにも

  • Webアプリ上のGETの引数値や、ディレクトリ名などにファイル名を登場させない
  • アカウント/パスワードを容易に推測できるようなものにしない
  • Web経由でおこなえる操作を、アクセス権セットの「データアクセスとデザイン」で制限しておく

といった対策をしておきたいところだ。とくにFileMaker Serverを外部のネットワークに配置しているような環境では注意されたい。

ファイル表示フィルタで「各ユーザがアクセスを許可されているデータベースのみをリスト表示」を選択している場合は、ベーシック認証が動作する仕組みになっている。FileMaker Proで共有ファイルを開くときと同様、IDとパスワードの組み合わせで開けるファイルのみがXMLとして返るようになる

FileMaker Webアプリを開発する際は、Web公開用のアカウント・アクセス件セットを別に用意して、カスタムアクセス権を設定しておくのが望ましい

FileMakerのアカウントの管理を使わずに、独自のテーブルで認証処理をおこなっている場合

Webアプリの利用前におこなうログイン処理。このログインにおいて、FileMakerのアカウント管理をもちいないで、独自のテーブルでおこなっている場合も注意が必要だ。たとえば"フィールド全体が一致(==)"でアカウント名とパスワードの検索(-find)をおこなっているだけの場合、FileMakerの演算子として利用されている記号を入れてしまうだけでレコードが該当してしまう。

もっとも危険な例は*だろう。FileMakerで*は「任意の文字列」を意味する。ちゃんと対策をしていない場合、たとえばアカウント名とパスワードを入力するログイン画面で、アカウント名に正規の文字列を、パスワードに*を入れるだけでログインできてしまうことも考えられる。

これらを防ぐためには、PHP側で「*」や「#」を禁則文字として扱い、クエリ値に入っている場合はログイン処理自体を無効にするといった対策をおこなう。FileMakerで特別な演算子として利用されている文字は、PHP/JavaScriptの正規表現などで、これらの文字列をIDやパスワードとして指定できないようにするといった工夫が必要だ。

FileMaker Proで特別な演算子として利用されている文字の一覧

また、FileMakerのWeb公開では英文字の大文字小文字を区別した検索をおこなうことができない。これを解決するには、レコードの検索のあとに、フィールドに格納されている値とフォームから送信された値を比較する必要がある。どちらも見落としやすい動作なので、忘れずにチェックしておこう。