javascript - Ajax लिंक अनुरोधों को कैसे सुरक्षित करें?




php jquery (8)

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

इस तरह के हमले में हमलावर के लिए थोड़ा इनाम की भारी लागत होती है। परीक्षण के लिए अरबों संभावित ईमेल पते हैं। यह केवल इस तरह के रूप में महान लंबाई में जाने के लायक हो सकता है, अगर प्रश्न में साइट विशेष रूप से संवेदनशील थी, जैसे कि किसी प्रकार की वयस्क साइट, जहां हमलावर उपयोगकर्ताओं को ब्लैकमेल करने की उम्मीद करता है जो वह पाता है।

CloudFlare

एक कैप्चा समाधान के रूप में अच्छा नहीं है, लेकिन ब्रूट बल के हमले का पता लगाया जा सकता है और CloudFlare के DDoS सिस्टम द्वारा रोका जा सकता है। इसके अलावा, CF आपकी साइट तक पहुंचने से पहले टोर उपयोगकर्ताओं को एक कैप्चा को हल करने के लिए मजबूर कर सकता है, जो एक हमलावर को हमले के लिए एक वाहन के रूप में टोर का उपयोग करने से रोक देगा।

आईपी ​​दर की सीमा

एक आईपी आधार पर दर सीमित करने की समस्या है क्योंकि अगर किसी हमलावर ने इस के रूप में विशाल कार्य करने का निर्णय लिया, तो वह संभवतः हमले को लॉन्च करने के लिए कई मशीनों के Botnet या किसी अन्य प्रणाली का उपयोग कर रहा होगा।

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

सत्र आईडी / सीआरएसएफ टोकन

निश्चित रूप से समाधान नहीं है क्योंकि हमलावर को केवल टोकन प्राप्त करने के लिए पहले पृष्ठ पर अनुरोध करना होगा। यह एक अतिरिक्त अनुरोध है लेकिन हमलावर के लिए केवल एक असुविधा है।

अगले परिदृश्य की कल्पना करें: एक उपयोगकर्ता वेबपेज पर पंजीकरण करना चाहता है और एक फॉर्म भरता है। जब वह फॉर्म भर रहा होता है, तो jQuery एक नियमित अभिव्यक्ति के माध्यम से जाँच करता रहता है कि क्या फ़ील्ड मान्य हैं, आदि ...

ईमेल को प्राथमिक कुंजी के रूप में लेना, जिसे उपयोगकर्ता लॉगिन करने के लिए पंजीकृत करने के बाद उपयोग करेगा, ईमेल क्षेत्र को Ajax साथ Ajax की आवश्यकता है ताकि उपयोगकर्ता को यह पता चल सके कि वह ईमेल पंजीकृत है या नहीं। मैं पूर्ण प्रपत्र भेजने और इसे खाली करने, पृष्ठ ताज़ा करने आदि से बचने के लिए इसे अजाक्स के साथ जांचना चाहता हूं।

इसलिए, जब उपयोगकर्ता ने ईमेल फ़ील्ड भरना समाप्त कर दिया है, तो Ajax अनुरोध सर्वर को भेजा जाता है, अगले लिंक जैसा कुछ:

example.com/check.php?email=[email protected].com

जब check.php ईमेल प्राप्त करता है, तो यह डेटाबेस से पूछता है कि यह मौजूद है या नहीं और एक संदेश देता है जैसे: User already exists यदि उपयोगकर्ता मौजूद है या उपयोगकर्ता मौजूद नहीं है तो null है।

सवाल यह है: अगर कोई मेरे .js के माध्यम से खोदता है और उसके समान लिंक का पता लगाता है, तो वे बड़ी संख्या में अनुरोध भेजने के लिए उस लिंक का उपयोग कर सकते हैं ताकि पता लगाया जा सके कि क्या उन यादृच्छिक ईमेल मौजूद हैं। इससे डेटाबेस का भारी उपयोग हो सकता है या खराब मामलों में भी दुर्घटनाग्रस्त हो सकता है और निजी जानकारी लीक हो सकती है।

ईमेल की जाँच करने के लिए कोई व्यक्ति लूप के लिए बहुत बड़ा काम कर सकता है जैसे:

