2010-06-03 21 views
7

मैंने एक ऐसा फ़ंक्शन लागू किया है जो प्रत्येक पृष्ठ पर चलता है जिसे मैं गैर-लॉग इन उपयोगकर्ताओं से प्रतिबंधित करना चाहता हूं। फ़ंक्शन स्वचालित रूप से विज़िटर को लॉग इन पेज पर रीडायरेक्ट करता है क्योंकि वह लॉग इन नहीं होता है।PHP: जांचें कि यूआरएल रीडायरेक्ट करता है या नहीं?

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

यह कैसे किया जा सकता है?

धन्यवाद।

+0

रीडायरेक्ट कैसे? क्या ग्राहक से बुलाया? लॉग इन होने पर या लॉग इन नहीं होने पर? किस लिए? क्या स्क्रिप्ट को सत्र कुकीज़ और अन्य जटिल चीजों को संभालना होगा? –

+0

कृपया "पुनर्निर्देशित यूआरएल" को परिभाषित करें। –

+0

देखें [मैं कैसे निर्धारित कर सकता हूं कि एक यूआरएल PHP में रीडायरेक्ट करता है?] (Http://stackoverflow.com/questions/427203/how-can-i-determine-if-a-url-redirects-in-php/481377# 481377) –

उत्तर

21
$urls = array(
    'http://www.apple.com/imac', 
    'http://www.google.com/' 
); 

$ch = curl_init(); 

curl_setopt($ch, CURLOPT_HEADER, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 

foreach($urls as $url) { 
    curl_setopt($ch, CURLOPT_URL, $url); 
    $out = curl_exec($ch); 

    // line endings is the wonkiest piece of this whole thing 
    $out = str_replace("\r", "", $out); 

    // only look at the headers 
    $headers_end = strpos($out, "\n\n"); 
    if($headers_end !== false) { 
     $out = substr($out, 0, $headers_end); 
    } 

    $headers = explode("\n", $out); 
    foreach($headers as $header) { 
     if(substr($header, 0, 10) == "Location: ") { 
      $target = substr($header, 10); 

      echo "[$url] redirects to [$target]<br>"; 
      continue 2; 
     } 
    } 

    echo "[$url] does not redirect<br>"; 
} 
+0

सुपर मिठाई समाधान! टैक एडम :) – Industrial

+2

आप स्थिति कोड (301 या 302) – baloo

+2

पढ़ने के लिए curl_getinfo ($ ch, CURLINFO_HTTP_CODE) का भी उपयोग कर सकते हैं यदि आप 'curl_setopt ($ हैंडल, CURLOPT_NOBODY, true) का उपयोग करते हैं तो आप कुछ बैंडविड्थ और प्रोसेसिंग पावर भी सहेज सकते हैं; '। यह केवल एक HTTP हेड अनुरोध भेजेगा। इस तरह आपको शरीर को काटना नहीं होगा। यह आलेख भी देखें: http://schlitt.info/opensource/blog/0606_sending_head_requests_with_extcurl.html – chiborg

-2

मैं आपके प्रश्न को समझ नहीं सकता। आपके पास URL के साथ एक सरणी है और आप जानना चाहते हैं कि उपयोगकर्ता सूचीबद्ध यूआरएल में से एक है या नहीं? अगर मैं सही अपने प्रयास को समझने में कर रहा हूँ:

$urls = array('http://url1.com','http://url2.ru','http://url3.org'); 
if(in_array($_SERVER['HTTP_REFERER'],$urls)) 
{ 
echo 'FROM ARRAY'; 
} else { 
echo 'NOT FROM ARR'; 
} 
+0

रेफरर कमजोर –

+0

प्रश्न अपडेट किया गया। मैं अपने सरणी में प्रत्येक यूआरएल को यह देखने के लिए कॉल करना चाहता हूं कि वे सेट यूआरएल पर रहें या लॉगिन पेज पर रीडायरेक्ट करें। – Industrial

0

आप सत्र का उपयोग कर सकते हैं, अगर सत्र सरणी सेट नहीं है, यूआरएल एक लॉगिन पृष्ठ पर पुनः निर्देशित। ।

+0

इस प्रकार मेरी सुरक्षा मूल रूप से आधारित है, लेकिन मुझे यह देखने में सक्षम नहीं होगा कि सरणी से कोई पृष्ठ रीडायरेक्ट करता है या नहीं। – Industrial

1

मुझे यकीन नहीं है कि यह वास्तव में सुरक्षा जांच के रूप में समझ में आता है या नहीं।

यदि आप फ़ाइलों के बारे में चिंतित हैं, तो "क्या उपयोगकर्ता लॉग इन है?" जांच चल रही है, आप कई बड़ी PHP परियोजनाओं को कर सकते हैं: केंद्रीय में फ़ाइल (जहां सुरक्षा जांच की जा रही है) को निरंतर BOOTSTRAP_LOADED या जो भी हो, परिभाषित करें, और प्रत्येक फ़ाइल में, जांचें कि वह स्थिर सेट है या नहीं।

परीक्षण बहुत अच्छा है और सुरक्षा परीक्षण भी बेहतर है, लेकिन मुझे यकीन नहीं है कि आप किस प्रकार की खामियों को उजागर कर रहे हैं? मेरे लिए, यह विचार समय की बर्बादी की तरह लगता है जो कोई वास्तविक अतिरिक्त सुरक्षा नहीं लाएगा।

header("Location:...") रीडायरेक्ट के बाद बस अपनी स्क्रिप्ट die() एस सुनिश्चित करें। हेडर कमांड के बाद प्रदर्शित होने से अतिरिक्त सामग्री को रोकने के लिए यह आवश्यक है (एक लापता मर() आपके विचार से पकड़ा नहीं जाएगा, क्योंकि रीडायरेक्ट हेडर अभी भी जारी किया जाएगा ...)

यदि आप वास्तव में ऐसा करना चाहते हैं, आप wget जैसे टूल का उपयोग भी कर सकते हैं और इसे यूआरएल की एक सूची खिला सकते हैं। क्या यह परिणाम निर्देशिका में लाता है, और जांचें (उदा। फ़ाइल आकारों को देखकर जो समान होना चाहिए) चाहे प्रत्येक पृष्ठ में लॉगिन संवाद हो। बस एक और विकल्प जोड़ने के लिए ...

1

क्या आप यह देखने के लिए HTTP कोड देखना चाहते हैं कि यह रीडायरेक्ट है या नहीं?

$params = array('http' => array(
     'method' => 'HEAD', 
     'ignore_errors' => true 
    )); 

    $context = stream_context_create($params); 
    foreach(array('http://google.com', 'http://stackoverflow.com') as $url) { 
     $fp = fopen($url, 'rb', false, $context); 
     $result = stream_get_contents($fp); 

     if ($result === false) { 
      throw new Exception("Could not read data from {$url}"); 
     } else if (! strstr($http_response_header[0], '301')) { 
      // Do something here 
     } 
    } 
0

मैंने एडम बैकस्ट्रॉम के जवाब को संशोधित किया और चिबोर्ग सुझाव लागू किया। (केवल HEAD डाउनलोड करें)। इसमें एक और चीज है: यह जांच करेगा कि क्या एक ही सर्वर के एक पृष्ठ में पुनर्निर्देशन है या बाहर है। उदाहरण: terra.com.br terra.com.br/portal पर रीडायरेक्ट करता है। PHP इसे रीडायरेक्ट की तरह विचार करेगा, और यह सही है। लेकिन मैं केवल उस यूआरएल को सूचीबद्ध करना चाहता था जो किसी अन्य यूआरएल पर रीडायरेक्ट करता है। मेरी अंग्रेजी अच्छी नहीं है, इसलिए, अगर किसी को समझने में कुछ मुश्किल लगता है और इसे संपादित कर सकता है, तो आपका स्वागत है।

function RedirectURL() { 
    $urls = array('http://www.terra.com.br/','http://www.areiaebrita.com.br/'); 

    foreach ($urls as $url) { 
     $ch = curl_init(); 

     curl_setopt($ch, CURLOPT_HEADER, true); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
     // chiborg suggestion 
     curl_setopt($ch, CURLOPT_NOBODY, true); 

     // ================================ 
     // READ URL 
     // ================================ 

     curl_setopt($ch, CURLOPT_URL, $url); 
     $out = curl_exec($ch); 

     // line endings is the wonkiest piece of this whole thing 
     $out = str_replace("\r", "", $out); 
     echo $out; 

     $headers = explode("\n", $out); 

     foreach($headers as $header) { 
      if(substr(strtolower($header), 0, 9) == "location:") { 
       // read URL to check if redirect to somepage on the server or another one. 
       // terra.com.br redirect to terra.com.br/portal. it is valid. 
       // but areiaebrita.com.br redirect to bwnet.com.br, and this is invalid. 
       // what we want is to check if the address continues being terra.com.br or changes. if changes, prints on page. 

       // if contains http, we will check if changes url or not. 
       // some servers, to redirect to a folder available on it, redirect only citting the folder. Example: net11.com.br redirect only to /heiden 

       // only execute if have http on location 
       if (strpos(strtolower($header), "http") !== false) { 
        $address = explode("/", $header); 

        print_r($address); 
        // $address['0'] = http 
        // $address['1'] = 
        // $address['2'] = www.terra.com.br 
        // $address['3'] = portal 

        echo "url (address from array) = " . $url . "<br>"; 
        echo "address[2] = " . $address['2'] . "<br><br>"; 

        // url: terra.com.br 
        // address['2'] = www.terra.com.br 

        // check if string terra.com.br is still available in www.terra.com.br. It indicates that server did not redirect to some page away from here. 
        if(strpos(strtolower($address['2']), strtolower($url)) !== false) { 
         echo "URL NOT REDIRECT"; 
        } else { 
         // not the same. (areiaebrita) 
         echo "SORRY, URL REDIRECT WAS FOUND: " . $url; 
        } 
       } 
      } 
     } 
    } 
} 
0
function unshorten_url($url){ 
    $ch = curl_init(); 

    curl_setopt($ch, CURLOPT_HEADER, true); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    $out = curl_exec($ch); 

    $real_url = $url;//default.. (if no redirect) 

    if (preg_match("/location: (.*)/i", $out, $redirect)) 
     $real_url = $redirect[1]; 

    if (strstr($real_url, "bit.ly"))//the redirect is another shortened url 
     $real_url = unshorten_url($real_url); 

    return $real_url; 
} 
2

तुम हमेशा जोड़ने का प्रयास कर सकते हैं:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 

302 के बाद से मतलब है कि यह ले जाया गया, कर्ल कॉल यह पालन करें और जो कुछ भी ले जाया यूआरएल रिटर्न वापस जाने के लिए अनुमति देते हैं।

+0

यह ... वास्तव में सही जवाब है। धन्यवाद! ऐसा लगता है कि इस कर्ल के बिना सामग्री पर रुक जाता है, इसे पहले प्राप्त होता है और अगर कोई होता है तो रीडायरेक्ट का पालन नहीं करता है। धन्यवाद!!! –

3

मैं कर्ल का उपयोग करें और केवल हेडर लेते हैं, के बाद मैं हैडर कर्ल से मेरी यूआरएल और यूआरएल की तुलना:

   $url="http://google.com"; 
       $ch = curl_init(); 

       curl_setopt($ch, CURLOPT_URL, $url); 
       curl_setopt($ch, CURLOPT_TIMEOUT, '60'); // in seconds 
       curl_setopt($ch, CURLOPT_HEADER, 1); 
       curl_setopt($ch, CURLOPT_NOBODY, 1); 
       curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
       curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
       $res = curl_exec($ch); 

       if(curl_getinfo($ch)['url'] == $url){ 
        $status = "not redirect"; 
       }else { 
        $status = "redirect"; 
       } 
संबंधित मुद्दे