2010-07-23 8 views
8

मैं एक ऐप में jQuery का उपयोग कर रहा हूं जो उपयोगकर्ता को क्लिक करता है .click() बाध्यकारी के माध्यम से दिए गए क्रिया को करने के लिए उपयोगकर्ता क्लिक करता है, और मैं चाहता हूं कि यह कार्यक्षमता केवल उपयोगकर्ता mousedown के माध्यम से उपलब्ध हो। मेरे दोस्तों में से एक ने आज बताया कि फ़ायरबग (या कुछ समान) में जावास्क्रिप्ट टर्मिनल से $ (तत्व) .click() चलाने के लिए संभव है, और तत्व पर क्लिक करने के समान कार्यक्षमता प्राप्त करें - जो कुछ मैं चाहता हूं को रोकने के। ऐसा करने के बारे में कोई विचार कैसे? आपके सहयोग के लिए धन्यवाद।बाहरी पहुंच से jQuery फ़ंक्शन को सुरक्षित करें

+0

यह इस बात से संबंधित है कि आपको लगता है कि यह संभव हो सकता है। आपको सुरक्षा और शोषण प्रक्रिया के बारे में और अधिक पढ़ना चाहिए। (ओह और मैंने आपको +1 दिया) – rook

+0

कोई भी अनुशंसित पढ़ने? धन्यवाद! – man1

उत्तर

10

संक्षिप्त उत्तर: नहीं, आप इसे वास्तव में रोक नहीं सकते हैं।

लांग जवाब: एक click event की तरह किसी भी घटना ऐसी Event handlers कहा जाता है के लिए बाध्य है। वे हैंडलर functions हैं जिन्हें किसी दिए गए ईवेंट के दौरान निष्पादित किया जाता है। इसलिए यदि आप किसी तत्व पर क्लिक करते हैं, तो आपका ब्राउज़र जांचता है कि event handlers इसके लिए बाध्य हैं, यदि ऐसा है तो fires उन्हें। यदि नहीं, तो ब्राउज़र bubble up को parent elements पर ईवेंट करने का प्रयास करेगा, फिर से जांचता है कि event handlers उस तरह की घटना के लिए बाध्य है .. और बहुत आगे।

jQuerys.trigger() विधि (राशि है जो आप वास्तव में फोन करता है, तो उदाहरण के लिए .click() बुला) सिर्फ एक ही बात करता है। यह event handlers पर कॉल करता है जो एक विशिष्ट घटना के लिए एक विशिष्ट तत्व से बंधे होते हैं।

संपादित

वहाँ soft detect कोई वास्तविक क्लिक के somekind के सामान्य ढंग, उदाहरण के लिए यदि आप एक event object भीतर toElement संपत्ति के लिए जाँच कर सकते हैं हो सकता है। उस संपत्ति को सेट नहीं किया गया है जब triggered। लेकिन फिर, आप आसानी से नकली कर सकते हैं कि .trigger() के साथ। उदाहरण:

$(document).ready(function() { 
    $('#invalid2').bind('click', function(e){ 
     alert('click\nevent.target: ' + e.toElement.id); 
     console.log(e); 
    }); 

    $('#invalid1').bind('click', function(){ 
     $('#invalid2').trigger({ 
      type: 'click', 
      toElement: {id: 'Fake'} 
     }); 
    }); 
});​ 

कार्य उदाहरण: http://www.jsfiddle.net/v4wkv/1/

तुम सिर्फ $('#invalid2').trigger('click') कहेंगे तो toElement संपत्ति वहाँ नहीं होगा और इसलिए असफल। लेकिन जैसा कि आप देख सकते हैं, आप event object में कुछ भी जोड़ सकते हैं।

+1

+1 बहुत अच्छा जवाब है, और मैं पूरी तरह से सहमत हूं। – rook

+0

समझ में आता है। कम से कम मैं आपके उदाहरण में "अवैध 2" के लिए अपनी तकनीक का उपयोग कर इसे धोखा देने के लिए थोड़ा और कठिन बना सकता हूं। महान जवाब के लिए बहुत बहुत धन्यवाद। – man1

1

आप क्या रोकने की कोशिश कर रहे हैं? कोई आपके क्लाइंट साइड स्क्रिप्ट के साथ गड़बड़ कर रहा है? आप अपने कोड को खराब करने जैसी चीजें कर सकते हैं लेकिन उससे भी ज्यादा नहीं। लेकिन यह भी करने से यह मेरी राय में लायक है इससे ज्यादा परेशानी होती है।

यदि आप नहीं चाहते हैं कि लोग कुछ चीजें कर रहे हैं तो सर्वर को कार्यक्षमता को स्थानांतरित करें।

बुरी खबरों के बारे में क्षमा करने के लिए खेद है।

+1

Obfuscation आपके उपयोगकर्ता को अपने जावास्क्रिप्ट से गड़बड़ करने से रोकने के लिए एक भयानक तरीका प्रतीत होता है। अगर कोई वास्तव में कुछ काम करने की सभी परेशानी से गुजरना चाहता है, तो उन्हें क्यों न दें? – LandonSchropp

+0

@helixed मैं सहमत हूं। मैंने कहा कि यह परेशानी के लायक नहीं था लेकिन यह एक विकल्प है। मैंने उसे सर्वर पर ले जाने के लिए कहा। – spinon

+0

अच्छा बिंदु साथी, लेकिन मेरी चिंता यह नहीं है कि कोई * इसे स्वयं कह सकता है, बल्कि यह कि वे इसे किसी ऐसी चीज में स्क्रिप्ट कर सकते हैं जो बहुत बार चल सकता है। मुझे घटना को केवल माउस पर क्लिक करने की आवृत्ति पर होने की आवश्यकता होती है। (और हाँ, यह प्रत्येक कॉल पर मेरे सर्वर के साथ संचार करता है।) – man1

1

आप इसके खिलाफ कुछ भी नहीं कर सकते हैं, तो पूरा कार्य लिखना और फिर इसे आग लगाना भी संभव होगा।

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

0

आप ईवेंट ऑब्जेक्ट (जिसे हैंडलर के लिए पहली तर्क के रूप में पारित किया गया है) मूलवेन्ट की जांच कर सकते हैं। यदि ईवेंट अनुकरण किया जाता है तो यह अनिर्धारित होगा।क्लिक करें()

लेकिन यह पूरी तरह से बेकार है। आप सुरक्षा के लिए जावास्क्रिप्ट का उपयोग नहीं कर सकते - क्लाइंट का पूरा नियंत्रण है (और फायरबग कंसोल केवल सबसे स्पष्ट उपकरण है)। क्लाइंट-साइड सुरक्षा जांच केवल उपयोगकर्ता के लिए संकेत और त्रुटियों के खिलाफ सुरक्षा होना चाहिए, दुर्भावनापूर्ण इनपुट केवल सर्वर-पक्ष पर ही रोका जा सकता है।

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