//Getting the response of the next links
example.com/check.php?email=[email protected].com // Returns null
example.com/check.php?email=[email protected].com // Returns null
example.com/check.php?email=[email protected].com // Returns null
example.com/check.php?email=[email protected].com // Returns User already exists

-------------------------------------------------- -------------------------------------------------- --------------------------------

चूंकि मैंने आखिरी बार उत्तर स्वीकार किया था, इसलिए मैंने इसकी जांच की और इस व्यवहार से बचने का उपाय खोजा। JAVA के लिए निम्न कोड है, लेकिन तर्क को किसी अन्य सर्वर-साइड भाषा पर लागू किया जा सकता है।

सर्वर से किसी भी ऐजैक्स अनुरोध को करने से पहले, मैं सर्वर से टोकन का अनुरोध करता हूं। यह टोकन इस तरह दिखता है fmf5p81m6e56n4va3nkfu2ns8n यह एक सरल विधि द्वारा बनाया गया है, यह, हालांकि, अधिक जटिल हो सकता है, लेकिन यह जाने के लिए अच्छा है।

public String getToken() throws UnsupportedEncodingException {
    return new BigInteger(130, new SecureRandom()).toString(32);
}

टोकन का अनुरोध करते समय, सर्वर न केवल टोकन लौटाता है, बल्कि एक छोटी सी स्क्रिप्ट भी है कि यदि कोई व्यक्ति तत्व (और ब्राउज़र नावबार) का निरीक्षण करने के लिए ब्राउज़र का उपयोग करता है और ऐसी स्क्रिप्ट चलेगी और टोकन साफ़ हो जाएगा। सर्वलेट कुछ इस तरह देता है:

_html += "<head>"
    + "<script> "
    + "window.onload=function(){\n"
    + "       document.body.innerHTML = \"\";\n"
    + "    }"
    + "window.location.href='http://mywebsite.com' "
    + "</script>"
    + "</head>"
    + "<body>"
    + "[" + token+ "]"
    + "</body>"
    + "</html>";

पहले शरीर को खाली करता है फिर हम जहां चाहें वहां वापस जाते हैं। हालांकि, जावास्क्रिप्ट / jquery पूरी सामग्री को स्ट्रिंग के रूप में पकड़ता है, फिर मैं बस [और] के बीच स्ट्रिंग निकालता हूं। यह टोकन केवल अगले अनुरोध के लिए उपलब्ध है, इसलिए प्रत्येक AJAX अनुरोध में इसका अद्वितीय टोकन होगा। 2 पर टोकन का उपयोग किया जाता है बस हटा दिया जाता है।

टोकन प्राप्त होने के बाद मैं इसे लिंक के लिए पैरामीटर के रूप में जोड़ता हूं जो भी मैं अनुरोध करता हूं, कुछ इस प्रकार है:

ajaxRequestObjet = $.ajax({
    url: "http://localhost:8084/mywebsite.com/servlet", //<-- local tomcat server
    method: "POST",
    data: "type=AJAX&page=some-article&token=fmf5p81m6e56n4va3nkfu2ns8n"
});

यह विधि किसी ऐसे व्यक्ति के खिलाफ ठीक से काम करती है जो वेबसाइट को मैन्युअल रूप से निरीक्षण करता है और लिंक का उपयोग करने का प्रयास करता है, लेकिन java / php / IIS सर्वर के बारे में क्या है जो यह स्वचालित रूप से करते हैं?

इसके लिए हेडर के लिए पूछें! कुछ इस तरह:

boolean isAjax = "XMLHttpRequest".equals(request.getHeader("X-Requested-With")); 

यह केवल और केवल तभी सत्य होगा जब XMLHttpRequest मौजूद है ...।

ध्यान रखने योग्य एक आखिरी बात है। सुनिश्चित करें कि 'Access-Control-Allow-Origin' header is NOT present in your app है, यह सुनिश्चित करने के लिए कि आपके सर्वर के किसी भी जावास्क्रिप्ट को सर्वर संसाधन नहीं मिलेंगे। यदि यह शीर्ष लेख मौजूद नहीं है, तो क्रोम इसे लौटा देगा:

