ব্রাউজারে স্যান্ডবক্স জাভাস্ক্রিপ্ট চলছে কি সম্ভব?


142

আমি ভাবছি যে কোনও HTML পৃষ্ঠায় চলমান জাভাস্ক্রিপ্ট কোডে সাধারণত উপলব্ধ এমন বৈশিষ্ট্যগুলিতে অ্যাক্সেস আটকাতে ব্রাউজারে জাভাস্ক্রিপ্ট চলমান স্যান্ডবক্স করা সম্ভব কিনা।

উদাহরণস্বরূপ, আসুন আমি বলি যে আমি "জাভীয় ঘটনাগুলি" ঘটলে ইভেন্ট হ্যান্ডলারগুলি চালিত হওয়ার জন্য তাদের শেষ সংখ্যার ব্যবহারকারীদের জাভাস্ক্রিপ্ট এপিআই সরবরাহ করতে চাই, তবে আমি চাই না যে সেই ব্যবহারকারীরা সেই windowবস্তুর বৈশিষ্ট্য এবং ফাংশনগুলিতে অ্যাক্সেস পান । আমি কি এটি করতে সক্ষম?

সবচেয়ে সহজ ক্ষেত্রে, আসুন আমি বলি যে আমি ব্যবহারকারীদের কলিং প্রতিরোধ করতে চাই alert। আমি ভাবতে পারি এমন কয়েকটি পদ্ধতির নাম:

  • window.alertবিশ্বব্যাপী পুনরায় সংজ্ঞা দিন । আমার মনে হয় না এটি একটি বৈধ পন্থা হবে কারণ পৃষ্ঠায় চলমান অন্যান্য কোডগুলি (যেমন তাদের ইভেন্ট হ্যান্ডলারের ব্যবহারকারীদের দ্বারা রচিত স্টাফ) ব্যবহার করতে চাইতে পারে alert
  • প্রক্রিয়াটির হ্যান্ডলার কোডটি সার্ভারে প্রেরণ করুন। আমি নিশ্চিত নই যে প্রসেসের জন্য সার্ভারে কোডটি প্রেরণ করা সঠিক পদ্ধতির কারণ ইভেন্ট হ্যান্ডলারদের পৃষ্ঠার প্রসঙ্গে চালানো দরকার।

সম্ভবত একটি সমাধান যেখানে সার্ভারটি ব্যবহারকারী সংজ্ঞায়িত ফাংশনটি প্রসেস করে এবং তারপরে ক্লায়েন্টের উপর মৃত্যুদন্ড কার্যকর করার জন্য একটি কলব্যাক উত্পন্ন করে? এমনকি যদি এই পদ্ধতির কাজ করে তবে এই সমস্যা সমাধানের আরও ভাল উপায় আছে?

উত্তর:


54

গুগল কজা হ'ল উত্স-উত্স অনুবাদক যা "আপনাকে আপনার পৃষ্ঠায় অবিশ্বস্ত তৃতীয় পক্ষের এইচটিএমএল এবং জাভাস্ক্রিপ্ট ইনলাইন রাখার অনুমতি দেয় এবং এখনও সুরক্ষিত হতে পারে।"


5
একটি দ্রুত পরীক্ষা দেখায় যে কজা ব্রাউজারটিকে সিপিইউ আক্রমণ থেকে সুরক্ষিত করতে অক্ষম while (1) {}--- যেমন এটি কেবল স্তব্ধ। তেমনিভাবে a=[]; while (1) { a=[a,a]; }
ডেভিড 22

5
হ্যাঁ, পরিষেবার অস্বীকৃতি সুযোগের বাইরে: কোড. google.com/p/google-caja/issues/detail?id=1406
ডারিয়াস বেকন

32

কটাক্ষপাত আছে ডগলাস Crockford এর ADsafe :

