2011-02-01 14 views
25

मैं केकेपीएचपी के साथ एक प्रणाली बना रहा हूं जिसे स्थायी रूप से सुरक्षित करने की आवश्यकता है, क्योंकि हम पैसे, ग्राहक के खाते आदि से निपट रहे हैं। अब तक सबकुछ बढ़िया काम कर रहा है, जब तक मुझे भुगतान प्लेटफॉर्म के साथ एकीकृत नहीं करना पड़ेगा मुझे अपनी साइट पर रीडायरेक्ट करने की आवश्यकता है और वे मेरे पास वापस रीडायरेक्ट करते हैं।PHP का session.referer_check मुझे किस प्रकार से सुरक्षित करता है?

यह मेरी देव मशीन (डीबग = 2) में ठीक काम करता है, लेकिन उत्पादन में, जब ग्राहक को रीडायरेक्ट किया जाता है, तो उसे अपने "लॉग इन एरिया" में वापस उतरने के बजाय लॉगिन प्रॉम्प्ट मिलता है। मुझे खोदने के बाद मुझे यह पता चला क्योंकि केकपीएचपी session.referer_check सेट करता है, जो HTTP_REFERER मेरे से दूसरे होस्ट से आता है, जो सत्रों को अमान्य करता है।

अब, सामान्य रूप से, मैं इसे दूसरे विचार के बिना अक्षम कर दूंगा, लेकिन इस प्रणाली में मैं सामान्य से सुरक्षा के बारे में थोड़ा अधिक चिंतित हूं।

मेरा प्रश्न वास्तव में session.referer_check से मुझे सुरक्षित रखने के लिए क्या है?
अगर मैं इसे बंद करता हूं तो मेरी साइट पर किस प्रकार का हमला/शोषण/बुरी चीज की जा सकती है?

मुझे लगता है कि यह कुछ कारण होना चाहिए कि यह क्यों मौजूद है, लेकिन मैं कल्पना नहीं कर सकता कि यह मुझसे क्या बचाएगा।

क्या आप मुझे कोई विचार दे सकते हैं?
क्या यह सुरक्षित अक्षम है?

आप
डैनियल

+0

क्या आप 100% यह रेफरर की जांच कर रहे हैं और सीएसआरएफ के खिलाफ सुरक्षा के लिए पिछले अनुरोध में फॉर्म के साथ भेजे गए टोकन नहीं हैं? – Pablo

+0

