クロスサイトリクエストフォージェリ
Salesforce Platform に対して行われたフォーム要求はすべて保護されます。ボタンのクリックなどユーザアクションによってトリガされた挿入、削除、更新、更新/挿入の状態変更操作も保護されます。
- Visualforce ページ
- Lightning Web コンポーネント (LWC)
- Aura
- Visualforce ページのアクションパラメータからコールされた任意のメソッド
Apex の例
1<apex:page controller="maincontroller" action="{!init}">
2
3public pageReference init(){
4
5 UserSetting__c accountToUpdate;
6 pageReference p = page.mainview;
7 // Retrieve the password and redirect query string parameters from the current page URL
8 String password = ApexPages.currentPage().getParameters().get('password');
9 String redirect = ApexPages.currentPage().getParameters().get('redirect');
10 if(string.isBlank(redirect)){
11 p.getParameters().put('redirect', '/home/home.jsp');
12 p.setRedirect(true);
13 } else {
14 p.getParameters().put('redirect', redirect);
15 }
16 if(string.isBlank(password)){
17 p.getParameters().put('password', 'blank');
18 p.setRedirect(true);
19 } else {
20 p.getParameters().put('password', password);
21 accountToUpdate = [SELECT password__c FROM UserSetting__c LIMIT 1];
22 accountToUpdate.password__C = password;
23 update accountToUpdate;
24 }
25 if(p.getRedirect()== true){
26 return p;
27 }
28 else {
29 return null;
30 }
31}ハッカーは、データベースステートメントを変更するパラメータが含まれた URL を作成できるため、自分で選んだ悪意のあるアクションを実行できます。アプリケーションにログインしている間にユーザがそのような URL を開くと、ハッカーが選んだ URL パラメータを使用してコードが実行されます。被害者のブラウザのコンテキストから、意図しないデータベースアクションが実行されます。
Visualforce ページの保護
ページ初期化で状態が変更されるか、または DML 操作が実行されるときに、Visualforce ページの CSRF に対する脆弱性を保護するには、Visualforce ページで confirmationTokenRequired Boolean メタデータ項目を有効にします。
confirmationTokenRequired が true に設定されている場合は、ページに対する GET 要求で、URL 内に CSRF トークンが必要です。このトークンを省略すると、ページにアクセスできません。
デフォルト設定は false で、Apex の組み込み CSRF トークン保護は設定されていません。この項目を設定するには、組織の設定にある関連する Visualforce ページ設定に移動します。
confirmationTokenRequired についての詳細は、『メタデータ API 開発者ガイド』の「ApexPage」を参照してください。
Lightning および LWC CSRF の保護
Lightning または LWC のインスタンス化の際、Apex コントローラで状態変更や DML 操作を実行しないでください。その代わりに、ボタンのクリックなどのユーザアクションによって状態変更をトリガしてください。CSRF、およびコードで CSRF を防ぐ方法についての詳細は、Trailhead の「Secure Server-Side Development module (セキュアなサーバーサイド開発モジュール)」を確認してください。