অ্যাডাসাফ কোনও ওয়েব পৃষ্ঠায় অতিথি কোড (যেমন তৃতীয় পক্ষের স্ক্রিপ্টেড বিজ্ঞাপন বা উইজেট) স্থাপন করা নিরাপদ করে। অ্যাডাসাফ জাভাস্ক্রিপ্টের একটি সাবসেট সংজ্ঞায়িত করেছে যা অতিথির কোডটিকে মূল্যবান ইন্টারঅ্যাকশন করতে অনুমতি দেওয়ার পক্ষে যথেষ্ট শক্তিশালী, একই সময়ে দূষিত বা দুর্ঘটনাজনিত ক্ষতি বা অনুপ্রবেশ রোধ করে। এডাসেফের সাবসেটটি জেএসলিন্টের মতো সরঞ্জামগুলির মাধ্যমে যান্ত্রিকভাবে যাচাই করা যেতে পারে যাতে সুরক্ষার জন্য কোনও অতিথি কোডের পর্যালোচনা করা প্রয়োজন না। অ্যাডাসেফ সাবসেটটি ভাল কোডিং অনুশীলনগুলি প্রয়োগ করে, অতিথি কোডটি সঠিকভাবে চলার সম্ভাবনা বাড়িয়ে তোলে।

আপনি প্রকল্পের গিটহাবের সংগ্রহস্থলের ফাইল template.htmlএবং template.jsফাইলগুলি দেখে অ্যাডাসেফকে কীভাবে ব্যবহার করবেন তার একটি উদাহরণ দেখতে পাবেন ।


তাদের সাইটে আমি অ্যাডাসেফ ব্যবহারের কোনও উপায় দেখতে পাচ্ছি না। এটি ডাউনলোড করার কোনও উপায় নেই, কোডের কোনও লিঙ্ক নেই, কিছুই নেই। আপনি কীভাবে অ্যাডস্যাফ চেষ্টা করে দেখতে পারেন?
বিটি

2
এছাড়াও, এটি কোনও অ্যাক্সেসকে বাধা দেয় this, যা সম্পূর্ণ অগ্রহণযোগ্য। আপনি ব্যবহার না করে ভাল জাভাস্ক্রিপ্ট লিখতে পারবেন না this
বিটি

4
@ বিটি আমি ব্যবহার না করে পুরো প্রকল্পগুলি লিখেছি this। খারাপ নামকরণযুক্ত পরামিতি এড়ানো কঠিন নয়।
4-10

2
@ বিটি এটি নির্বাক হয়ে বলতে চাই যে বাস্তব-প্রকল্পের প্রকল্পগুলি সম্পূর্ণ অগ্রহণযোগ্য। তবে আমি এই আলোচনা শুরু করার জন্য দুঃখিত, এবং অবশ্যই প্রত্যাহার করতে হবে; এ জাতীয় বিষয় নিয়ে আলোচনা করার জায়গা নয় (দুঃখিত)। আপনি আরও আলোচনা করতে চাইলে আমি টুইটারে আছি।

1
@ বিটি (এটি প্রশ্নের সাথে প্রাসঙ্গিক হওয়ায় আমি অবিরত থাকব) যে কোনও সময় আপনি অন্য কারও পরিবেশে কোড চালান আপনি নিয়ম এবং বিধিনিষেধে চলে যাবেন। আমি এটিকে অগ্রহণযোগ্য বলব না। একটি "গাধা মধ্যে ব্যথা", হতে পারে। তবে অগ্রহণযোগ্য নয়। সর্বোপরি, প্রতিটি ব্যবহারের জন্য thisএটি করার মতো একটি সমান, সমতুল্য thisউপায় নেই (এটি সর্বোপরি কেবল একটি প্যারামিটার)।

24

আমি jsandbox নামে একটি স্যান্ডবক্সিং লাইব্রেরি তৈরি করেছি যা মূল্যবান কোড স্যান্ডবক্সে ওয়েব কর্মীদের ব্যবহার করে। স্পষ্টভাবে স্যান্ডবক্সযুক্ত কোড ডেটা দেওয়ার জন্য এটির একটি ইনপুট পদ্ধতি রয়েছে এটি অন্যথায় পেতে সক্ষম হবে না।

