2012-05-30 7 views
7

मैं अवसर वस्तु में जोड़े गए एक कस्टम बटन से एपेक्स कोड निष्पादित करने के लिए एक तकनीक की तलाश में हूं जो उपयोगकर्ता को सीएसआरएफ के खिलाफ सुरक्षा देता है।सीएसआरएफ सुरक्षित कस्टम बटन एपेक्स विधि से जुड़े

उपयोग किए जाने वाले वर्तमान दृष्टिकोण प्रश्न - Custom Button or Link to a Visualforce page with a custom controller से आता है। अनिवार्य रूप से:

  1. "विजुअलफोर्स पेज" पर सेट सामग्री स्रोत के साथ एक अवसर कस्टम बटन है।
  2. इस बटन के लिए सामग्री एक Visualforce पेज standardController के लिए अवसर का उपयोग करता है के लिए सेट है, एक विस्तार सुप्रीम वर्ग में प्रवेश किया और उस वर्ग
  3. कार्रवाई विधि एक और कस्टम Visualforce पृष्ठ के लिए एक PageReference रिटर्न में एक विधि के लिए एक कार्य है , अवसर आईडी के साथ पैरामीटर जोड़ने सहित।
  4. यह दूसरा कस्टम विजुअलफोर्स पृष्ठ वास्तविक सेवा का बड़ा हिस्सा करता है, जिसमें वेब सेवा कॉलआउट बनाने और उपयोगकर्ता को अवसर पर वापस रीडायरेक्ट करने से पहले डीएमएल संचालन करना शामिल है।

इस दृष्टिकोण के साथ इस मुद्दे को, कि दूसरी कस्टम Visualforce पृष्ठ पर HTTP के माध्यम से लिया गया है प्राप्त है क्वेरी स्ट्रिंग से मानकों को खींचती है, और कोई CSRF संरक्षण के साथ अद्यतन/सम्मिलित DML कार्रवाई करता है। यह Force.com सुरक्षा स्रोत कोड स्कैनर द्वारा उठाया जा रहा है।

मुझे यह जोड़ना चाहिए कि यह शीर्ष कोड एक प्रबंधित और एक अप्रबंधित पैकेज दोनों के रूप में तैनात किया गया है, इसलिए पृष्ठ रेफरेंस का उपयोग कर लक्षित विजुअलफोर्स पेज पर रीडायरेक्ट करने के लिए अतिरिक्त कार्य। यह सुनिश्चित करता है कि यदि आवश्यक हो तो नामस्थान उपसर्ग जोड़ा जाता है।

मैं सीएसआरएफ मुद्दे से कैसे बच सकता हूं?

मैं एक बटन के साथ दूसरे विज़ुअलफोर्स पेज में कोई फॉर्म नहीं जोड़ना चाहता हूं जिसे उन्हें प्रक्रिया शुरू करने के लिए दबाया जाना चाहिए (और इसलिए पोस्टबैक में ViewStateCSRF सुरक्षा को चुनना)। उपयोगकर्ताओं के परिप्रेक्ष्य से वे ऑपरेशन करने के लिए पहले ही बटन दबा चुके हैं।

मैं डेवलपर बल मंच पर इस सवाल पूछा है से पहले और एक समाधान के साथ आने नहीं किया - Cross-Site Request Forgery (CSRF/XSRF) safe Custom Button action

शायद मैं दूसरा दृश्य बल पेज के लिए नियंत्रक से बाहर कोड ले जाने का प्रयास किया जाना चाहिए और इसके बजाय स्टैंड नियंत्रक के विस्तार का उपयोग कर?

मैं एपेक्स वेब सेवा (जैसा कि Call a apex method from a custom button और How invoke APEX method from custom button में सुझाया गया है) में जावास्क्रिप्ट कॉलबैक पर स्विच कर सकता है, लेकिन यह थोड़ा गन्दा लगता है और मुझे यकीन नहीं है कि मैं केवल सुरक्षा समस्याओं की एक और श्रृंखला खोलूंगा वेब सेवा के साथ।

उत्तर

2

मैंने सेल्सफोर्स के साथ साझेदार सुरक्षा कार्यालय के घंटे बुक किए और सीधे इस मुद्दे पर चर्चा की।

जो मैं करने की कोशिश कर रहा हूं वह वर्तमान में समर्थित नहीं है अगर सीएसआरएफ सुरक्षा की आवश्यकता है (यानी ऐप एक्सचेंज को प्रकाशित करने के लिए)।उन्होंने दो वैकल्पिक दृष्टिकोण सुझाए:

  1. संवेदनशील एपेक्स कोड को ट्रिगर करने वाले विजुअलफोर्स पेज में एक मध्यवर्ती फ़ॉर्म बनाएं। इसलिए सीएसआरएफ सुरक्षा में निर्मित उठाओ।
  2. अवसर विस्तार पृष्ठ को ओवरराइड करें (शीर्ष का उपयोग करके: समान जानकारी प्रदर्शित करने के लिए विवरण)। इस नए विजुअलफोर्स पेज में संवेदनशील एपेक्स कोड का आह्वान करने और स्वचालित सीएसआरएफ सुरक्षा प्राप्त करने के लिए विकल्प 1 पर वापस एक समान फॉर्म शामिल होगा।

