2012-09-22 15 views
7

एक कंपनी जो मैं काम करने के लिए काम कर रहा हूं, ने मुझे अपनी वेबसाइटों में से एक ले लिया और इसे किसी अन्य वेबसाइट का सबडोमेन बना दिया। फिर, उन्होंने मुझे अपने प्राथमिक डोमेन से अपने उप डोमेन में "लॉग इन/लॉग आउट" सत्र नियंत्रण बढ़ाने के लिए कहा।साइट सुरक्षा regex हैंडलर? (PHP)

ऐसा करने के बाद, मुझे लगता है कि नियंत्रण/प्रशासन के मुद्दे हैं। व्यक्तिगत पृष्ठों की उनकी बड़ी संख्या के कारण, और उनकी व्यापक निर्देशिका संरचना के कारण, उनके लिए लॉग इन-इन-स्टेटस के आधार पर रीडायरेक्ट करने के लिए उनके प्रत्येक पृष्ठ पर एक PHP स्निपेट जोड़ने के लिए भी शामिल है।

यहां मेरा समाधान है .. कृपया मुझे किसी भी समस्या या किसी और चीज के बारे में बताएं जो मुझे मदद करेगा।

  1. मैं mod_rewrite का उपयोग करने के लिए एक विशेष पेज (handler.php? REQUESTED_URL =) को subdomin पर हर अनुरोध को रीडायरेक्ट करने जा रहा हूँ।
  2. मैं अपनी वेबसाइट पर "साइट अनुमति/प्रतिबंधित नियम" अनुभाग बनाने जा रहा हूं। इस अनुभाग में इस तरह के नियमों के साथ एक पाठ बॉक्स में शामिल होंगे:

    +/weather/   ---> will allow anyone access to any url that contains "/weather/" somewhere within it, irregardless of logged-in status. 
    
    -/weather/premium/ ---> will only allow access to a url that contains /weather/premium to logged-in users. 
    

    एक सरणी एक फ़ाइल rules.php जो इस तरह दिखेगा में संग्रहीत करने के लिए हो जाएगा ताकि उत्पादन:

    $ruleList = array(); 
    $ruleList[] = '+/weather/'; 
    $ruleList[] = '-/weather/premium/'; 
    
  3. हैंडलर में .php, यदि उपयोगकर्ता लॉग इन है, तो मैं उन्हें request.url पर अग्रेषित कर दूंगा। यदि उपयोगकर्ता लॉग इन नहीं है, तो मैं यह मानकर शुरू करूंगा कि प्रत्येक पृष्ठ उपयोगकर्ताओं में गैर-लॉग इन तक ही सीमित है। हैंडलर.पीपीअनुरोध_यूआर को पार्स करेगा और rules.php के खिलाफ इसे जांचने के लिए, यह देखने के लिए कि कोई स्पष्ट अनुमति सेट है या नहीं। फिर यदि नियम गैर-लॉग-इन पहुंच की अनुमति देता है, तो यह उपयोगकर्ता को request_url पर अग्रेषित करेगा, अन्यथा यह उन्हें लॉगिन पृष्ठ पर भेज देगा।

एक समस्या यह है मैं तुरंत देख सकते हैं, कि दिया जाता है कि Mod_rewrite नियम handler.php के लिए हर अनुरोध भेज देंगे, मैं कैसे एक अनंत लूप से बचने हो?

क्या header("Location: ") के अलावा कुछ विधि द्वारा पुनर्निर्देशन किया जाना चाहिए?

संपादित करें:

शीर्ष डोमेन के .htaccess फ़ाइल के अंदर (example.com) मैं कहा::

#Prevent catching requests for the sub1 subdomain 
    RewriteCond %{REQUEST_URI} ^sub1\.example\.com 
    RewriteRule .* – [L] 

तो यहाँ मेरी संघर्ष के लिए एक अद्यतन है के अंदर .htaccesssub1.example.com सबडोमेन के लिए, मैंने निम्नलिखित जोड़ा:

