我正在寻找一种技术来从添加到 Opportunity 对象的自定义按钮执行 Apex 代码,以保护用户免受 CSRF 侵害。
当前使用的方法来自问题 -自定义按钮或使用自定义控制器链接到 Visualforce 页面。本质上:
- 有一个机会自定义按钮,内容源设置为“Visualforce 页面”。
- 此按钮的内容设置为 Visualforce 页面,该页面使用标准控制器的机会,输入了扩展 apex 类和该类中方法的操作
- 操作方法将 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 服务的另一个范围的安全问题。