100% सुनिश्चित करें। केकेपीएचपी रेफरर की जांच नहीं कर रहा है, यह सिर्फ एक रेफरर_चेक (एक PHP फीचर जो रेफरर को स्वयं जांचता है: http://www.php.net/manual/en/session.configuration.php#ini.session.referer-check) - इसके अलावा, परिणाम जो मैं देख रहा हूं वह लोगों को लॉग आउट कर रहा है। केकपीएचपी क्या करता है जब इसे सीएसआरएफ टोकन पसंद नहीं होता है (या जब इसे प्राप्त नहीं होता है) "ब्लैकहोलिंग" होता है (मूल पृष्ठ, मूल रूप से) –

+0

इसी प्रकार: http://stackoverflow.com/questions/22079477/cakephp -सतन-खो गया-बाद-एक-ओथ-रीडायरेक्ट – trante

उत्तर

22

यह Session Fixation और सीएसआरएफ/एक्सएसआरएफ के लिए सीमित सुरक्षा प्रदान करना है। रेफरर की जांच a valid method of stopping xsrf है। सत्र निर्धारण को रोकने का एक बेहतर तरीका Session.use_only_cookies है, क्योंकि हैकर किसी ऐसे डोमेन के लिए पीड़ित ब्राउज़र पर कुकी सेट नहीं कर सकता है, जिसे वह पहले से नियंत्रित नहीं करता है।

हालांकि, Session.referer_checkबायपास करने के लिए आसान है। यह सिर्फ रेफरर डोमेन में एक सबस्ट्रिंग की तलाश में है। यदि सबस्ट्रिंग सभी एक साथ गायब है, तो होता है यदि मूल यूआरएल https: // है तो सत्र आईडी अमान्य हो जाएगी। हालांकि, इसके लिए एक सबस्ट्रिंग और पूर्ण स्ट्रिंग नहीं है, तो आप www.somedomain.com.some_hacker.com से प्रतिक्रिया करके www.somedomain.com के लिए इसे बाईपास कर सकते हैं। तो संक्षेप में, मुझे लगता है कि यह पूरी तरह से बेकार है।

$pattern = "/^http:\/\/www\.myurl\.com(\/.*)*$/"; 

if(!empty($_SERVER['HTTP_REFERER']) && !preg_match($pattern, $_SERVER['HTTP_REFERER'])) { 
    session_destroy(); 
} 

यह कष्टप्रद है कि referer_check में बनाया PHPs यूआरएल की एक सरणी स्वीकार नहीं करेगा, लेकिन आप हमेशा अपनी खुद की एक बनाने के कर सकते हैं:

+0

आपके उत्तर के लिए बहुत बहुत धन्यवाद! यह इसे साफ़ करता है! –

3

इस तरह Cross-site request forgery के खिलाफ की रक्षा में मदद कर सकते में संदर्भित जाँच हो रही है धन्यवाद।

आदर्श रूप से आप रेफरर चेक मैच को अपने स्वयं के डोमेन या भुगतान प्लेटफ़ॉर्म के डोमेन से मिलान करने का कोई तरीका चाहते हैं, लेकिन जैसा कि यह पैटर्न पैटर्न की बजाय एक साधारण सबस्ट्रिंग चेक है, मुझे नहीं लगता कि यह होगा मुमकिन।

आप इस अक्षम यदि आप इस तरह के हमलों के खिलाफ की रक्षा करने के लिए जगह में अन्य उपायों रखना चाहिए।

+0

रेफरर चेक को धोखा दिया जा सकता है। नॉनिस या एक बार टोकन सीएसआरएफ के खिलाफ सुरक्षा के लिए मानक हैं। – gravelpot

+0

मैंने उतना ही माना। अब, मेरी साइट में, आप जीईटी का उपयोग करके ** कुछ भी ** नहीं बदल सकते हैं, केवल पोस्ट है, साइट ब्राउज़र को बंद करने के बाद आपको याद नहीं रखेगी, और केकेपीएचपी एक्सएसआरएफ फॉर्म POST से बचने के लिए पहले से ही "जादू टोकन" पीढ़ी करता है । यह सब ध्यान में रखते हुए, क्या मैं इसे सुरक्षित रूप से अक्षम कर सकता हूं? –

+0

@gravelpot: हेडर को हमलावर द्वारा धोखा दिया जा सकता है, लेकिन सीएसआरएफ के बारे में यह नहीं है, यह उपयोगकर्ता के ब्राउज़र को अन्य (दुर्भावनापूर्ण) साइट से आपके (अच्छे) साइट पर अनुरोध करने के बारे में है। उस स्थिति में, आप एक रेफरर को धोखा नहीं दे सकते हैं। (और मैं टोकन का उपयोग कर रहा हूं, और मेरी साइट पर सब कुछ एक लॉगिन दीवार के पीछे है जो आपको याद नहीं करता है) –

4
ध्यान रखें कि मूल रूप से सभी referer_check कर रहा है में

भालू की तरह कुछ है वैसा करता है।

// ADD THIS TO /app/config/config.php 
$config['CustomSecurity'] = array(
    'accept_referers' => array(
     'http://www.my_site.com', 
     'https://www.other_allowed_referer.com', 
    ) 
); 

// ADD THIS TO /app/app_controller.php 

private function referer_check(){ 
    if(!empty($_SERVER['HTTP_REFERER'])) { 
     $accept_referers = Configure::read('CustomSecurity.accept_referers'); 
     $referer_accepted = false; 
     foreach($accept_referers as $referer) { 
     $pattern = '/^'.preg_replace('/(\.|\/)/','\\\$1',$referer).'(\/.*)*$/'; 
     if(preg_match($pattern, $_SERVER['HTTP_REFERER'])) 
      $referer_accepted = true; 
     } 
     if(!$referer_accepted) { 
     $this->Session->destroy(); 
     exit; 
     } 
    }   
} 

और अपने app_controller::before_filter फंक्शन, कॉल में:

तो CakePHP के लिए, आप की तरह निम्नलिखित कुछ कर सकते हैं

$this->referer_check(); 

... या कुछ है कि जैसे भी हो ... खेद कोड स्वरूपण के बारे में, textarea एक टार्ड था :)

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