XMLHttpRequest cannot load http://localhost:8084/mywebsite.com/servlet. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost' is therefore not allowed access.

जावा सर्वर टॉमकैट में था और मेरे पास इस परीक्षण के लिए एक और अपाचे था, यह अपाचे में मौजूद छोटा HTML है जिसने त्रुटि को दिया:

<html>
<head>
    <script src="http://code.jquery.com/jquery-latest.min.js" type="text/javascript"></script>

    <script>
    ajaxRequestObjet = $.ajax({
        url: "http://localhost:8084/mywebsite.com/servlet",
        method: "POST",
        data: "type=AJAX&page=Token"
    });

    ajaxRequestObjet.done(function (msg) { 
        alert(msg);
    });

    </script>

</head>
<body>
</body>
</html>

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


इस समस्या को हल करने के लिए एक दृष्टिकोण यह हो सकता है:

मान लीजिए कि आपके पास किसी विशेष उपयोगकर्ता या क्लाइंट से प्रतिक्रिया प्राप्त करने के लिए अपने सर्वर को अजाक्स अनुरोध है। आपके डेटाबेस में एक तालिका हो सकती है जहाँ आप प्रत्येक उपयोगकर्ता या हैश मान के लिए एक अद्वितीय टोकन प्रदान करते हैं जिसे हर बार जाँचा जा सकता है जब उपयोगकर्ता सर्वर पर एक अजाक्स अनुरोध करता है। यदि टोकन मूल्य उपयोगकर्ता अनुरोध मूल्य से मेल खाता है, तो वह वास्तविक उपयोगकर्ता है। आप यह सुनिश्चित करने के लिए कि वह वैध अनुरोध कर रहा है, मेज पर उसके अनुरोध की संख्या भी दर्ज कर सकता है। मैं इस तथ्य को स्वीकार करता हूं कि यह आपके ऐप के प्रदर्शन को धीमा कर सकता है, लेकिन यह विचार करने के लिए सुरक्षित विकल्प होगा। नोट: आपको अपने HTML पृष्ठ पर टोकन को पुनः प्राप्त करने के लिए इसे अजाक्स के साथ भेजना होगा।

अधिक जानने के लिए कमेंट करें। मैं इस दृष्टिकोण का उपयोग कर रहा हूं और अब तक कोई समस्या नहीं है।

उदाहरण:


सबसे पहले: मैं मेल-एड्रेस को URL-एनकोड करता हूं। 'example.com/check.php?email=' . urlencode([email protected])

अपना प्रश्न विज्ञापन करें: जब check.php कहा जाता है, तो आप कर सकते हैं

  • जाँच करें, यदि उपयोगकर्ता के सत्र और उसके आईपी ने अंतिम सेकंड के दौरान एक अनुरोध भेजा है
  • यदि नहीं, तो उपयोगकर्ता का सत्र, उपयोगकर्ता का आईपी प्लस एक हेल्पर-टेबल प्लस से कुकी के लिए वर्तमान टाइमस्टैम्प और एमबी डीबी को हिट करें
  • यदि हाँ, तो अनुरोध ब्लॉक करें

लेकिन मुझे डर है कि यह आपको धोखाधड़ी से बचाने में मदद नहीं करेगा क्योंकि हर कोई आपके जावास्क्रिप्ट की जांच कर सकता है और यदि कोई इसका फायदा उठाना चाहता है, तो वह रास्ते खोजेगा।