নীচে এপিআই এর একটি উদাহরণ:

jsandbox
    .eval({
      code    : "x=1;Math.round(Math.pow(input, ++x))",
      input   : 36.565010597564445,
      callback: function(n) {
          console.log("number: ", n); // number: 1337
      }
  }).eval({
      code   : "][];.]\\ (*# ($(! ~",
      onerror: function(ex) {
          console.log("syntax error: ", ex); // syntax error: [error object]
      }
  }).eval({
      code    : '"foo"+input',
      input   : "bar",
      callback: function(str) {
          console.log("string: ", str); // string: foobar
      }
  }).eval({
      code    : "({q:1, w:2})",
      callback: function(obj) {
          console.log("object: ", obj); // object: object q=1 w=2
      }
  }).eval({
      code    : "[1, 2, 3].concat(input)",
      input   : [4, 5, 6],
      callback: function(arr) {
          console.log("array: ", arr); // array: [1, 2, 3, 4, 5, 6]
      }
  }).eval({
      code    : "function x(z){this.y=z;};new x(input)",
      input   : 4,
      callback: function(x) {
          console.log("new x: ", x); // new x: object y=4
      }
  });

+1: এটি দেখতে দুর্দান্ত দেখাচ্ছে। এভাবে ব্যবহারকারীর কোডটি কার্যকর করা কতটা নিরাপদ?
কনস্ট্যান্টিন টার্কাস

1
বেশ নিরাপদ. গিথুবে আপডেট হওয়া লাইব্রেরিটি দেখুন ।
এলি গ্রে

1
এই প্রকল্প এখনও রক্ষণাবেক্ষণ করা হয়? আমি দেখতে পেয়েছি যে এটি 2 বছরেরও বেশি সময় থেকে আপডেট হয়নি ...
ইয়ানিক রচন

আমি এটি পছন্দ করি, যদি আপনি স্যান্ডবক্স করতে চান তবে কোডটি jQuery বলতে অ্যাক্সেসের অনুমতি দেয় তবে এটি ব্যর্থ হবে কারণ ওয়েব কর্মীরা DOM হেরফেরের অনুমতি দেয় না।
রাহলি

হাই এলি - একটি দুর্দান্ত কাজটির জন্য ধন্যবাদ, আপনি কি এটি বজায় রাখার পরিকল্পনা করছেন? আমি ডিবাগিং কার্যকারিতা যুক্ত করার জন্য একটি পরিবর্তন অনুরোধ করেছি - যা কোডটিতে তাত্ক্ষণিকভাবে তাকানো সম্ভব হওয়া উচিত। আপনি কি মনে করেন দয়া করে?
ব্যবহারকারী 1514042

8

আমি মনে করি যে js.js এখানে উল্লেখযোগ্য। এটি জাভাস্ক্রিপ্টে লিখিত একটি জাভাস্ক্রিপ্ট ইন্টারপ্রেটার।

এটি নেটিভ জেএসের চেয়ে প্রায় 200 গুণ ধীর, তবে এর প্রকৃতি এটিকে একটি নিখুঁত স্যান্ডবক্স পরিবেশে পরিণত করে। আর একটি অপূর্ণতা এর আকার - প্রায় 600 কেবি, যা কিছু ক্ষেত্রে ডেস্কটপগুলির জন্য গ্রহণযোগ্য হতে পারে, তবে মোবাইল ডিভাইসের জন্য নয়।


7

