Eval هو الشر... فماذا يجب أن تستخدم بدلا من ذلك ؟

StackOverflow https://stackoverflow.com/questions/646597

  •  22-07-2019
  •  | 
  •  

سؤال

وهو طلب اياكس ترجع لي القياسية JSON مجموعة مليئة المستخدم المدخلات.المدخلات تم تطهير باستخدام eval() وظيفة ، أنا يمكن بسهولة إنشاء كائن جافا سكريبت و تحديث الصفحة...

لذا هنا تكمن المشكلة.بغض النظر عن مدى صعوبة محاولة تطهير المدخلات أنا لا أحبذ استخدام eval() وظيفة.لقد تحققت جوجل عن طرق استخدام "سلمان في اياكس دون eval" و قد ركض عبر مجموعة من الطرق المختلفة...

والتي يجب أن تستخدم ؟ هل هناك معيار ، ثبت-وسيلة آمنة للقيام بذلك ؟

هل كانت مفيدة؟

المحلول

وjson.org لديها لطيفة rel="noreferrer">

واستخدام بسيط:

JSON.parse('[{"some":"json"}]');
JSON.stringify([{some:'json'}]);

تعديل : في وكما أشار في تصريحات، وهذا يستخدم حدة التقييم اذا نظرتم من خلال مصدره (على الرغم من أنه يتطلع إلى أن يكون مطهرة لأول مرة)

لتجنب ذلك تماما، والنظر في json_parse أو <وأ href = "HTTP: // code.google.com/p/json-sans-eval/ "يختلط =" noreferrer "> سلمان-بلا-وحدة التقييم

وjson2.js غير آمنة، json_parse.js بطيء، سلمان-بلا-eval.js غير قابلة التحقق

نصائح أخرى

<اقتباس فقرة>   

هل هناك معيار، وثبت آمن طريقة للقيام بذلك؟

وهناك طريقة المقترحة القياسية للقيام بذلك، في المقبل ECMAScript الإصدار 3.1 من جافا سكريبت: <لأ href = "http://wiki.ecmascript.org/doku.php؟id=es3.1:json_support" يختلط = "noreferrer"> JSON.parse .

وسيتم دعم ذلك في IE8، فايرفوكس 3.1 / 3.5 وعلى الأرجح المتصفحات الشعبية الأخرى في المستقبل. في غضون ذلك، هل يمكن أن تقع مرة أخرى إلى، أو استخدام حصرا، وحدة التقييم (). الشر فإنه قد أو قد لا يكون؛ بالتأكيد سيكون أبطأ من JSON.parse. ولكن هذه هي الطريقة المعتادة لتحليل JSON اليوم.

إذا مهاجم قادر على ضخ جافا سكريبت malcious إلى المحتوى الذي بصق عبر JSON، لديك مشاكل أكبر ما يدعو للقلق من حدة التقييم هو بين الشر.

وأود أن أقول، بمجرد مطهرة المدخلات، وحدة التقييم هو أفضل وسيلة للذهاب. إذا كان يحصل على الخادم الخاص بك للخطر، والناس سوف تكون قادرة على إرسال وأيا البرامج النصية التي تريد العميل على أي حال. لذلك وضع وحدة التقييم ليس خطرا أمنيا كبيرا. إذا كنت قلقا حول الناس التلاعب الحزم قبل أن تصل إلى العميل ثم، مرة أخرى، مخطوطات يمكن تعديلها بأنفسهم.

لا تقلق بشأن وحدة التقييم. ولكن تأكد من أن التفاف عليه في محاولة ... كتلة التقاط بحيث يمكن للمستخدمين الخاص لا يحصلون على أخطاء JS إذا كان يحصل المهترئ JSON الخاص بك.

:)

لتحويل بأمان JSON إلى كائن JS يجب عليك استخدام محلل JSON مثل وظيفة JSON.parse () المقدمة من قبل <وأ href = "https://github.com/douglascrockford/JSON-js/blob/master /json2.js "يختلط =" نوفولو noreferrer "> هذه المكتبة .

مقارنة الأوامر نمط التصميم: http://en.wikipedia.org/wiki/Command_pattern.ونظرا لهذا, يمكنك أن تحدد بدقة العمليات يمكن للعميل تنفيذ التطبيق الخاص بك سوف تكون آمنة قدر الأساسية التفسير.

ويعتمد على ما كنت تحاول إنجاز مع الصرف الصحي. لقد كان نجاحا كبيرا ث / النموذج دعم الإطار لJSON وتقييم آمن.

إذا كنت متأكدا هناك أي خطر الحقن، وكنت لا eval()ing في حلقة، ثم استخدم eval(). وسوف تضاهي إلى الخيارات الأخرى التي ستكون بالتأكيد أبطأ، قد كسر، وسوف تتطلب العميل لتحميل برمجية إضافية.

و"مسروقة" من مسج

// Try to use the native JSON parser first
return window.JSON && window.JSON.parse ?
    window.JSON.parse( data ) :
    (new Function("return " + data))();

المسألة: المشكلة eval يطرح هو أنه ينفذ في نطاق عالمي

eval.call(document, "console.log(this)")
eval.call(navigator, "console.log(this)")
eval.call(window, "console.log(this)")
(function(){eval.call(document, "console.log(this)")})()
>Window

السيناريو:

تفترض كنت تستخدم المهارات الفردية في العلامات رمز من مختلف الوثيقة-عناصر مثل سمة onvisible

<img src="" onvisible="src='http://www.example.com/myimg.png';">

كنت ترغب في الحصول على جميع العناصر مع هذه السمة ، وتحويل onvisible-المحتوى-سلسلة إلى الإغلاق ووضعها EventHandler الانتظار.هذا هو المكان شبيبة وظيفة منشئ يأتي دور.

Function === 0..constructor.constructor
>true

Function('return [this, arguments]').call(window, 1,2,3)
>Window, Arguments[3]]
Function('return [this, arguments]').call(document, 1,2,3)
>Document, Arguments[3]]
Function('return [this, arguments]').call(navigator, 1,2,3)
>Navigator, Arguments[3]]    

وضع كل ذلك معا:

var eventQueue = [];
var els = document.querySelectorAll('[onvisible]');

for (var el in els) {
    var jscode = els[el].getAttribute('onvisible');
    eventQueue.push( {el:els[el], cb:Function(jscode)} )
}

//eventQueue[0].cb.call(scope, args);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top