7

CSRF からユーザーを保護する方法で Opportunity オブジェクトに追加されたカスタム ボタンから Apex コードを実行する手法を探しています。

現在使用されているアプローチは、カスタム ボタンまたはカスタム コントローラーを使用した Visualforce ページへのリンクという質問から来ています。基本的に:

  1. コンテンツ ソースが「Visualforce ページ」に設定された商談カスタム ボタンがあります。
  2. このボタンのコンテンツは、標準コントローラの Opportunity を使用する Visualforce ページに設定され、拡張 Apex クラスが入力され、そのクラスのメソッドのアクションが含まれます。
  3. アクション メソッドは、商談 ID を持つパラメータの追加を含め、PageReference を別のカスタム Visualforce ページに返します。
  4. この 2 番目のカスタム Visualforce ページは、Web サービス コールアウトの作成や DML 操作の実行など、実際の作業の大部分を行ってから、ユーザーを商談にリダイレクトします。

このアプローチの問題は、2 番目のカスタム Visualforce ページが HTTP GET を介して取得され、クエリ文字列からパラメーターを取得し、CSRF 保護なしで DML 操作の更新/挿入を実行することです。これは、Force.com Security Source Code Scanner によって検出されています。

この apex コードは管理パッケージと未管理パッケージの両方としてデプロイされるため、PageReference を使用してターゲットの Visualforce ページにリダイレクトする追加の作業が必要になることを付け加えておきます。これにより、必要に応じて名前空間プレフィックスが追加されます。

CSRF の問題を回避するにはどうすればよいですか?

プロセスを開始するために押す必要があるボタンを使用して、2 番目の visualforce ページにフォームを追加したくありません (したがって、ポストバックで ViewStateCSRF 保護を取得します)。ユーザーの観点からは、ユーザーは既にボタンを押して操作を実行しています。

以前開発者フォース フォーラムでこの質問をしたことがありますが、解決策が思いつきませんでした -クロスサイト リクエスト フォージェリ (CSRF/XSRF) 安全なカスタム ボタン アクション

おそらく、2 番目のビジュアル フォース ページのコードをコントローラーから移動し、代わりにスタンド コントローラーの拡張機能を使用する必要がありますか?

Apex Web サービスへの Javascript コールバックに切り替えることはできますが ( 「カスタム ボタンから apex メソッドを呼び出す」および「カスタム ボタンから APEX メソッドを呼び出す方法」で提案されているように)、少し面倒なようで、切り替えるべきかどうかわかりません。 Web サービスで別の範囲のセキュリティ問題が発生するだけです。

4

2 に答える 2

3

パートナー セキュリティ オフィス アワーを Salesforce に予約し、この問題について直接話し合った。

CSRF保護が必要な場合(つまり、App Exchangeに公開する場合)、私がやろうとしていることは現在サポートされていません。彼らは、次の 2 つの代替アプローチを提案しました。

  1. 機密性の高い Apex コードをトリガする Visualforce ページで中間フォームを作成します。したがって、組み込みのCSRF保護を選択します。
  2. 商談の詳細ページを上書きします (apex:Details を使用して同様の情報を表示します)。この新しい Visualforce ページには、機密性の高い APEX コードを呼び出して自動 CSRF 保護を取得するために、オプション 1 に戻る同様のフォーム ポストが含まれます。

カスタム ボタンを使用しないもう 1 つの方法は、標準ページ レイアウト内に必要なボタンだけを含むVisualforce ページを埋め込む/インライン化することです (「標準レイアウトにページを埋め込む」を参照) 。

埋め込まれた Visualforce ページは、標準のオブジェクト コントローラ (私の場合は Opportunity) を使用して、標準のページ レイアウトで利用可能な Visualforce ページのリストに表示される必要があります。Visualforce ページ自体は、 内に commandButton があるだけで非常に最小限にできます<apex:form>。Visualforce ページの表示ラベルもページ レイアウトに表示できます。

<apex:page id="embeddedPage" StandardController="Opportunity" extensions="OpportunityExtensionController" showHeader="false" standardStylesheets="true">
<apex:form >
    <apex:commandButton value="CSRF Safe Button" action="someMethodInTheExtensionClass" />
</apex:form>

public with sharing class OpportunityExtensionController {

    private final Opportunity opportunityFromController;

    public OpportunityExtensionController(ApexPages.StandardController controller) {
        opportunityFromController = (Opportunity)controller.getRecord();        
    }

    public PageReference someMethodInTheExtensionClass() {

        // Perform directly here within the postback rather than redirecting to another page to prevent against XSRF

        System.debug('opportunityFromController.Id:' + opportunityFromController.Id);
    }
}

これにより、commandButton が "com.salesforce.visualforce.ViewStateCSRF" 非表示の入力を取得し、結果の iframe 内のサーバーにポスト バックするため、CSRF から保護する必要があります。


Idea Invoking Apex コードを標準の Entity Details ページから CSRF 保護を使用して作成し、カスタム ボタンを使用してこのサポートを直接追加できるかどうかを確認しました。

于 2012-06-12T22:55:19.843 に答える
0

最初に JavaScript ボタンを使用して 2 番目のページを起動してみませんか? 最初のページを完全にバイパスします。

Salesforce はレンダリングの前にスクリプトにマージを適用し ( {!Opportunity.Id}2 番目の URL に opp ID を含めるために使用できます)、ブラウザを 2 番目のページにリダイレクトするだけです。

于 2012-05-31T08:07:32.210 に答える