অন্যান্য প্রতিক্রিয়াগুলিতে উল্লিখিত হিসাবে, স্যান্ডবক্সযুক্ত আইফ্রেমে কোডটি জেল করে দেওয়া (সার্ভার-সাইডে না পাঠিয়ে) এবং বার্তাগুলির সাথে যোগাযোগ করার জন্য এটি যথেষ্ট। আমি বেশিরভাগই অবিশ্বস্ত কোডকে কিছু এপিআই সরবরাহ করার প্রয়োজনীয়তার কারণে, যেমনটি প্রশ্নের মধ্যে বর্ণিত হয়েছে তেমন একটি ছোট লাইব্রেরিটি একবার দেখে নেওয়ার পরামর্শ দেব : যেখানে নির্দিষ্ট ফাংশনগুলির সেটটি স্যান্ডবক্সে রফতানি করার সুযোগ রয়েছে যেখানে অবিশ্বস্ত কোড চালায়। এবং এখানে একটি ডেমো রয়েছে যা কোনও স্যান্ডবক্সে ব্যবহারকারী দ্বারা জমা দেওয়া কোডটি কার্যকর করে:

http://asvd.github.io/jailed/demos/web/console/


4

সমস্ত ব্রাউজার বিক্রেতারা এবং এইচটিএমএল 5 স্পেসিফিকেশন স্যান্ডবক্সযুক্ত আইফ্রেমে অনুমতি দেওয়ার জন্য একটি আসল স্যান্ডবক্স সম্পত্তিটির দিকে কাজ করছে - তবে এটি এখনও আইফ্রেমে গ্র্যানুলারিটিতে সীমাবদ্ধ।

সাধারণভাবে, কোনও ডিগ্রি নিয়মিত প্রকাশ ইত্যাদি নিরাপদভাবে স্বেচ্ছাকৃত ব্যবহারকারীর দ্বারা সরবরাহ করা জাভাস্ক্রিপ্টের কারণে এটি থামানো সমস্যার অবনতি ঘটতে পারে: - /


2
আপনি কীভাবে এটি থামিয়ে সমস্যার অধ: পতন ব্যাখ্যা করতে পারেন?
hdgarrood

2
থামানো সমস্যা সমাধানের তাত্ত্বিক অসম্ভবতা কেবলমাত্র স্থির কোড বিশ্লেষণে প্রযোজ্য। স্যান্ডবক্সগুলি থামানো সমস্যার মোকাবেলায় সময় সীমা প্রয়োগের মতো কাজ করতে পারে।
অ্যাভিয়ান্থা

4

@ রায়ানওহারার ওয়েব ওয়ার্কার্স স্যান্ডবক্স কোডের একটি উন্নত সংস্করণ, একটি একক ফাইলে (কোনও অতিরিক্ত eval.jsফাইলের প্রয়োজন নেই)।

function safeEval(untrustedCode)
    {
    return new Promise(function (resolve, reject)
    {

    var blobURL = URL.createObjectURL(new Blob([
        "(",
        function ()
            {
            var _postMessage = postMessage;
            var _addEventListener = addEventListener;

            (function (obj)
                {
                "use strict";

                var current = obj;
                var keepProperties = [
                    // required
                    'Object', 'Function', 'Infinity', 'NaN', 'undefined', 'caches', 'TEMPORARY', 'PERSISTENT', 
                    // optional, but trivial to get back
                    'Array', 'Boolean', 'Number', 'String', 'Symbol',
                    // optional
                    'Map', 'Math', 'Set',
                ];

                do {
                    Object.getOwnPropertyNames(current).forEach(function (name) {
                        if (keepProperties.indexOf(name) === -1) {
                            delete current[name];
                        }
                    });

                    current = Object.getPrototypeOf(current);
                }
                while (current !== Object.prototype);
                })(this);

            _addEventListener("message", function (e)
            {
            var f = new Function("", "return (" + e.data + "\n);");
            _postMessage(f());
            });
            }.toString(),
        ")()"], {type: "application/javascript"}));

    var worker = new Worker(blobURL);

    URL.revokeObjectURL(blobURL);

    worker.onmessage = function (evt)
        {
        worker.terminate();
        resolve(evt.data);
        };

    worker.onerror = function (evt)
        {
        reject(new Error(evt.message));
        };

    worker.postMessage(untrustedCode);

    setTimeout(function () {
        worker.terminate();
        reject(new Error('The worker timed out.'));
        }, 1000);
    });
    }

এটা পরীক্ষা করো:

https://jsfiddle.net/kp0cq6yw/

