オープンリダイレクト
オープンリダイレクトが実行されるのは、アプリケーションが検証なしでユーザ制御パラメータ値に動的にリダイレクトされる場合です。オープンリダイレクトを防止するには、ハードコードされたリダイレクトを使用します。
オープンリダイレクトは、任意のリダイレクトまたは検証されないリダイレクトとも呼ばれます。この脆弱性は、フィッシング攻撃でユーザを任意の URL にリダイレクトするために使用されます。
Apex の例
次の関数定義では、String.redirect ステートメントが現在のページの redirect URL パラメータを取得します。このパラメータは、リダイレクト URL を作成して、その URL へのクライアント側リダイレクトを実行するために使用されます。
1public PageReference changepassword(){
2 PageReference savePage;
3 String redirect = ApexPages.currentPage().getParameters().get('redirect');
4 redirect = (redirect == NULL) ? '/home/home.jsp' : redirect;
5 savePage = new PageReference(redirect);
6 savePage.setRedirect(true);
7 return savePage;
8}<apex:form> という Visualforce マークアップ表示は、changepassword アクションをトリガします。これによって、パッケージにオープンリダイレクトの脆弱性が生じます。
1<apex:form>
2 Redirection action: <apex:inputText value="{!userInput}" />
3 <br/><apex:commandButton value="Submit" action="{!changepassword}" />
4</apex:form>修正したコード
オープンリダイレクトは、リダイレクトパラメータを潜在的な攻撃者にさらします。オープンリダイレクトを防止するには、複数の戦略が必要です。戦略の 1 つとして、ハードコードされたリダイレクトを使用する方法があります。ハードコードされたリダイレクトでは、次の例に示すように値を明示的に設定します。
1public PageReference changepassword(){
2 PageReference savePage;
3 savePage = new PageReference('/home/home.jsp');
4 savePage.setRedirect(true);
5 return savePage;
6}オープンリダイレクト、およびオープンリダイレクトをコードで防止する方法の詳細は、Trailhead の「Secure Server-Side Development module (セキュアなサーバーサイド開発モジュール)」を確認してください。