आपकी वेबसाइट पर जावास्क्रिप्ट कोड को उपयोगकर्ता के कंप्यूटर पर निष्पादित किया जाता है, इसलिए ऐसा कोई तरीका नहीं है जिससे आप उसे अपने कोड के माध्यम से खुदाई करने से रोक सकें। यहां तक ​​कि अगर आप एक कोड obfuscator (उदाहरण के लिए, https://www.javascriptobfuscator.com/ ) का उपयोग करते हैं, तो हैकर आपके आवेदन को डीबग कर सकता है और सर्वर को भेजे गए सभी अनुरोधों को रिकॉर्ड कर सकता है।

सब कुछ सुरक्षा से संबंधित सर्वर पर होना चाहिए। आप एक विशिष्ट आईपी पते से अनुरोधों की मात्रा को सीमित कर सकते हैं।


आप CSRF टोकन के समान कुछ के साथ क्रूर बल के हमलों से रक्षा कर सकते हैं:

प्रत्येक क्लाइंट सत्र के लिए सर्वर-जनरेटेड ID असाइन करें। check.php प्रत्येक अनुरोध में यह आईडी शामिल होना चाहिए।

check.php को उन अनुरोधों को अस्वीकार करना चाहिए जिनमें एक आईडी शामिल नहीं है, या एक आईडी शामिल है जो सर्वर ने उत्पन्न नहीं की (स्पूफ आईडी के साथ हमलों को रोकने के लिए)। आईडी पर इसकी दर सीमा भी होनी चाहिए - अगर किसी दी गई आईडी ने अंतिम सेकंड में (कह) दिया है, या दी गई आईडी 10 सेकंड के अंतराल में n अनुरोधों से अधिक बनाती है, तो उसे एक त्रुटि प्रतिक्रिया वापस करनी चाहिए। यह कई IP पतों से आने वाले एकल सत्र के अनुरोधों से बचाता है।

बड़ी संख्या में वेब अनुप्रयोग सत्रों को खोलकर ब्रूट-फोर्सिंग को रोकने के लिए आपको IP पते की दर सीमा भी होनी चाहिए।

एक ईमेल या विशिष्ट ईमेल पते की एक छोटी या छोटी संख्या को रोकने के लिए आप बहुत कुछ नहीं कर सकते - यह इस प्रकार के सत्यापन के साथ एक अंतर्निहित जोखिम है।


जबकि आप इस 100% को नियंत्रित नहीं कर सकते हैं ... कुछ विकल्प हैं।

उसी तरीके का उपयोग करने की कोशिश करें जो लोग कैप्चा स्क्रिप्ट के साथ उपयोग करते हैं।

मूल रूप से जब उपयोगकर्ता प्रपत्र / पृष्ठ को लोड करता है .. तो आप उनके PHP सत्र में एक यादृच्छिक स्ट्रिंग / आईडी उत्पन्न करते हैं और इसे संग्रहीत करते हैं .. जब वे ajax अनुरोध भेजते हैं, तो आपके ajax की जाँच भी स्ट्रिंग / आईडी को जोड़ देती है और अनुमति देने से पहले इसकी आवश्यकता होती है 500 या कुछ और का हेडर वापस करने के लिए जाँच करें।

सत्र के साथ इस दृष्टिकोण का उपयोग करते हुए, आप चेक की अनुमत सीमा निर्धारित कर सकते हैं (5 कहते हैं) और एक बार उपयोगकर्ता ने 5 से अधिक चेक की कोशिश की, उन्हें पृष्ठ को फिर से लोड करने या एक मानव चेक (जैसे कैप्चा) करने की आवश्यकता होती है .. फिर यह रीसेट करता है। उनकी गिनती .. यहां तक ​​कि कुल 30 को 1 घंटे / प्रति आईपी या कुछ और की अनुमति दें।

जब अजाक्स की जाँच की जाती है, तो जैसे कि / a बटन को दबाकर .. या जब एक वैध ईमेल का पता चलता है, तो ट्रिगर करने के लिए स्मार्ट घटनाओं का उपयोग करें .. लेकिन कहते हैं .com.au दो बार ट्रिगर होगा।

मूल रूप से इस तरह, भले ही किसी ने आपकी जेएस फाइलें सूँघ ली हों और ईमेल चेकर को स्वचालित करने का प्रयास किया हो .. इससे उन्हें आपके द्वारा उत्पन्न स्ट्रिंग / आईडी को जोड़ने का एक तरीका खोजने की आवश्यकता होगी और उनके द्वारा किए गए अनुरोधों की मात्रा भी सीमित हो जाएगी।

इसके अलावा, वहाँ बहुत अधिक नहीं है जो आप आसानी से कर सकते हैं .. लेकिन अभी भी कुछ अन्य विचार हैं।

उनमें से अधिकांश एक PHP सत्र / कुकी का उपयोग करके काम करेंगे .. उदाहरण के लिए कहें यदि वे 3 ईमेल पते की जांच करते हैं और पाते हैं .. तो फिर से आप एक सीमा के रूप में सेट करते हैं और उन्हें मैन्युअल सबमिशन या कुछ और की आवश्यकता के लिए मजबूर करते हैं।

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

समय विलंब बस बुरा दिखाई देगा / आपकी साइट धीमी दिखाई देगी / प्रतिक्रिया के लिए प्रतीक्षा करने के साथ उपयोगकर्ता को बग।

आपको प्रति सत्र / आईपी पते को देखने की मात्रा को सीमित करने की आवश्यकता है .. अन्यथा हमेशा इन चेकों को प्राप्त करने का एक तरीका होता है .. मूल रूप से एक बार जब वे एक सीमा से टकराते हैं .. तो उपयोगकर्ता / आईपी / सत्र को कुछ मिनट प्रतीक्षा करने के लिए मजबूर करें / घंटे और उन्हें एक कैप्चा स्क्रिप्ट के साथ सत्यापित करें ताकि इसे स्क्रिप्ट नहीं किया जा सके ...

जावास्क्रिप्ट सुरक्षा / स्रोत छुपाना

जब आप वास्तव में ऐसा नहीं कर सकते हैं, तो आप कुछ काम कर सकते हैं जेएस शीर्षक के साथ एक PHP पृष्ठ का उपयोग करके जेएस उत्पन्न करते हैं .. इसलिए <script src='myjscode.php'></script> और यह PHP को एक वैध के लिए जांचने की अनुमति देता है सत्र .. तो एक हद तक बाहरी अनुरोधों को रोकता है .. लेकिन यह अधिकतर जेएस को सदस्यता / लॉगिन के पीछे उपलब्ध होने की अनुमति देने के लिए उपयोगी है।

इस मामले में कई चेक / यदि संभव हो तो

आपके दृष्टिकोण के आधार पर, क्या यह उपयोगकर्ता के लिए यह जांचने के लिए है कि क्या उनके पास पहले से ही एक खाता है? यदि ऐसा है .. तो आप ईमेल चेक को उनके नाम / देश / उम्र / dob जैसी किसी चीज़ के साथ जोड़ सकते हैं ... इसलिए उन्हें ajax कॉल से चेक / प्रतिक्रिया प्राप्त करने में सक्षम होने से पहले दो या तीन सही मिलान मूल्यों का चयन करना होगा?

हो सकता है कि आपके मामले में नहीं, लेकिन सिर्फ सोचा कि यह भी जोड़ देगा।


मैं कहूंगा कि एक ऐसा तरीका है जिसे आप कभी भी उपयोग नहीं करेंगे, जैसे कि # Do1Not2Use3This4Id5 या एक समान आईडी, जिसे आप 100% सुनिश्चित करते हैं, कोई भी इसका उपयोग नहीं करेगा और लोगों को अपमानित नहीं करेगा।

  1. Javascript:void(0)एक बुरा विचार है और सीएसपी-सक्षम HTTPS पृष्ठों पर सामग्री सुरक्षा नीति का उल्लंघन करता है https://developer.mozilla.org/en/docs/Security/CSP (@ jakub.g के लिए धन्यवाद)
  2. #दबाए जाने पर उपयोगकर्ता का उपयोग शीर्ष पर वापस कूद जाएगा
  3. जावास्क्रिप्ट सक्षम नहीं होने पर पृष्ठ को बर्बाद नहीं करेगा (जब तक आपके पास जावास्क्रिप्ट का पता लगाने वाला कोड न हो
  4. यदि जावास्क्रिप्ट सक्षम है तो आप डिफ़ॉल्ट घटना को अक्षम कर सकते हैं
  5. आपको तब तक href का उपयोग करना होगा जब तक कि आप अपने ब्राउज़र को कुछ टेक्स्ट चुनने से कैसे रोकें, (पता नहीं है कि 4 का उपयोग करने से पता चलता है कि ब्राउजर को टेक्स्ट चुनने से रोकता है)

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





javascript php jquery ajax