当前位置: 首页 > 知识库问答 >
问题:

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

艾浩穰
2023-03-14

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

当前使用的方法来自“问题-自定义”按钮或指向带有自定义控制器的Visualforce页面的链接。本质上:

  1. 有一个商机自定义按钮,内容源设置为“VisualForce Page”。
  2. 此按钮的内容设置为使用standardController的Opportance的Visualforce页面,该页面输入了extension apex类,并为该类中的方法执行了操作
  3. action方法将页面引用返回到另一个自定义Visualforce页面,包括添加一个具有机会ID的参数。
  4. 此第二个自定义Visualforce页面完成了大部分实际工作,包括在将用户重定向回商机之前进行web服务标注和执行DML操作。

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

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

如何避免CSRF问题?

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

也许我应该尝试将代码移出第二个可视化force页面的控制器,而使用stand控制器的扩展?

我可以切换到对Apex Web服务的Javascript回调(正如在Call a Apex method from a custom button和How invoke Apex method from custom button中所建议的那样),但这似乎有点混乱,我不确定是否会打开Web服务的另一系列安全问题。

共有1个答案

金慈
2023-03-14

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

如果需要CSRF保护(即发布到App Exchange),当前不支持我正在尝试的操作。他们提出了两种备选办法:

  1. 在Visualforce页面中创建触发敏感顶点代码的中间窗体。因此可以使用内置的CSRF保护。
  2. 覆盖“商机详细信息”页面(使用apex:details显示类似信息)。这个新的Visualforce页面将包含一个类似的表单,回发到选项1以调用敏感的顶点代码并获得自动CSRF保护。
<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中返回服务器。

我提出了从带有CSRF保护的标准实体详细信息页面中调用Apex代码的想法,看看它们是否可以通过自定义按钮直接添加对此的支持。

 类似资料:
  • 本文向大家介绍yii2.0之GridView自定义按钮和链接用法,包括了yii2.0之GridView自定义按钮和链接用法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了yii2.0之GridView自定义按钮和链接用法。分享给大家供大家参考。具体实现方法如下: 运行效果如下图所示: 希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。

  • 本文向大家介绍wxWidgets自定义按钮的方法,包括了wxWidgets自定义按钮的方法的使用技巧和注意事项,需要的朋友参考一下 场景: 1.现在的软件上的按钮都不是标准的按钮了,因为基本上是贴图上去的,正常情况下一种图片,鼠标移上去之后按钮显示另一种效果,按下去之后又是另一种效果。 2.wx的做法其实和mfc的按钮原理是一样的,就是给按钮贴图和重绘背景。 以下是源文件. dh_bitmap_b

  • 本文向大家介绍C# WPF 自定义按钮的方法,包括了C# WPF 自定义按钮的方法的使用技巧和注意事项,需要的朋友参考一下 本文介绍WPF一种自定义按钮的方法。 实现效果 使用图片做按钮背景; 自定义鼠标进入时效果; 自定义按压效果; 自定义禁用效果 实现效果如下图所示: 实现步骤 创建CustomButton.cs,继承自Button; 创建一个资源文件ButtonStyles.xaml; 在资

  • > 标高,同时具有自定义可绘制。 在用户触摸的地方启动涟漪效果。

  • 问题内容: 我想在UITextField上创建自定义清除按钮,即使用rightView并将图像放在此处,问题是将原始的清除按钮事件附加到该自定义rightView上。 在Objective-C中,我可以这样做: 现在如何将其转换为Swift?或任何解决方法? 问题答案: 您可以将自定义按钮添加为类似这样的右视图

  • 我正在努力修改MUI next(v1)中的按钮颜色。 我该如何设置muitheme,使其行为与bootstrap相似,这样我就可以用“btn危险”表示红色,“btn成功”表示绿色? 我尝试了自定义,但它不能正常工作(悬停颜色不会改变),而且似乎是重复的。我有什么选择?