我正在寻找从加入到物体机会以能够防止CSRF用户的方式自定义按钮执行的Apex代码的技术。
当前正在使用的方法来自这个问题- 自定义按钮或链接的Visualforce页面定制控制器 。 实质上:
- 有一个与设置为“Visualforce页面”内容源的机会自定义按钮。
- 此按钮的内容设置为使用的机会,让standardController一个Visualforce页面,进入了一个扩展顶点类和在类的方法的动作
- 该操作方法返回一个PageReference其它自定义Visualforce页面,包括添加有机会ID的参数。
- 这第二个自定义Visualforce页面做大量的实际工作,包括制作Web服务标注和重定向用户返回到之前的机会进行DML操作。
这种方法的问题是,第二个自定义Visualforce页面通过一个HTTP GET检索,从查询字符串参数拉,并没有CSRF保护执行更新/插入DML操作。 这是由Force.com安全扫描器+源代码回升。
我要补充,该顶点代码部署既是管理和非托管封装,因此额外的工作使用PageReference重定向到目标Visualforce页面。 这可确保在需要的命名空间前缀添加。
我怎样才能避免CSRF问题?
我不想一个形式添加到第二visualforce页面的按钮,他们必须按启动程序(并因此拿起在回发的ViewStateCSRF保护)。 从用户的角度来看,他们已经按下按钮进行操作。
我之前问过的开发者论坛上力这个问题,并没有拿出一个解决方案- 跨站请求伪造(CSRF / XSRF)安全的自定义按钮动作
也许我应该尝试移动代码到控制器的第二视觉力页面,并使用扩展支架控制呢?
我可以切换到JavaScript回调到顶点的Web服务(如建议呼叫从一个自定义按钮一个顶点方法以及如何调用自定义按钮APEX方法 ),但似乎有点乱,我不知道如果我刚刚被打开了安全问题的另一个范围内的Web服务。
我订了合作伙伴安全办公时间与Salesforce,并直接与他们讨论了这个问题。
我正在试图做的是目前不支持,如果需要CSRF保护(即发布到App交易所)。 他们提出了两个备选方案:
- 创建触发敏感的Apex守则Visualforce页面的中间形式。 因此捡了内置的CSRF保护。
- 重写机会详细信息页(使用顶点:详细显示类似的信息)。 这种新的Visualforce页面将包括一个类似的形式邮寄回选项1调用敏感的APEX代码,并获得自动CSRF保护。
不使用自定义按钮的另一种方法是嵌入/直列一个Visualforce页面(请参阅嵌入的标准布局页面)包含标准的页面布局中只是所需的按钮。
嵌入式Visualforce页面必须使用标准的对象控制器(在机会我的情况)出现在标准的页面布局可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的命令按钮会拿起“com.salesforce.visualforce.ViewStateCSRF”隐藏输入与回发到服务器所产生的iframe内。
我提出的理念与标准实体详情页与CSRF保护调用的Apex代码 ,看看他们是否能为这个直接与自定义按钮添加支持。
你为什么不使用摆在首位一个JavaScript按钮启动第二页? 完全绕过第一页。
Salesforce的应用将合并到脚本渲染(这样才可以使用{!Opportunity.Id}
包括在第二URL OPP ID),你可以简单地将浏览器重定向到第二个页面。