var promise = safeEval("1+2+3");

promise.then(function (result) {
      alert(result);
      });

এটি আউটপুট করা উচিত 6(ক্রোম এবং ফায়ারফক্সে পরীক্ষিত)।


2

একটি কুরুচিপূর্ণ উপায় কিন্তু সম্ভবত এটি আপনার জন্য কাজ করে, আমি সমস্ত গ্লোবাল নিয়েছি এবং তাদের স্যান্ডবক্স স্কোপে নতুন সংজ্ঞা দিয়েছি, পাশাপাশি আমি কঠোর মোডটি যুক্ত করেছি যাতে তারা কোনও বেনামি ফাংশন ব্যবহার করে গ্লোবাল অবজেক্টটি না পেতে পারে।

function construct(constructor, args) {
  function F() {
      return constructor.apply(this, args);
  }
  F.prototype = constructor.prototype;
  return new F();
}
// Sanboxer 
function sandboxcode(string, inject) {
  "use strict";
  var globals = [];
  for (var i in window) {
    // <--REMOVE THIS CONDITION
    if (i != "console")
    // REMOVE THIS CONDITION -->
    globals.push(i);
  }
  globals.push('"use strict";\n'+string);
  return construct(Function, globals).apply(inject ? inject : {});
}
sandboxcode('console.log( this, window, top , self, parent, this["jQuery"], (function(){return this;}()));'); 
// => Object {} undefined undefined undefined undefined undefined undefined 
console.log("return of this", sandboxcode('return this;', {window:"sanboxed code"})); 
// => Object {window: "sanboxed code"}

https://gist.github.com/alejandrolechuga/9381781


3
তুচ্ছ থেকে windowফিরে পেতে । sandboxcode('console.log((0,eval)("this"))')
রাই-

আমি জিনিসটা যে প্রতিরোধ কিভাবে করতে হবে
আলেহান্দ্রো

@alejandro আপনি কি এটি প্রতিরোধের জন্য কোনও উপায় খুঁজে পেয়েছেন?
উইল্ট করুন

1
আমার বাস্তবায়নটি কেবল যোগ করেছে:function sbx(s,p) {e = eval; eval = function(t){console.log("GOT GOOD")}; sandboxcode(s,p); eval =e}
YoniXw

2
@ ইয়নিএক্সডাব্লু: আমি আশা করি আপনি এটি কোনও কিছুর জন্য ব্যবহার করবেন না। এর মতো কোনও পন্থা কখনই কাজ করবে না। (_=>_).constructor('return this')()
রাই-

1

বিল্টিন ব্রাউজার বাস্তবায়নের ক্যাজড সংস্করণটির চেয়ে একটি স্বাধীন জাভাস্ক্রিপ্ট দোভাষীর শক্তিশালী স্যান্ডবক্স পাওয়া সম্ভব। রায়ান ইতিমধ্যে js.js উল্লেখ করেছে , তবে আরও একটি আপ-টু-ডেট প্রকল্প জেএস-ইন্টারপ্রেটারডক্স অনুবাদক করার জন্য বিভিন্ন ফাংশন এক্সপোজ কিভাবে ঢেকে, কিন্তু তার সুযোগ অন্যথায় খুবই সীমিত।


1

2019 সালের হিসাবে, ভিএম 2 দেখতে এই সমস্যার সর্বাধিক জনপ্রিয় এবং নিয়মিত আপডেট হওয়া সমাধানগুলির মত দেখাচ্ছে।


vm2 ব্রাউজারে রানটাইম সমর্থন করে না। আপনি যদি কোনও নোডেজ অ্যাপ্লিকেশনটিতে স্যান্ডবক্স কোড খুঁজছেন তবে এটি কাজ করা উচিত।
কেভিন.groot

0

সঙ্গে NISP আপনি স্যান্ডবক্সভুক্ত মূল্যায়ন করতে সক্ষম হবেন। যদিও আপনি যে এক্সপ্রেশনটি লিখছেন তা হ'ল জেএস নয়, পরিবর্তে আপনি এস-এক্সপ্রেশন লিখবেন। সাধারণ ডিএসএলগুলির জন্য আদর্শ যা ব্যাপক প্রোগ্রামিংয়ের দাবি করে না।