IndexIgnore * 

    RewriteEngine On 
    RewriteBase /path/to/base 

    #Avoid infinite loop on outgoing requests 
    RewriteCond %{HTTP_REFERER} !^$ 
    RewriteCond %{REQUEST_URI} !^$ 
    RewriteCond %{HTTP_REFERER} !^/?handler.php?$ 
    RewriteCond %{REQUEST_URI} !^/?handler.php?$ 



     #Check for cookie. Redirect to handler if not found. (not yet implemented)        
     #RewriteCond %{HTTP_COOKIE} !session_id 
    RewriteRule (.*)$ handler.php?requested_url=$1 [NC,L,QSA] 

यहाँ हैंडलर है।php

<?php 

     $url = $_REQUEST['requested_url']; 

     //Check list of permissions. For now just assume permitted. 
     $permitted = true; 
     if ($url == "") $url = "http://sub1.example.com"; 
     if ($permitted) 
      header("Location: ".$url); 
     header("Location: http://sub1.example.com");   

    ?> 

मैं इतने करीब मैं इसे का स्वाद ले सकते हैं। दुर्भाग्य से समय के लिए मुझे लगभग हर जगह "रीडायरेक्ट लूप" मिल रहा है। अगर कोई मुझे सही दिशा में एक झुकाव दे सकता है, तो मैं इसकी सराहना करता हूं!

+0

यह भी जांचें http://www.ibm.com/developerworks/opensource/library/os-php-secure-apps/index.html –

+1

"प्रत्येक पृष्ठ पर एक स्निपेट जोड़ने के लिए" के रूप में, क्या आपने किया [auto_prepend_file] पर विचार करें (http://php.net/manual/en/ini.core.php#ini.auto-prepend-file)? – Leigh

+0

ठीक है, जहां तक ​​मैं आपके सेटअप को समझता हूं, आपको लॉगिन पृष्ठ केवल प्रतिबंधित रीडायरेक्ट लूप प्राप्त करना चाहिए यदि लॉगिन पृष्ठ को प्रतिबंधित पहुंच के रूप में वर्गीकृत किया गया है, है ना? तो शायद आपका नियम और यूआरएल पार्सिंग हिस्सा कुछ अप्रत्याशित करता है? –

उत्तर

2

मुझे लगता है कि आपके विचार में एक लूप है, इसलिए एप्लिकेशन में लूप। इस तरह:

  1. उपयोगकर्ता-एजेंट उप डोमेन में विरासत संसाधन का अनुरोध करता है।

  2. चूंकि UA के पास वैध प्रमाण-पत्र होना चाहिए और विरासत संसाधन प्रमाण-पत्र सत्यापित नहीं कर सकता है, UA को हैंडलर पर रीडायरेक्ट किया गया है।

  3. हैंडलर प्रमाण-पत्र सत्यापित करता है, और यूए को वापस विरासत संसाधन पर रीडायरेक्ट करता है।

  4. जाओ 2.

लिए समस्या यह है कि अनुरोध किया गया संसाधन चरण 1 और 3 में यूए के अनुरोध के बीच एक अंतर नहीं कर सकते, क्योंकि भेद यूए की साख जो विरासत द्वारा परिभाषित किया गया है संसाधन का मूल्यांकन नहीं करता है।

यह विरोधाभास एक और दृष्टिकोण से भी स्पष्ट है। एक मिनट के लिए कल्पना करें कि आप लूप को हल करते हैं और UA को विरासत संसाधन पर रीडायरेक्ट किया जाता है - http://sub1.example.com/foo.php जैसे कुछ। सर्वर को संसाधन वापस करने के लिए, इसका मतलब यह होगा कि प्रमाण-पत्रों का मूल्यांकन नहीं किया गया था (क्योंकि यह ऐसा नहीं करता है), और इसलिए संसाधन प्रभावी रूप से सार्वजनिक है।

इस के आसपास पाने के लिए आपको या तो कदम 2 या 3 के नियमों को बदलने के द्वारा गतिरोध को तोड़ने के लिए है:

  • , चरण 2 को बदलने के लिए विरासत संसाधन के लिए प्रतिक्रिया करने के लिए क्रेडेंशियल मूल्यांकन जोड़ें। पिछले उत्तर में auto_prepend_file() का सुझाव दिया गया है, लेकिन केवल PHP विरासत फाइलों के लिए - छवियों, एचटीएमएल, आदि भाग्य से बाहर हैं। चरण 0 को बदलने के लिए

  • , यूए संसाधन को सीधे अनुरोध किए बिना विरासत संसाधन प्रदान करने का एक तरीका खोजें। एक संभावना यह है कि हैंडलर को फाइल सिस्टम से संसाधन प्राप्त करना है और इसे readfile() और कुछ HTTP शीर्षलेख प्रबंधन के साथ तार पर रखना है।

शायद इन दोनों को मिलाकर आप के लिए चाल करना होगा: auto_prepend_file() प्रमाणीकरण विरासत पीएचपी करने के लिए से निपटने के लागू करने के लिए, और गैर पीएचपी सामग्री के लिए readfile()

2

क्या कोई कारण है कि आप apache auth का उपयोग नहीं करना चाहते हैं? मुझे लगता है कि यह बहुत कम जटिल होगा। http://httpd.apache.org/docs/2.2/howto/auth.html

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

+0

अनुभव की कमी शायद कारण है ;-) मैं इसे देख लूँगा, धन्यवाद –