एक और दृष्टिकोण है कि कस्टम बटन का उपयोग नहीं करता एम्बेड करने के लिए/इनलाइन एक Visualforce पेज (Embed a Page on a Standard Layout) देखना मानक पेज लेआउट के भीतर सिर्फ आवश्यक बटन से युक्त।

एम्बेडेड Visualforce पेज का उपयोग करना चाहिए है मानक पेज लेआउट पर उपलब्ध विजुअलफोर्स पृष्ठों की सूची में दिखाई देने के लिए मानक ऑब्जेक्ट कंट्रोलर (मेरे मामले में अवसर)। विजुअलफोर्स पेज केवल <apex:form> के अंदर एक कमांड बटन के साथ बहुत ही कम हो सकता है। विजुअलफोर्स पेज का लेबल भी हो सकता है पृष्ठ लेआउट में प्रदर्शित किया गया।

<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 जिसके परिणामस्वरूप iframe के भीतर सर्वर को वापस पोस्ट के साथ "com.salesforce.visualforce.ViewStateCSRF" छिपा इनपुट लेने होंगे।


मैं अगर वे कस्टम बटन के साथ सीधे इस के लिए समर्थन जोड़ सकते हैं देखने के लिए आइडिया Invoking Apex code from the standard Entity Details pages with CSRF protection उठाया गया है।

0

दूसरे पृष्ठ को लॉन्च करने के लिए आप पहली बार जावास्क्रिप्ट बटन का उपयोग क्यों नहीं करते? पहले पृष्ठ को पूरी तरह से बाईपास करें।

बिक्री बल प्रतिपादन से पहले स्क्रिप्ट में विलय लागू करेगा (ताकि आप दूसरे यूआरएल में opp आईडी शामिल करने के लिए {!Opportunity.Id} का उपयोग कर सकें) और आप ब्राउज़र को अपने दूसरे पृष्ठ पर रीडायरेक्ट कर सकते हैं।

+0

मेरा मुख्य मुद्दा यह है कि जब उपयोगकर्ता किसी HTTP GET अनुरोध के माध्यम से दूसरे पृष्ठ पर आता है तो वे सीएसआरएफ के लिए खुले होते हैं क्योंकि दूसरा पृष्ठ क्वेरी स्ट्रिंग पैरामीटर लेगा और सम्मिलित करें और अपडेट ऑपरेशंस के साथ-साथ वेब सेवा कॉलआउट । साथ ही, जावास्क्रिप्ट के साथ मैं लक्ष्य दृश्य पृष्ठ को इस तरह से संदर्भित नहीं कर सकता कि नामस्थान उपसर्ग के कारण प्रबंधित पैकेज के अंदर और बाहर दोनों काम करता है। –

+0

ठीक है, # 1 आप पृष्ठ का संदर्भ देने के लिए 'URLFOR' या '$ पृष्ठ.pagename' या उनके संयोजन का उपयोग कर सकते हैं। यह आपके नेमस्पेस मुद्दे को चाहिए। दूसरा, सीएसआरएफ केवल फॉर्म क्रियाओं के लिए आग लगाना चाहिए, यह मेरी समझ है कि आपके पास पृष्ठ 2 में ऐसी कोई चीज़ नहीं है, नहीं? अनिवार्य रूप से आपका विस्तार कन्स्ट्रक्टर सभी काम करता है? यदि ऐसा है, तो आपका पृष्ठ अभी भी सीएसआरएफ के लिए खुला होगा, इससे कोई फर्क नहीं पड़ता कि आप इसे फॉर्म फोर्स (टोकन के साथ) प्रस्तुत करने के बिना इसे हल नहीं कर सकते हैं और फिर इसे 'ऑनलोडेड' से सबमिट कर सकते हैं। लेकिन (और यह एक बड़ा है लेकिन) आप इसके साथ सीएसआरएफ को हल नहीं करते हैं (अगली टिप्पणी देखें) – mmix

+0

आप इसे हल नहीं करते हैं क्योंकि आपके पृष्ठ के ज्ञान के साथ दुर्भावनापूर्ण साइट अभी भी क्वेरी स्ट्रिंग के साथ एक GET अनुरोध भेज सकती है और बिक्री बल इसके लिए एक टोकन बनाते हैं और कृपया उनके लिए भी जमा करते हैं। – mmix

संबंधित मुद्दे