[Force.comでWeb制作]Force.com ESAPI – APEXで使える汎用セキュリティライブラリ
ESAPI (The OWASP Enterprise Security API) というものがあるのを初めてしったんですが、OWASP(Open Web Application Security Project)というプロジェクトで公開されているエンタープライズなWebアプリで使える汎用的なセキュリティ系のツールキットのようです。
Category:OWASP Enterprise Security API
で、このESAPIのAPEX版が作られていました。
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オブジェクトの参照/編集/作成/削除可能なフィールド一覧を取得したり、現在のユーザ権限でレコードの作成/編集/削除が行えたりします。