2012-05-30 28 views
7

Tôi đang tìm một kỹ thuật để thực thi mã Apex từ nút tùy chỉnh được thêm vào đối tượng Cơ hội theo cách bảo vệ người dùng chống lại CSRF.Nút Tùy chỉnh an toàn CSRF được liên kết với phương thức Apex

Phương pháp hiện tại đang được sử dụng đến từ câu hỏi - Custom Button or Link to a Visualforce page with a custom controller. Về cơ bản:

  1. Có nút tùy chỉnh cơ hội với nguồn nội dung được đặt thành "Trang Visualforce".
  2. Nội dung cho nút này được đặt thành trang Visualforce sử dụng Cơ hội cho standardController, có lớp mở rộng được nhập và hành động cho phương thức trong lớp đó
  3. Phương thức hành động trả về PageReference cho trang Visualforce tùy chỉnh khác , bao gồm thêm thông số với Id cơ hội.
  4. Trang Visualforce tùy chỉnh thứ hai này thực hiện phần lớn công việc thực tế, bao gồm tạo chú dẫn dịch vụ web và thực hiện các hoạt động DML trước khi chuyển hướng người dùng quay lại Cơ hội.

Vấn đề với phương pháp này là trang Visualforce tùy chỉnh thứ hai được truy lục thông qua HTTP GET, lấy tham số từ chuỗi truy vấn và thực hiện cập nhật/chèn hoạt động DML không có bảo vệ CSRF. Điều này đang được chọn bởi máy quét mã nguồn bảo mật Force.com.

Tôi nên thêm mã apex này được triển khai dưới dạng gói được quản lý và không được quản lý, do đó công việc bổ sung để chuyển hướng đến trang Visualforce mục tiêu bằng cách sử dụng PageReference. Điều này đảm bảo tiền tố không gian tên được thêm vào nếu được yêu cầu.

Làm cách nào để tránh vấn đề CSRF?

Tôi không muốn thêm biểu mẫu vào trang trực quan thứ hai bằng nút mà họ phải nhấn để bắt đầu quá trình (và do đó chọn bảo vệ ViewStateCSRF trong bài đăng). Từ góc độ người dùng, họ đã nhấn nút để thực hiện thao tác.

Tôi đã hỏi câu hỏi này trước trên diễn đàn lực phát triển và không đưa ra một giải pháp - Cross-Site Request Forgery (CSRF/XSRF) safe Custom Button action

Có lẽ tôi cần phải cố gắng để di chuyển mã ra của bộ điều khiển cho trang lực lượng thị giác thứ hai và sử dụng phần mở rộng cho bộ điều khiển chân đế thay thế?

Tôi có thể chuyển sang gọi lại Javascript sang Dịch vụ web Apex (như được đề xuất trong Call a apex method from a custom buttonHow invoke APEX method from custom button), nhưng có vẻ hơi lộn xộn và tôi không chắc liệu tôi có đang mở thêm một loạt vấn đề bảo mật khác không với dịch vụ web.

Trả lời

2

Tôi đã đặt Giờ làm việc của đối tác an ninh với Salesforce và thảo luận vấn đề này trực tiếp với họ.

Những gì tôi đang cố gắng thực hiện hiện không được hỗ trợ nếu cần bảo vệ CSRF (tức là để xuất bản lên App Exchange).Họ đã đề xuất hai phương pháp thay thế khác:

  1. Tạo biểu mẫu trung gian trong trang Visualforce kích hoạt Mã Apex nhạy cảm. Do đó, hãy chọn chế độ bảo vệ CSRF tích hợp sẵn.
  2. Ghi đè trang Chi tiết cơ hội (sử dụng đỉnh: Chi tiết để hiển thị thông tin tương tự). Trang Visualforce mới này sẽ bao gồm một mẫu biểu mẫu tương tự quay trở lại tùy chọn 1 để gọi mã APEX nhạy cảm và nhận được sự bảo vệ CSRF tự động.

Một cách tiếp cận mà không sử dụng các nút tùy chỉnh là để nhúng/inline một trang Visualforce (xem Embed a Page on a Standard Layout) chỉ chứa các nút cần thiết trong cách bố trí trang tiêu chuẩn.

nhúng trang Visualforce phải sử dụng bộ điều khiển đối tượng tiêu chuẩn (Cơ hội trong trường hợp của tôi) xuất hiện trong danh sách các trang Visualforce có sẵn trên bố cục trang chuẩn. Bản thân trang Visualforce có thể rất tối thiểu chỉ với một commandButton bên trong một <apex:form> Nhãn của trang Visualforce cũng có thể là được hiển thị trong bố cục trang.

<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); 
    } 
} 

này nên bảo vệ chống lại CSRF như CommandButton sẽ nhặt "com.salesforce.visualforce.ViewStateCSRF" nhập ẩn với bài lại cho máy chủ bên trong iframe kết quả.


Tôi đã nêu ra ý tưởng Invoking Apex code from the standard Entity Details pages with CSRF protection để xem liệu họ có thể thêm hỗ trợ trực tiếp cho điều này bằng các nút tùy chỉnh hay không.

0

Tại sao bạn không sử dụng nút JavaScript ở vị trí đầu tiên để khởi chạy trang thứ hai? Bỏ qua trang đầu tiên hoàn toàn.

Lực lượng bán hàng sẽ áp dụng sáp nhập vào tập lệnh trước khi hiển thị (để bạn có thể sử dụng {!Opportunity.Id} để bao gồm id id trong URL thứ hai) và bạn có thể chuyển hướng trình duyệt đến trang thứ hai của mình.

+0

Vấn đề chính của tôi là khi người dùng đến trang thứ hai thông qua yêu cầu HTTP GET họ mở cho CSRF vì trang thứ hai sẽ lấy tham số chuỗi truy vấn và thực hiện thao tác Chèn và Cập nhật cũng như chú thích Dịch vụ Web . Ngoài ra, với Javascript tôi không thể tham chiếu trang visualforce đích theo cách thức hoạt động cả trong và ngoài gói được quản lý do tiền tố không gian tên. –

+0

Ok, # 1 bạn có thể sử dụng 'URLFOR' hoặc' $ Page.pagename' hoặc kết hợp của chúng để tham chiếu trang. Điều này sẽ fi vấn đề không gian tên của bạn. Thứ hai, CSRF chỉ nên kích hoạt các hành động biểu mẫu, đó là sự hiểu biết của tôi rằng bạn không có điều như vậy ở trang 2, phải không? Về cơ bản, nhà xây dựng mở rộng của bạn thực hiện tất cả công việc? Nếu vậy, trang của bạn sẽ vẫn mở cho CSRF bất kể điều gì, bạn không thể giải quyết vấn đề này mà không cần phải bán hàng biểu mẫu (với mã thông báo) và sau đó gửi nó từ 'onloaded'. Nhưng (và nó lớn nhưng bạn không giải quyết CSRF với điều này (xem bình luận tiếp theo) – mmix

+0

Bạn không giải quyết nó vì trang web độc hại với kiến ​​thức về trang của bạn vẫn có thể gửi yêu cầu GET với chuỗi truy vấn và có salesforce tạo ra một mã thông báo cho nó và vui lòng gửi nó cho họ là tốt. – mmix

Các vấn đề liên quan