2011-10-21 12 views
5

स्पष्ट रूप से, यह केवल एक कार्यक्षमता रखने के लिए v1.0 में बहुत अधिक परेशानी पैदा कर रहा है जिसके लिए तीन फॉर्म सबमिशन की आवश्यकता है, $_SESSION सत्र डेटा सभी मध्यवर्ती सामानों को धारण करने के लिए - केवल उपयोगकर्ता को ऑपरेशन शुरू करने के लिए, फिर दूसरा टैब खोलें और एक दूसरा ऑपरेशन करें जो सत्र डेटा पर ट्रामल करता है।मेरे ऐप को एक ब्राउज़र टैब पर कैसे प्रतिबंधित करें?

मुझे संदेह है कि यह दुर्भावनापूर्ण है (लेकिन इसे छूट नहीं दे सकता)। अधिक संभावना है कि उपयोगकर्ता एक ऑपरेशन शुरू करता है, बाधित हो जाता है, भूल जाता है कि उन्होंने मूल टैब को शुरू किया या नहीं मिला है, फिर से शुरू होता है (फिर बाद में मूल टैब पाता है और दूसरी बार ऑपरेशन को पूरा करने का प्रयास करता है)।

चूंकि मैं PHP में कोडिंग कर रहा हूं, इसलिए मैं फॉर्म सबमिशन पर सत्र डेटा के अस्तित्व का पता लगा सकता हूं (यदि मैं उपयोगकर्ता को एक और टैब खोलता हूं तो मैं जेएस के साथ ऐसा कैसे करूं - मुझे लगता है कि मुझे अजाक्स की आवश्यकता होगी - है ना?) ।

इसलिए, हर बार जब मैं एक ऑपरेशन शुरू करता हूं तो मैं सत्र डेटा में ध्वज की जांच करता हूं और यदि सेट करता हूं तो मैं "माफ़ करना, डेव" पर पुनः लोड करता हूं। मुझे डर है कि मैं ऐसा नहीं कर सकता "पेज, अन्यथा मैंने ध्वज सेट किया और जारी रखा (ऑपरेशन के अंत में इसे साफ़ करना याद रखना)।

मुझे लगता है कि यह काम करेगा, लेकिन:
1) क्या ब्राउज़र ऐप्स को एक टैब/इंस्टेंस में प्रतिबंधित करना स्वीकार्य है?
2) क्या मुझे v2.0 में कई उदाहरणों को अनुमति देने का प्रयास करना चाहिए?

कोई अन्य टिप्पणी, सहायता या सलाह?

+0

यदि आपको यह समस्या है, तो आपको शायद उपयोगकर्ता के ब्राउज़र के बैक बटन पर क्लिक करने और फिर पिछले टैब के साथ इंटरैक्ट करने में समस्याएं होंगी, यहां तक ​​कि कई टैब के बिना भी। आप यह नहीं मान सकते कि '$ _SESSION' हमेशा ब्राउज़र के साथ सिंक हो रहा है। – Wyzard

उत्तर

5

सत्र में उपयोगकर्ता इंटरैक्शन स्थिति को संग्रहीत करने से बचने के लिए एक बेहतर डिज़ाइन होगा। इसे छिपे हुए फॉर्म फ़ील्ड या कुछ में रखें ताकि प्रत्येक ग्राहक अनुरोध इसके साथ संबंधित स्थिति रख सके। यदि आप इसके बारे में चिंतित उपयोगकर्ता के बारे में चिंतित हैं, तो इसे रोकने के लिए एक एचएमएसी का उपयोग करें, और संभवतः इसे एन्क्रिप्ट करें यदि इसमें ऐसी चीजें हैं जो उपयोगकर्ता को देखने में सक्षम नहीं होना चाहिए।

केवल राज्य टैब के बीच साझा किया जाना चाहिए - जैसे उपयोगकर्ता की लॉगिन पहचान, या शॉपिंग कार्ट की तरह कुछ - सत्र में संग्रहीत किया जाना चाहिए।

2

टैबबड ब्राउज़िंग का समर्थन करने वाले प्रत्येक ब्राउज़र के साथ यह एक ही टैब पर ब्राउज़िंग को प्रतिबंधित करने का प्रयास करने के लिए एक खराब उपयोगकर्ता अनुभव होगा (आप तब भी डेस्कटॉप ऐप बना सकते हैं)।

एक तरीका यह है कि आप इसे हल कर सकते हैं, अपने रूपों (एक छिपे हुए चर के रूप में) में एक CSRF टोकन जोड़कर, अनुरोध के साथ सबमिट किया जाएगा।

CSRF reference

ऐसे कई तरीके टोकन उत्पन्न करने के लिए हैं, लेकिन अनिवार्य रूप से आप:

  1. प्रपत्र अपने $_SESSION
  2. उत्पादन में टोकन
  3. स्टोर बनाने <input type="hidden" name="{token name}" value="{token value}" />
साथ