+0

इसे देखने के बाद, समस्या यह है कि इन निर्देशिका अभिगम नियमों को व्यवस्थापक पैनल के माध्यम से इनपुट के आधार पर गतिशील रूप से बदलने की आवश्यकता है। –

+0

हाय माइक; वे कितनी बार बदलते हैं? आवश्यकता होने पर आप अपने अपाचे कॉन्फ़िगरेशन को गतिशील रूप से पुन: उत्पन्न कर सकते हैं (और अपाचे को पुनरारंभ करें)। –

3

बस एक विचार है लेकिन शायद आपको mod_rewrite के साथ संघर्ष करने की आवश्यकता नहीं है। यदि आप PHP से सबकुछ संभालना चाहते हैं तो फिर भी अपने VHOST में प्रीपेड फ़ाइल क्यों न जोड़ें?

php_value auto_prepend_file handler.php 

इसे किसी भी PHP स्क्रिप्ट से पहले शामिल किया जाएगा और यदि आवश्यक हो तो आप रीडायरेक्ट कर सकते हैं।

+0

मुझे लगता है कि यह समाधान बहुत समझ में आता है। आपके प्रश्न ने वास्तव में एक जटिल समाधान का प्रस्ताव दिया और यह बहुत आसान है। – MikeMurko

1

आपको बस एक साधारण सत्यापन फ़ंक्शन की आवश्यकता है। किसी उपयोगकर्ता को या तो संसाधन तक पहुंचने की अनुमति है या नहीं। तो सभी सेटअप के पहले संदर्भ:

कि हमने कहा मान्यता समारोह जो डिफ़ॉल्ट रूप से false लौट सकते हैं और पैरामीटर के रूप में संदर्भ लेता है चाहिए के लिए
$rules   = rules_load(); 
$uri   = $_SERVER['QUERY_STRING']; 
$userIsLoggedIn = user_is_logged_in(); 

अगला:

$validation = function (array $rules, $uri, $userIsLoggedIn) { 
    $permitted = false;  
    return $permitted; 
}; 

तर्क तो सीधे आगे है :

if ($validation($rules, $uri, $userIsLoggedIn)) { 
    # can pass 
    echo "can pass"; 
} else { 
    # login first 
    echo "login first"; 
} 

कौन सा स्वाभाविक रूप से पहले से ही आप "लॉगिन पहले" देता है। ठीक। हम जल्द ही उस समारोह के पैरामीटर बदल देंगे। चलिए देखते हैं कि कैसे $rules और $uri एक-दूसरे के साथ खड़े हैं।

