2015-12-26 5 views
5

कोई उपयोगकर्ता script.php?userid=222 जैसे URL के माध्यम से फ़ाइल द्वारा अनुरोध करेगा। यह उदाहरण फ़ाइल # 222 का रिकॉर्ड दिखाएगा।एक मिनट के भीतर किए गए उपयोगकर्ता अनुरोधों की संख्या को सीमित करने के लिए

अब मैं प्रति मिनट (दूरस्थ आईपी) उपयोगकर्ता को एक मिनट में अधिकतम 5 अलग-अलग रिकॉर्ड तक सीमित करना चाहता हूं। हालांकि, उपयोगकर्ता को किसी भी समय एक ही आईडी रिकॉर्ड तक पहुंचने में सक्षम होना चाहिए।

तो उपयोगकर्ता किसी भी समय फ़ाइल # 222 तक पहुंच सकता है, लेकिन यदि (रिमोट आईपी) उपयोगकर्ता एक मिनट में 5 से अधिक अलग-अलग रिकॉर्ड एक्सेस करता है, तो उसे एक त्रुटि दिखानी चाहिए।

उदाहरण के लिए, एक मिनट के भीतर लगता है निम्न अनुरोध किया जाता है:

script.php?userid=222 
script.php?userid=523 
script.php?userid=665 
script.php?userid=852 
script.php?userid=132 
script.php?userid=002 

तो पिछले अनुरोध पर यह त्रुटि संदेश दिखाना चाहिए।

$id = $_GET['userid']; 
if (!isset($_GET['userid']) || empty($_GET['userid'])) { 
    echo "Please enter the userid"; 
    die(); 
} 

if (file_exists($userid.".txt") && 
     (filemtime($userid.".txt") > (time() - 3600 * $ttime))) { 
    $ffile = file_get_contents($userid.".txt");} else { 
    $dcurl = curl_init(); 
    $ffile = fopen($userid.".txt", "w+"); 
    curl_setopt($dcurl, CURLOPT_URL,"http://remoteserver.com/data/$userid"); 
    curl_setopt($dcurl, CURLOPT_RETURNTRANSFER, TRUE); 
    curl_setopt($dcurl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); 
    curl_setopt($dcurl, CURLOPT_TIMEOUT, 50); 
    curl_setopt($dcurl, CURLOPT_FILE, $ffile); 
    $ffile = curl_exec($dcurl); 
    if(curl_errno($dcurl)) // check for execution errors 
    { 
     echo 'Script error: ' . curl_error($dcurl); 
     exit; 
    } 
    curl_close($dcurl); 
    $ffile = file_get_contents($userid.".txt"); 
} 
+0

सबसे विश्वसनीय तरीका आईपी पते कहीं (एक फ़ाइल या जैसे को बचाने के लिए होगा डेटाबेस) फ़ाइल आईडी के उपयोग और डेटाटाइम फ़ील्ड के साथ। लेकिन यदि आपके पास बहुत सारे उपयोगकर्ता हैं तो यह कुछ सर्वर यातायात और एक MySQL सर्वर पर भारी भार उत्पन्न करेगा। एक टाइमआउट के साथ एक कुकी या सत्र बहुत कम संसाधन लेगा। लेकिन वे भी बाधित करने के लिए काफी आसान हैं। (सत्र को नष्ट करने के लिए कुकीज़ या बंद ब्राउज़र हटाएं)। मुझे लगता है कि आपको पहले विश्वसनीयता और स्केलेबिलिटी के बीच चयन करना होगा। – icecub

+0

मैं कह रहा हूं * सबसे विश्वसनीय * यहां क्योंकि इन दिनों आप वास्तव में एक आईपी पते पर भरोसा नहीं कर सकते हैं। * टोर * जैसे ब्राउज़र आपको बस एक बटन दबाकर 5 सेकंड के भीतर एक नया आईपी पता दे सकते हैं। तो मैं खुद से पूछता हूं कि क्या यह वास्तव में पहली बार परेशानी का लायक है? – icecub

उत्तर

7

इसके बजाय आईपी पते पर भरोसा करने की है, तो आप सत्र का उपयोग कर सकते:

यहाँ बुनियादी कोड है। आप session_start() के माध्यम से एक सत्र स्कोप बना सकते हैं, और उसके बाद उसी उपयोगकर्ता सत्र के साथ चिपकने वाली जानकारी संग्रहीत कर सकते हैं।

मैं इस सत्र में रखने के लिए सुझाव देता हूं कि अनुरोध के समय के साथ उपयोगकर्ता द्वारा किए गए पिछले अनुरोधों में उपयोग की जाने वाली अद्वितीय आईडी की सूची, किसी भी बार-बार अनुरोधों को अनदेखा कर दिया जाए, जिन्हें हमेशा अनुमति दी जाती है। जैसे ही इस सूची में अंतिम मिनट के भीतर एक समय टिकट के साथ 5 तत्व होते हैं और एक नई आईडी का अनुरोध किया जाता है, आप त्रुटि दिखाते हैं और लुकअप को मना कर देते हैं।

यह कोड है जो यह करता है। आप यह जगह चाहिए सही होने के बाद आप userid तर्क की उपस्थिति जाँच कर ली है, और फ़ाइल सामग्री की बहाली से पहले:

// set the variables that define the limits: 
$min_time = 60; // seconds 
$max_requests = 5; 

// Make sure we have a session scope 
session_start(); 

// Create our requests array in session scope if it does not yet exist 
if (!isset($_SESSION['requests'])) { 
    $_SESSION['requests'] = array(); 
} 

// Create a shortcut variable for this array (just for shorter & faster code) 
$requests = &$_SESSION['requests']; 

$countRecent = 0; 
$repeat = false; 
foreach($requests as $request) { 
    // See if the current request was made before 
    if ($request["userid"] == $id) { 
     $repeat = true; 
    } 
    // Count (only) new requests made in last minute 
    if ($request["time"] >= time() - $min_time) { 
     $countRecent++; 
    } 
} 

// Only if this is a new request... 
if (!$repeat) { 
    // Check if limit is crossed. 
    // NB: Refused requests are not added to the log. 
    if ($countRecent >= $max_requests) { 
     die("Too many new ID requests in a short time"); 
    } 
    // Add current request to the log. 
    $countRecent++; 
    $requests[] = array("time" => time(), "userid" => $id); 
} 

// Debugging code, can be removed later: 
echo count($requests) . " unique ID requests, of which $countRecent in last minute.<br>"; 

// if execution gets here, then proceed with file content lookup as you have it. 
+0

बहुत बहुत धन्यवाद, यह एक आकर्षण की तरह काम करता है, कमाल! आप मास्टर हैं, आप मेरी समस्या हल करते हैं! अग्रिम में नया साल मुबारक हो और मेरी क्रिसमस। – smallbee

+0

आपका स्वागत है। नया साल मुबारक हो! – trincot

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

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