फिर जब फॉर्म आपको सबमिट करता है बिल्ली $_REQUEST['{token name}'] == $_SESSION[ {टोकन नाम}] `।

यदि टोकन अलग है तो आप जानते हैं कि यह मूल रूप से जेनरेट नहीं किया गया था और इस प्रकार वास्तविक फॉर्म सही टोकन के साथ आने तक अनुरोध को अनदेखा कर सकता है।

एक बात: यदि कोई हमलावर यह पता लगा सकता है कि आप अपने सीएसआरएफ टोकन कैसे उत्पन्न करते हैं तो वे अनुरोध तैयार कर सकते हैं।

+0

ऐसा लगता है कि मैंने गलत तरीके से प्रश्न का उच्चारण किया था। ब्राउजर के रूप में कई टैब खुले हो सकते हैं - लेकिन केवल एक ही मेरा हो सकता है – Mawg

4

अधिकतर आप सत्र फ़ाइल में "अंतिम अनुरोधित पृष्ठ" प्रविष्टि रख सकते हैं, झंडे के साथ यह इंगित करने के लिए कि उपयोगकर्ता को इसे बंद करने की अनुमति नहीं दी जानी चाहिए यदि यह इन महत्वपूर्ण रूपों में से एक है। तो यदि आप form.php पर हैं और यह no-move-off एक है, तो लोड किया गया कोई भी नया पृष्ठ "निरस्त या बंद विंडो" विकल्प प्रस्तुत करना चाहिए।

आप किसी उपयोगकर्ता को एक और टैब/विंडो खोलने से नहीं रोक सकते हैं, लेकिन आप उन्हें अन्य साइट/टैब में अपनी साइट पर कहीं और स्थानांतरित करने से रोक सकते हैं।

हालांकि, मान लें कि यह एक बहुत ही खराब उपयोगकर्ता अनुभव है। कल्पना करें कि क्या अमेज़ॅन ने आपको शॉपिंग कार्ट पेज में फंस लिया है और वास्तव में आपको कुछ खरीदने के बिना किसी अन्य पृष्ठ पर जाने नहीं दिया है। एकाधिक कोड को एक ही रूप का उपयोग करने की अनुमति देने के लिए अपना कोड अपडेट करने पर विचार करें।

+0

+1 मुझे आपका समाधान पसंद है। और मैं मानता हूं कि इसे 2.0 में तय किया जाना चाहिए, लेकिन ... – Mawg

+0

बीटीडब्ल्यू, अन्य लोग इसे कैसे संबोधित करते हैं? चूंकि सत्र डेटा पैन-ब्राउज़र है, तो क्या होता है यदि उपयोगकर्ता एक ही मल्टी-स्टेज ऑपरेशन को समान टैब के दो टैब या विंडो में समानांतर में करता है - जो समान सत्र डेटा साझा करता है? – Mawg

+0

@Mawg: बस फॉर्म में छिपे हुए फ़ील्ड में मध्यवर्ती डेटा स्टोर करें। (देखें [वाईज़ार्ड का जवाब] (http://stackoverflow.com/questions/7844415/x/7844704#7844704)) – icktoofay

2

जोड़ा नीचे स्क्रिप्ट के बाद मैं के लिए लॉग इन (माना dashboard.php)

<script> 
$(document).ready(function() 
{ 
    $("a").attr("target", ""); 
    if(typeof(Storage)    !== "undefined") 
    { 
     sessionStorage.pagecount = 1; 
     var randomVal    = Math.floor((Math.random() * 10000000) + 1); 
     window.name     = randomVal; 
     var url      = "url to update the value in db(say random_value)"; 
     $.post(url, function (data, url) 
     { 
     }); 
    } 
    else 
    { 
     var url      = "url to remove random_value";   
     $.post(url, function (data, url) 
     { 
      sessionStorage.removeItem('pagecount'); 
      sessionStorage.clear(); 
      window.location   = 'logout.php'; 
     }); 
    }  
}); 
</script> 

जोड़ा गया हैडर में नीचे स्क्रिप्ट अपने पृष्ठों के बाकी हिस्सों में - 'random_value' है कि उपयोगकर्ता के लिए डाटाबेस से है

<script> 
$(document).ready(function() 
{  
    $("a").attr("target", "_self"); 

    if(typeof(Storage)      !== "undefined") 
    { 
     if (sessionStorage.pagecount) 
     { 
      if('<?=$random_value?>'   == window.name) 
      { 
       sessionStorage.pagecount = Number(sessionStorage.pagecount) + 1; 
      } 
      else 
      { 
       var url      = "url to remove random_value";   
       $.post(url, function (data, url) 
       { 
        sessionStorage.removeItem('pagecount'); 
        sessionStorage.clear(); 
        window.location   = 'logout.php'; 
       }); 

      }    
     } 
     else 
     {   
      var url       = "url to remove random_value";   
      $.post(url, function (data, url) 
      { 
       sessionStorage.removeItem('pagecount'); 
       sessionStorage.clear(); 
       window.location    = 'logout.php'; 
      }); 
     } 
    } 
    else 
    { 
     var url        = "url to remove random_value";     
     $.post(url, function (data, url) 
     { 
      sessionStorage.removeItem('pagecount'); 
      sessionStorage.clear(); 
      window.location     = 'logout.php'; 
     }); 
    } 
}); 
</script> 
0

अगर मैं अब यह कर रहा था, तो शायद मैं एक पृष्ठ एंगुलरजेएस ऐप कोड करता हूं (हालांकि जेएस का कोई भी रूप करेगा)।

स्टार्ट-अप पर, ध्वज के लिए स्थानीय संग्रहण में देखें। यदि सेट है, तो उपयुक्त संदेश के साथ शुरू करने से इंकार कर दें, अन्यथा ध्वज & ऐप चलाएं।

निश्चित रूप से, एक दुर्भावनापूर्ण उपयोगकर्ता इसके आसपास हो सकता है, क्योंकि यह सर्वर-साइड चेक नहीं है, लेकिन मैं इस तरह का समर्थन करने से इंकार कर दूंगा।

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