2012-05-08 22 views
5

पर एक प्रोग्राम प्रोग्रामिंग कर रहा है जहां आप सामान पोस्ट कर सकते हैं। यह निम्न jQuery ajax के साथ काम करता है:PHP टाइमर केवल उपयोगकर्ता इनपुट को प्रत्येक दो सेकंड

$.ajax({ 
     type: 'POST', 
     url: 'action/post.php', 
     data: 'posttext='+posttext+'&imageurl='+imageurl, 
     success: function(feedback){ 
      $('#feedback').val(feedback); 
     } 
    }); 

अब मुझे आश्चर्य है: किसी को भी अपने ही ajax लिख सकता है साइट के लिए कुछ पोस्ट और बार-बार ऐसा करने के लिए। मैं इसे कैसे न होने दूँ? मुझे यकीन है कि मुझे post.php में किसी प्रकार की सुरक्षा जांच की आवश्यकता होगी - मैंने पहले ही http रेफरर के बारे में सुना है, लेकिन इसे संशोधित किया जा सकता है, इसलिए यह वास्तव में भरोसेमंद नहीं है।

इसके अलावा मैं post.php में एक टाइमर जोड़ना चाहता हूं जो सुनिश्चित करता है कि एक ही आईपी पते से एक पोस्ट केवल प्रत्येक एक्स सेकंड में पोस्ट की जा सकती है, और टाइमर रीसेट करता है यदि पोस्ट x सेकंड के नीचे भेजा जाता है (दयालु स्टैक ओवरफ्लो की तरह टिप्पणियों के साथ यह करता है)।

क्या कोई जानता है कि AJAX को कैसे सुरक्षित किया जाए और टाइमर कैसे सेट किया जाए? या पोस्टिंग तंत्र को सुरक्षित करने के लिए कोई अन्य विचार?

धन्यवाद!

डेनिस

+0

केवल जिस तरह से उपयोगकर्ता का अद्वितीय पहचानकर्ता बनाते हैं, और सर्वर साइड पर यह जांच करने के लिए है। डीबी में डेटा पर भरोसा करें, जैसे कि PHP में आपका कोड अच्छा है, कोई गड़बड़ नहीं होगी। AJAX में सब कुछ सिर्फ यूएक्स –

+0

के लिए है क्या आप आगे विस्तार कर सकते हैं? UX? – weltschmerz

+0

यूएक्स = उपयोगकर्ता अनुभव –

उत्तर

1

आपका सबसे अच्छा तरीका डेटाबेस में आपकी जानकारी को स्टोर करना होगा। वहाँ वर्तमान आईपी पता के लिए डीबी में एक प्रविष्टि है कि अगर जाँच

ipAddress, submitDate, postText, imageUrl 

प्रस्तुत करने पर,: आप किसी तालिका में 4 क्षेत्रों हो सकता था। यदि ऐसा है, तो प्रविष्टि की सबमिट तिथि की वर्तमान तिथि के साथ तुलना करें और यदि यह आपकी सीमा से अधिक है तो जमा करने की अनुमति दें। अन्यथा, एक त्रुटि संदेश जारी करें और उपयोगकर्ता को वापस रीडायरेक्ट करें।

हालांकि यह अभी भी मूर्ख नहीं है, क्योंकि आईपी पते को भी धोखा दिया जा सकता है या उपयोगकर्ता प्रॉक्सी के पीछे छिपा सकता है।

+1

यह भी ध्यान रखें कि यदि आपके उपयोगकर्ता एक विश्वविद्यालय छात्रावास से हैं और एक आईपी पते के पीछे एनएटीड हैं तो आप दो लोगों को एक ही समय में पोस्ट करने से रोक देंगे। –

+0

मैं आईपी और उपयोगकर्ता एजेंट के संयोजन का उपयोग कर सकता हूं - क्या यह काम करेगा? – weltschmerz

+0

@DMoses अच्छा बिंदु। ओपी ने विशेष रूप से आईपी पता बताया, लेकिन इसे हल करने के लिए आप या तो एक ईमेल पते का अनुरोध कर सकते हैं या एक पूर्ण उपयोगकर्ता लॉगिन कर सकते हैं। बड़े नाखूनों के लिए बड़े हथौड़ों। –

1

बस एक लॉग फ़ाइल में आईपी और अनुरोध समय स्टोर करें। फिर उस आईपी के अस्तित्व के लिए प्रत्येक अनुरोध पर लॉग फ़ाइल की जांच करें और संग्रहीत समय की तुलना करें।

यहाँ एक सरल स्क्रिप्ट है जो केवल 10 सेकंड के बाद एक ही आईपी से एक अनुरोध की अनुमति देता है है:

$waitSeconds = 10; 
if (allowRequest($waitSeconds)) { 
    // allowed 
    echo "Welcome."; 
} else { 
    // not allowed 
    echo "Please wait at least $waitSeconds after your last request."; 
} 
echo '<hr /><a href="#" onclick="location.reload(true);return false">try again</a>'; 

function getLastRequestTimeDiff($ip = null, $logFile = null) 
{ 
    if ($ip === null) { 
     // no specific ip provided, grab vom $_SERVER array 
     $ip = $_SERVER["REMOTE_ADDR"]; 
    } 
    if ($logFile === null) { 
     // no specific log file taken 
     $logFile = "./lookup.log"; 
    } 
    if (!is_file($logFile)) { 
     // touch 
     file_put_contents($logFile, serialize(array())); 
    } 
    // read content 
    $logContent = file_get_contents($logFile); 
    // unserialize, check manual 
    $lookup = unserialize($logContent); 
    // default diff (f.e. for first request) 
    $diff = 0; 
    // current timestamp 
    $now = time(); 
    if (array_key_exists($ip, $lookup)) { 
     // we know the ip, retrieve the timestamp and calculate the diff 
     $diff = $now - $lookup[$ip]; 
    } 
    // set the new request time 
    $lookup[$ip] = $now; 
    // serialize the content 
    $logContent = serialize($lookup); 
    // and write it back to our log file 
    file_put_contents($logFile, $logContent); 
    // return diff (in seconds) 
    return $diff; 
} 

// encapsulate our function in a more simple function (allow yes/no) 
function allowRequest($allowed = 10, $ip = null, $logFile = null) 
{ 
    $timeDiff = getLastRequestTimeDiff($ip, $logFile); 
    return $timeDiff >= $allowed; 
} 
+0

कमाल समारोह! धन्यवाद! – weltschmerz

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