-3

1) ধরুন আপনার কার্যকর করার জন্য একটি কোড রয়েছে:

var sCode = "alert(document)";

এখন, ধরুন আপনি একটি স্যান্ডবক্সে এটি সম্পাদন করতে চান:

new Function("window", "with(window){" + sCode + "}")({});

মৃত্যুদন্ড কার্যকর করা হলে এই দুটি লাইন ব্যর্থ হবে, কারণ "সতর্কতা" ফাংশন "স্যান্ডবক্স" থেকে পাওয়া যায় না

2) এবং এখন আপনি উইন্ডো অবজেক্টের কোনও সদস্যকে আপনার কার্যকারিতা সহ প্রকাশ করতে চান:

new Function("window", "with(window){" + sCode + "}")({
    'alert':function(sString){document.title = sString}
});

প্রকৃতপক্ষে আপনি পালিয়ে থাকা উদ্ধৃতি যোগ করতে এবং অন্যান্য পোলিশ করতে পারেন, তবে আমার ধারণা ধারণাটি পরিষ্কার।


7
গ্লোবাল অবজেক্টে পৌঁছানোর জন্য কি অন্যান্য উপাখ্যান রয়েছে? উদাহরণস্বরূপ ফাংশন এর মধ্যে ফানক.এপ্লি ব্যবহার করে (নাল) "এটি" উইন্ডো অবজেক্ট হবে।
এমবরখাউ

5
প্রথম উদাহরণটি ব্যর্থ হয় না, এটি স্যান্ডবক্সিংয়ের একটি খুব অবৈধ উদাহরণ।
অ্যান্ডি ই

1
var sCode = "this.alert ('FAIL')";
লিওনার্ড পাওলি

-4

এই ব্যবহারকারী জাভাস্ক্রিপ্ট কোথা থেকে আসছে?

আপনার পৃষ্ঠায় কোনও ব্যবহারকারী এম্বেডিং কোড এবং তার ব্রাউজার থেকে এটিকে কল করার বিষয়ে আপনারা তেমন কিছু করতে পারবেন না (দেখুন গ্রিসমোনকি, http://www.greasespot.net/ )। এটি ব্রাউজারগুলি কেবল কিছু করে।

তবে, আপনি যদি স্ক্রিপ্টটি একটি ডাটাবেসে সঞ্চয় করেন, তবে এটি পুনরুদ্ধার করুন এবং এটি ()) লিখে ফেলুন, তবে স্ক্রিপ্টটি চালানোর আগে আপনি এটি পরিষ্কার করতে পারেন।

কোডের উদাহরণ যা সমস্ত উইন্ডো সরিয়ে দেয়। এবং নথি। রেফারেন্স:

 eval(
  unsafeUserScript
    .replace(/\/\/.+\n|\/\*.*\*\/, '') // Clear all comments
    .replace(/\s(window|document)\s*[\;\)\.]/, '') // removes window. or window; or window)
 )

এটি নিম্নলিখিতগুলি কার্যকর করা (পরীক্ষা করা হয়নি) রোধ করার চেষ্টা করে:

window.location = 'http://mydomain.com';
var w = window  ;

অনিরাপদ ব্যবহারকারী স্ক্রিপ্টে আপনাকে প্রয়োগ করতে হবে এমন অনেকগুলি সীমাবদ্ধতা রয়েছে। দুর্ভাগ্যক্রমে, জাভাস্ক্রিপ্টের জন্য কোনও 'স্যান্ডবক্স ধারক' উপলব্ধ নেই।