प्रत्येक नियम यूआरआई पर कम से कम पथ कर सकते हैं। के शासन विभाजित करते हैं:

<sign><path> 

sign := [+-] 
path := <segment>*/ 
segment := /[a-z]+ 

एक नियम करता है या $uri मेल नहीं खाता। यदि यह मेल खाता है, तो साइन यह तय करता है कि इसका क्या अर्थ है।

तो वास्तव में साइन द्वारा निर्दिष्ट दो समूह हैं और यह कहा जा सकता है कि $uri मिलान या नहीं। यह फिर से एक साधारण कार्य है, पहले नियमों की सरणी संकेत द्वारा फ़िल्टर की जाती है और फिर पथ द्वारा फ़िल्टर की जाती है।

function ($sign) use ($rules, $uri) { 
    return array_reduce($rules, function ($a, $v) use ($rules, $sign, $uri) { 
     $v[0] === $sign && false !== strpos($uri, substr($v, 1)) && $a[] = $v; 
     return $a; 
    }, array()); 
}; 

यह कम या ज्यादा array_reduce के लिए एक कॉल है:

तीन इनपुट पैरामीटर है कि एक सरणी कि uri के साथ मेल है के रूप में सभी नियमों का सबसेट रिटर्न के साथ एक समारोह पर विचार करें। तो आइए मान लें कि यह $match नामक चर से जुड़ा होगा जो $rules और $uri को $validation फ़ंक्शन के पैरामीटर के रूप में प्रतिस्थापित कर सकता है।

$validation = function ($match, $userIsLoggedIn) { 

तो भाग पर छोड़ दिया अभी मान्यता की स्थिति तैयार करने के लिए है:

$permitted = $userIsLoggedIn; 

डिफ़ॉल्ट रूप से, यदि उपयोगकर्ता के प्रवेश की अनुमति दी जाती है। केवल अगर उपयोगकर्ता लॉग इन नहीं है, तो हम अनुमति दे सकते हैं यदि समूह मेल नहीं खाता है और + समूह का मिलान किया गया है। - समूह पहले आओ और सुरक्षा की दृष्टि से किसी भी + नियम को ओवरराइड करना चाहिए: इस समारोह बल्कि मामूली बात है के रूप में, हम इसे फेंकना सकता

return $permitted; 
}; 

:

$permitted = $userIsLoggedIn ?: !$match('-') && $match('+'); 

बाकी है कि स्थिति लौटाने के लिए है। कोड अब पूर्ण में है:

$rules   = rules_load(); 
$uri   = $_SERVER['QUERY_STRING']; 
$userIsLoggedIn = user_is_logged_in(); 

$match = rules_match($rules, $uri); 

$permitted = $userIsLoggedIn ?: !$match('-') && $match('+'); 

if ($permitted) { 
    # can pass 
    echo "can pass"; 
} else { 
    # login first 
    echo "login first"; 
} 

/** 
*/ 
function rules_match(array $rules, $uri) { 
    return function ($sign) use ($rules, $uri) { 
     return array_reduce($rules, function ($a, $v) use ($rules, $sign, $uri) { 
      $v[0] === $sign && false !== strpos($uri, substr($v, 1)) && $a[] = $v; 
      return $a; 
     }, array()); 
    }; 
} 
+0

और यह जवाब क्या है ?! माइक रीडायरेक्ट लूप के बारे में जानना चाहता है और आप इसके नियम की जांच फिर से लिखना चाहते हैं ??? – BigBoss

+0

@ बिग बॉस: पूरी तरह से प्रश्न पढ़ें। जब वे अपने सत्र की जांच करते हैं तो ये समस्याएं असहनीय होती हैं। जब तक वह इसे नहीं डालता, तब तक वह हमेशा लूप समस्या रखता है। चूंकि कार्यान्वयन छिपा हुआ है, जवाब देने के लिए बहुत कुछ नहीं है। माइक ने लिखा कि वह इसे लागू करेगा। – hakre

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