【发布时间】:2012-05-30 03:09:41
【问题描述】:
我正在寻找一种技术,通过添加到 Opportunity 对象的自定义按钮执行 Apex 代码,以保护用户免受 CSRF 的影响。
当前使用的方法来自问题 - Custom Button or Link to a Visualforce page with a custom controller。本质上:
- 有一个机会自定义按钮,其内容源设置为“Visualforce 页面”。
- 此按钮的内容设置为 Visualforce 页面,该页面使用标准控制器的机会,输入了扩展顶点类和该类中方法的操作
- 操作方法将 PageReference 返回到另一个自定义 Visualforce 页面,包括添加带有机会 ID 的参数。
- 第二个自定义 Visualforce 页面完成大部分实际工作,包括在将用户重定向回机会之前进行 Web 服务标注和执行 DML 操作。
这种方法的问题在于,第二个自定义 Visualforce 页面是通过 HTTP GET 检索的,从查询字符串中提取参数,并在没有 CSRF 保护的情况下执行更新/插入 DML 操作。 Force.com 安全源代码扫描程序正在收集此内容。
我应该补充一点,此顶点代码同时部署为托管和非托管包,因此使用 PageReference 重定向到目标 Visualforce 页面的额外工作。这样可以确保在需要时添加命名空间前缀。
如何避免 CSRF 问题?
我不想在第二个 visualforce 页面中添加一个表单,他们必须按下一个按钮来启动进程(因此在回发中获取 ViewStateCSRF 保护)。从用户的角度来看,他们已经按下了按钮来执行操作。
我之前在开发者论坛上问过这个问题,但没有提出解决方案 - Cross-Site Request Forgery (CSRF/XSRF) safe Custom Button action
也许我应该尝试将代码移出第二个视觉力页面的控制器,并改用支架控制器的扩展?
我可以切换到 Apex Web 服务的 Javascript 回调(如 Call a apex method from a custom button 和 How invoke APEX method from custom button 中所建议的那样),但它似乎有点混乱,我不确定我是否只是打开另一个范围Web 服务的安全问题。
【问题讨论】:
标签: salesforce csrf apex-code visualforce