gpt4 book ai didi

salesforce - 链接到 Apex 方法的 CSRF 安全自定义按钮

转载 作者:行者123 更新时间:2023-12-04 12:48:52 25 4
gpt4 key购买 nike

我正在寻找一种从添加到 Opportunity 对象的自定义按钮执行 Apex 代码的技术,以保护用户免受 CSRF 的影响。

当前使用的方法来自问题 - Custom Button or Link to a Visualforce page with a custom controller .本质上:

  • 有一个机会自定义按钮,内容源设置为“Visualforce 页面”。
  • 此按钮的内容设置为 Visualforce 页面,该页面使用机会作为标准 Controller ,输入了扩展顶点类和该类中方法的操作
  • 操作方法将 PageReference 返回到另一个自定义 Visualforce 页面,包括添加具有机会 ID 的参数。
  • 第二个自定义 Visualforce 页面执行大部分实际工作,包括在将用户重定向回商机之前进行 Web 服务标注和执行 DML 操作。

  • 这种方法的问题在于,第二个自定义 Visualforce 页面是通过 HTTP GET 检索的,从查询字符串中提取参数,并在没有 CSRF 保护的情况下执行更新/插入 DML 操作。 Force.com 安全源代码扫描程序正在获取此信息。

    我应该补充一点,此 apex 代码同时部署为托管和非托管包,因此需要额外的工作来使用 PageReference 重定向到目标 Visualforce 页面。这可确保在需要时添加命名空间前缀。

    如何避免 CSRF 问题?

    我不想向第二个visualforce 页面添加一个带有按钮的表单,他们必须按下该按钮才能启动该过程(从而在回发中选择ViewStateCSRF 保护)。从用户的角度来看,他们已经按下了按钮来执行操作。

    我之前在开发者力量论坛上问过这个问题,但没有提出解决方案 - Cross-Site Request Forgery (CSRF/XSRF) safe Custom Button action

    也许我应该尝试将第二个视觉力页面的代码移出 Controller ,并改为使用支架 Controller 的扩展?

    我可以切换到 Apex Web 服务的 Javascript 回调(如 Call a apex method from a custom buttonHow invoke APEX method from custom button 中所建议的),但这似乎有点困惑,我不确定我是否只是打开了另一范围的安全问题与网络服务。

    最佳答案

    我与 Salesforce 预订了合作伙伴安全办公时间,并直接与他们讨论了这个问题。

    如果需要 CSRF 保护(即发布到 App Exchange),目前不支持我尝试做的事情。他们提出了两种替代方法:

  • 在触发敏感 Apex 代码的 Visualforce 页面中创建一个中间表单。因此,选择内置的 CSRF 保护。
  • 覆盖商机详细信息页面(使用 apex:Details 显示类似信息)。这个新的 Visualforce 页面将包含一个类似的表单回发到选项 1,以调用敏感的 APEX 代码并获得自动 CSRF 保护。


  • 另一种不使用自定义按钮的方法是嵌入/内联 Visualforce 页面(请参阅 Embed a Page on a Standard Layout),仅包含标准页面布局中所需的按钮。

    嵌入式 Visualforce 页面必须使用标准对象 Controller (在我的例子中是机会)才能出现在标准页面布局上的可用 Visualforce 页面列表中。 Visualforce 页面本身可以非常小,在 <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);
    }
    }

    这应该可以防止 CSRF,因为 commandButton 将拾取“com.salesforce.visualforce.ViewStateCSRF”隐藏输入,并将帖子发回结果 iframe 内的服务器。

    我提出了这个想法 Invoking Apex code from the standard Entity Details pages with CSRF protection看看他们是否可以直接使用自定义按钮添加对此的支持。

    关于salesforce - 链接到 Apex 方法的 CSRF 安全自定义按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10809520/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com