2
যদি কেউ কোনও সাধারণ রেইজেক্স দূষিত কিছু করার চেষ্টা করে তবে তা করতে পারে না - নিন (ফাংশন () (এটি ["লোকা" + "টিওন"] = " উদাহরণ ডটকম ";}) () সাধারণভাবে আপনি যদি আপনার ব্যবহারকারীদের বিশ্বাস করতে পারবেন না (যা এমন কোনও সাইটের ক্ষেত্রে যা নির্বিচারে লোকেরা সামগ্রী যুক্ত করতে পারে) সমস্ত জেএসকে ব্লক করা প্রয়োজনীয়।
olliej

আমি আগেও তেমন কিছু ব্যবহার করেছি। এটি নিখুঁত নয়, তবে এটি আপনাকে বেশিরভাগ পথেই পেয়ে যায়।
সুগেন্দ্রান

আসলে, আপনি যেমন একটি কৌশল সীমাবদ্ধতা সম্পর্কে সঠিক। <code> var উইন্ডো = নাল, ডকুমেন্ট = নাল, এই = {}; </code> এর মতো গ্লোবাল ভেরিয়েবল ওভাররাইটিং সম্পর্কে কীভাবে?
দিমিত্রি

ডিমিট্রি জেড, এই ভেরিয়েবলগুলিকে ওভাররাইট করার অনুমতি নেই [কিছু ব্রাউজারে]। উত্তরের তালিকায় আমার সমাধানটিও পরীক্ষা করে দেখুন - এটি কাজ করে।
সের্গেই ইলিনস্কি

-5

আমি ব্যবহারকারীদের আমার সাইটের জন্য অ্যাপলেট তৈরি করার জন্য একটি সরল জেএস স্যান্ডবক্সে কাজ করছি। যদিও আমি এখনও ডিওএম অ্যাক্সেসের অনুমোদনের সাথে কিছু চ্যালেঞ্জের মুখোমুখি হই (প্যারেন্টনোড কেবল জিনিসগুলিকে সুরক্ষিত রাখে না = /), তবে আমার দৃষ্টিভঙ্গি উইন্ডো অবজেক্টটিকে তার কিছু দরকারী / ক্ষতিকারক সদস্যের সাথে নতুনভাবে সংজ্ঞায়িত করার জন্য এবং তারপরে ব্যবহারকারীকে () প্রকাশ করা উচিত ডিফল্ট সুযোগ হিসাবে এই পুনরায় সংজ্ঞায়িত উইন্ডো সহ কোড।

আমার "মূল" কোডটি এইভাবে চলে ... (আমি এটি পুরোপুরি দেখছি না;)

function Sandbox(parent){

    this.scope = {
        window: {
            alert: function(str){
                alert("Overriden Alert: " + str);
            },
            prompt: function(message, defaultValue){
                return prompt("Overriden Prompt:" + message, defaultValue);
            },
            document: null,
            .
            .
            .
            .
        }
    };

    this.execute = function(codestring){

        // here some code sanitizing, please

        with (this.scope) {
            with (window) {
                eval(codestring);
            }
        }
    };
}

সুতরাং, আমি একটি স্যান্ডবক্স উদাহরণস্বরূপ করতে পারি এবং কোড চলমান পেতে এটির এক্সিকিউট () ব্যবহার করতে পারি। এছাড়াও, eval'd কোডের মধ্যে থাকা সমস্ত নতুন ঘোষিত ভেরিয়েবলগুলি শেষ পর্যন্ত মৃত্যুদন্ড () স্কোপকে আবদ্ধ হবে, সুতরাং সংঘর্ষের নাম বা বিদ্যমান কোডের সাথে বিশৃঙ্খলা থাকবে না।

যদিও বিশ্বব্যাপী অবজেক্টগুলি এখনও অ্যাক্সেসযোগ্য হবে, তাদের স্যান্ডবক্সযুক্ত কোডের অজানা থাকা উচিত স্যান্ডবক্স :: স্কোপ অবজেক্টে প্রক্সি হিসাবে সংজ্ঞায়িত করা উচিত।

আশা করি এটি আপনার পক্ষে কাজ করে।


