سؤال

أنا أعمل على مشروع php وأريد تشغيل التعليمات البرمجية التي جلبها من قاعدة بيانات MySQL.ليس هناك فرصة تعليمات برمجية غير آمنة حقنها ، لذلك الشيء الوحيد الذي يقلقني هو الفهرسه.يجب استخدام eval() لذا يمكن تشغيلها مباشرة الكود أو تحليل ذلك أن call_user_func() يعمل بدلا من ذلك ؟

على سبيل المثال, إذا كان رمز الاحتمال الأول كان "myfunc(1,2,3);anotherFunc(3,2,1);"
أنا يمكن أن eval() مباشرة إلى تشغيل التعليمات البرمجية.

ولكن call_user_func () لكنت تحليل السلسلة بحيث يمكن ركض.ذلك الذي هو وظيفة أفضل استخدام في هذه الحالة ؟

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

المحلول

وكقاعدة عامة، أنا دائما في محاولة للبقاء بعيدة عن وحدة التقييم () وقت ممكن. هذه الحالة، ومع ذلك، يبدو وكأنه مرشح جيد لذلك.

وأنت تقول <م> "ليس هناك فرصة من التعليمات البرمجية غير آمنة حقنها" ، وبالتالي فإن السؤال الكبير هو: هل هناك فرصة للunworking كود يجري في قاعدة البيانات

إذا لم يكن كذلك، وحدة التقييم () هو الحل، ولكن إذا كان هناك ثم السليم تحليل والخطأ تسجيل / الخ قد يكون رهان أكثر أمانا. (أعتقد باستخدام call_user_func_array () هو أسرع من الناحية النظرية، لذلك أي النفقات العامة الاعراب قد تصبح تافهة)

نصائح أخرى

تخزين PHP في قاعدة البيانات تصميم سيئة الرائحة في نفسه ؛ حتى وإن كان في هذه الحالة أنت متأكد من أنه لا يمكن أبدا أن تحتوي على تعليمات برمجية غير آمنة, فمن الجيد دائما للتقليل من عدد من الافتراضات أو الدفاعات مثل التي لديك لجعل.إذا قمت بتخزين كود PHP في قاعدة البيانات, ثم الهجوم التي مهاجم مكاسب الوصول إلى قاعدة البيانات الخاصة بك بسرعة ويصبح أكثر خطورة تحول إلى هجوم في أي مهاجم يمكن تشغيل تعليمات برمجية عشوائية!أنا أعرف أن وجود قاعدة البيانات الخاصة بك للخطر مثل هذا من المستبعد جدا, ولكن مع ذلك هو جيد الممارسات الأمنية عدم السماح حتى من غير المحتمل الوضع بخرق النظام الخاص بك أكثر من يحتاج إليه.

يتفق كثير من الناس أن eval() ينبغي دائما دون استثناء تجنبها في كود PHP.هناك دائما بديل.

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

وأود أن يوصي هذا

  1. محاولة التحقق من صحة التعليمات البرمجية قبل eval () ، قبل أن تكون متحفظة في ما تسمح.نفترض أن بطريقة أو بأخرى مهاجم حصلت على في قاعدة البيانات الخاصة بك حتى يعتقد أن من غير المرجح.
  2. يمكنك على الأقل أن تعطي بعض التفكير الجدي في إعادة كتابة التطبيق الخاص بك بحيث رمز PHP يتم تخزينها في قاعدة البيانات.إذا كنت تخزين هياكل البيانات المعقدة ، التفكير في شيء مثل JSON أو حتى XML بدلا من ذلك.آمنة موزعي توجد هذه.

أنا آسف إذا كان هذا الجواب يبدو قليلا رجعية;أنا فقط يحدث أن يشعر هذا النوع من شيء مهم جدا.

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

وحظا سعيدا!

استخدم وحدة التقييم (). أي شيء آخر هو لا يستحق كل هذا الجهد - فإنها ليس لديها أي آثار جانبية إيجابية

وقد ترغب في إلقاء نظرة على امتداد runkit ، والتي يمكن تنفيذ فب في رمل لا المؤثرة رمز التوالي.

إذا افترض رمز لإحداث تشغيل التعليمات البرمجية الخاصة بك، انتقل لوحدة التقييم ().

ويجب التفاف التعليمات البرمجية كنت على وشك أن يتم تشغيله في كتلة حاول / catch جدا، في حالة وجود خطأ (حتى ولو كنت وقال هناك لن يكون، هناك احتمال، وأنه هو أفضل الممارسات)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top