[Force.comでWeb制作]Force.com ESAPI – APEXで使える汎用セキュリティライブラリ

By |4月 8, 2010|Force.comでWeb制作, |


ESAPI (The OWASP Enterprise Security API) というものがあるのを初めてしったんですが、OWASP(Open Web Application Security Project)というプロジェクトで公開されているエンタープライズなWebアプリで使える汎用的なセキュリティ系のツールキットのようです。

Category:OWASP Enterprise Security API

で、このESAPIのAPEX版が作られていました。

Force.com ESAPI

APEXでWebアプリを作った際に使えそうなクラス群が提供されています。現状では大きく分けて、

  • Input Validation
  • Output Encoding
  • Access Control for Force.com objects (CRUD/FLS and Sharing)

の3機能があります。
こちらからダウンロードできる一式内にドキュメントがあり、クラス群の紹介がされています。アップしておいたのでこちらからも見れます。スタートガイドも提供されてます。

Getting started with Force.com ESAPI

コード例としては、input Validationの場合は

[php]
String creditCard = ApexPages.currentPage().getParameters().get(‘creditcard’);
try {
creditCard = ESAPI.validator().getValidCreditCard(creditCard, false);
} catch (Exception e) {
/*
report error here using e.getMessage(). Make sure you escape the string before displaying it back on page, and also be careful not to expose any internal information.
*/
}
[/php]

ページパラメータとして受け取ったクレジットカード情報を、getValidCreditCardメソッドに渡してクレジットカード番号としての検証を行います。現状では、VisaとMasterCardの16桁検証だけに対応しているようです。他にも受け取った値の色々な型検証のメソッドがあり、数値、配列、日付、URL、などなど色々あります。日付なんかは日本のものに対応してないので、対応版があると便利そう。

Output Encodingの場合の例としては、

[php]
String usertext = ApexPages.currentPage().getParameters().get(‘usertext’);
usertext = ESAPI.encoder().SFDC_HTMLENCODE(usertext);
[/php]

こんな感じで、HTMLエンコード、JSエンコード、URLエンコード、などが提供されています。Visualforceページで使えるHTMLENCODE、JSENCODE、JSINHTMLENCODE、URLENCODEなどと同じ機能がAPEXコード側で実装できるというものになります。

Access Controlの場合の例としては、

[php]
// s is a modified SObject

try {
ESAPI.accessController().setSharingMode(SFDCAccessController.SharingMode.WITH);
ESAPI.accessController().updateAsUser(s, new List<String>{‘data’});
} catch (SFDCAccessControlException e) {
message = ‘Access Control violation – Type: ‘ + e.getExceptionType() + ‘ Reason: ‘ + e.getExceptionReason() + ‘ Object: ‘ + e.getExceptionObject() + ‘ Field: ‘ + e.getExceptionField() + ‘ Text: ‘ + e.getText();
}
[/php]

こんな感じで、setSharingmodeメソッドでインスタンスをwith sharingモードで実行するように設定したり、updateAsUserメソッドで、第一引数で指定したSオブジェクトに対して第二引数で指定たフィールドのみを更新することができます。他にも、特定のSオブジェクトの参照/編集/作成/削除可能なフィールド一覧を取得したり、現在のユーザ権限でレコードの作成/編集/削除が行えたりします。