8
এটি কিছুতেই স্যান্ডবক্স দেয় না। Evaled কোড সদস্যদের মুছে দিন এবং সার্বিক ব্যাপ্তি যে ভাবে পাওয়া, অথবা করে বিশ্বব্যাপী সুযোগ ghê একটি রেফারেন্স দখল করতে পারেন (ফাংশন () {এই আসতে;}) ()
মাইক স্যামুয়েল

-6

আপনি নিষিদ্ধ বস্তুগুলিকে পরামিতি হিসাবে পুনরায় সংজ্ঞায়িত করে এমন কোনও ফাংশনে ব্যবহারকারীর কোডটি মোড়তে পারেন - এগুলি undefinedতখন বলা হবে:

(function (alert) {

alert ("uh oh!"); // User code

}) ();

অবশ্যই, চালাক আক্রমণকারীরা জাভাস্ক্রিপ্ট ডিওএম পরিদর্শন করে এবং উইন্ডোতে একটি রেফারেন্স সম্বলিত একটি অ-ওভাররাইড হওয়া বস্তু সন্ধানের মাধ্যমে এটি ঘিরে ফেলতে পারে।


আর একটি ধারণা jslint এর মতো একটি সরঞ্জাম ব্যবহার করে ব্যবহারকারীর কোডটি স্ক্যান করছে । নিশ্চিত করুন এটির কোনও প্রিসেট ভেরিয়েবল (বা: কেবলমাত্র আপনি চান ভেরিয়েবলগুলি) সেট করার সেট রয়েছে এবং তারপরে যদি কোনও গ্লোবাল সেট বা অ্যাক্সেস করা থাকে তবে ব্যবহারকারীর স্ক্রিপ্টটি ব্যবহার করতে দেওয়া হবে না। আবার, ডিওএম হাঁটার পক্ষে অরক্ষিত হতে পারে - ব্যবহারকারীরা আক্ষরিক ব্যবহার করে নির্মান করতে পারে এমন বস্তুগুলির মধ্যে উইন্ডো অবজেক্টের অন্তর্নিহিত উল্লেখ থাকতে পারে যা স্যান্ডবক্স থেকে বাঁচতে অ্যাক্সেস করতে পারে।


2
যদি ব্যবহারকারী সরল সতর্কতার পরিবর্তে উইন্ডো.এলার্ট প্রবেশ করে তবে তারা এই সীমাটি বাইপাস করবে।
কোয়ান্টিন

@ ডরওয়ার্ড: হ্যাঁ, তাই "নিষিদ্ধ বস্তু"। ব্যবহারকারীকে কী কী জিনিস অ্যাক্সেস করার অনুমতি দেওয়া হচ্ছে না এবং সেগুলি প্যারামিটার তালিকায় রাখুন তা সিদ্ধান্ত নেওয়া উচিত un
জন মিলিকিন

উইন্ডোতে কেবল একটি অবজেক্ট রয়েছে। যদি আপনি এটিতে অ্যাক্সেস অবরুদ্ধ করেন না, তবে এর মাধ্যমে সমস্ত কিছুই উপলব্ধ। আপনি যদি এটি অবরুদ্ধ করে থাকেন তবে স্ক্রিপ্টটি তার বৈশিষ্ট্যগুলির কোনও কিছুই অ্যাক্সেস করতে পারে না (যেহেতু উইন্ডো.এলার্টের পরিবর্তে সতর্কতা বলার কারণে উইন্ডো বোঝায়))
কুইন্টিন

@ ডাউয়ার্ড: আপনি উইন্ডোটি ব্লক করবেন না এমন ঘটনা নয় aleআরার্ট কিন্তু সতর্কতা এখনও কাজ করবে, চেষ্টা করে দেখুন। এটি কারণ উইন্ডোটিও বিশ্বব্যাপী অবজেক্ট। একটিকে উইন্ডো এবং যে কোনও সম্পত্তি বা উইন্ডোটির কোনও পদ্ধতি আপনি ব্যবহারকারীর কোডটি অ্যাক্সেস করতে চান না তা ব্লক করতে হবে।
অ্যান্থনিডব্লু জোন্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.