2013-05-21 9 views
6

मैं केवल new browsers का समर्थन करने के लिए है।क्या एक सुरक्षित JSONP अनुरोध करना संभव है?

मुझे JSONP डेटा प्रदान करने के लिए बाहरी सेवा पर भरोसा करना है, मेरे पास उस सेवा का स्वामित्व नहीं है और यह CORS की अनुमति नहीं देता है।

मुझे बाहरी सर्वर से जेएसओएनपी अनुरोधों पर भरोसा करना बहुत असहज महसूस होता है, क्योंकि वे मेरे अंत में मनमाने ढंग से कोड चला सकते हैं, जिससे वे मेरे उपयोगकर्ताओं को ट्रैक कर सकते हैं, और यहां तक ​​कि उनकी जानकारी चुरा सकते हैं।

मैं सोच रहा था कि JSONP अनुरोध बनाने का कोई तरीका सुरक्षित है या नहीं?

(संबंधित: How to reliably secure public JSONP requests? लेकिन नई ब्राउज़र छूट के साथ नहीं)

नोट: मैंने पूछा/यह क्यू & एक शैली ने उत्तर दिया, लेकिन मैं अन्य विचारों के लिए बहुत खुले हूँ।

उत्तर

11

हाँ!

यह संभव है। ऐसा करने का एक तरीका WebWorkers का उपयोग करना होगा। वेबवर्कर्स में चल रहे कोड में आपके पृष्ठ चल रहे डीओएम या अन्य जावास्क्रिप्ट कोड तक कोई पहुंच नहीं है।

आप वेबवर्कर बना सकते हैं और इसके साथ JSONP अनुरोध निष्पादित कर सकते हैं, फिर इसे पूरा होने पर इसे समाप्त कर दें।

  • URL के साथ एक ब्लॉब से एक WebWorker बनाएँ स्थानीय कॉलबैक

  • साथ JSONP अनुरोध लोड करने के लिए

  • उपयोग importScripts अनुरोध करने के लिए:

    प्रक्रिया कुछ इस तरह है जब वह कॉलबैक निष्पादित होता है, तो स्क्रिप्ट पर एक संदेश पोस्ट करें, जो बदले में डेटा के साथ वास्तविक कॉलबैक संदेश निष्पादित करेगा।

इस तरह, एक हमलावर को डोम के बारे में कोई जानकारी नहीं होगी।

यहाँ एक sample implementation है:

// Creates a secure JSONP request using web workers. 
// url - the url to send the request to 
// data - the url parameters to send via querystring 
// callback - a function to execute when done 
function jsonp(url, data, callback) { 
    //support two parameters 
    if (typeof callback === "undefined") { 
     callback = data; 
     data = {}; 
    } 
    var getParams = ""; // serialize the GET parameters 
    for (var i in data) { 
     getParams += "&" + i + "=" + data[i]; 
    } 
    //Create a new web worker, the worker posts a message back when the JSONP is done 
    var blob = new Blob([ 
     "var cb=function(val){postMessage(val)};" + 
     "importScripts('" + url + "?callback=cb" + getParams + "');"],{ type: "text/javascript" }); 
    var blobURL = window.URL.createObjectURL(blob); 
    var worker = new Worker(blobURL); 

    // When you get a message, execute the callback and stop the WebWorker 
    worker.onmessage = function (e) { 
     callback(e.data); 
     worker.terminate(); 
     }; 
    worker.postMessage(getParams); // Send the request 
    setTimeout(function(){ 
     worker.terminate();//terminate after 10 seconds in any case. 
    },10000); 
}; 

यहाँ नमूना उपयोग कि JSFiddle में काम करता है:

jsonp("http://jsfiddle.net/echo/jsonp", { 
    "hello": "world" 
}, function (response) { 
    alert(response.hello); 
}); 

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

यह आईई 10 +, क्रोम, फ़ायरफ़ॉक्स और सफारी के साथ-साथ मोबाइल ब्राउज़र पर भी काम करना चाहिए।

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