سؤال

أواجه مشكلة في فهم لماذا جافا آمنة الترميز هو المهم.على سبيل المثال, لماذا من المهم أن يتم تعريف المتغيرات خاص ؟ يعني أنا الحصول على أنها سوف تجعل من المستحيل الوصول إلى تلك المتغيرات من خارج الطبقة ، ولكن يمكنني ببساطة فك الصف للحصول على قيمة.وبالمثل ، فإن تحديد الدرجة النهائية سوف تجعل من المستحيل فرعية هذه الفئة.متى subclassing فئة تكون خطرا على الأمن ؟ مرة أخرى إذا لزم الأمر, يمكن فك الطبقة الأصلية و reimplement مع أيا كان الشيفرات الخبيثة يمكن أن تريد.المشكلة تأتي عندما التطبيقات "ثقة" من قبل المستخدم ؟ و الناس ثم يمكن أن تعاطي هذه الثقة بطريقة أو بأخرى ؟ أساسا ما أبحث عنه هو مثال جيد لماذا ترميز آمن التوجيهية التي ينبغي اتباعها.

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

المحلول

والبرمجة صعبة.

إذا قمت بتعريف واجهات برمجة التطبيقات الصارمة، التي لا تعرض المتغيرات التي ليس من المفترض أن تتعرض (نحب أن نطلق هذا <وأ href = "http://en.wikipedia.org/wiki/Encapsulation_٪28computer_science٪29 "يختلط =" نوفولو noreferrer "> التغليف )، التي تساعد مستخدمي واجهات برمجة التطبيقات الخاصة بك، وبالتالي جعل البرمجة أسهل. ويعتبر هذا شيء جيد.

والأسباب ليست في المقام الأول "الأمن"، كما هو الحال في حفظ الأشياء السرية سرا، بقدر من الوضوح والبساطة والفهم.

وعلى سبيل المكافأة، أنه من الأسهل بكثير لجعل الأشياء تعمل بشكل صحيح إذا كان يمكنك معرفة أن المستخدم من API لا يتغير "بك" المتغيرات وراء ظهرك، بطبيعة الحال.

نصائح أخرى

وومن "آمنة" وهذا يعني أن العمل الداخلي الطبقة مخفية لمن يستخدمه.

ويستخدم مصطلح آمن لا تستخدم كما في "تأمين الخادم" أن ينوي كون المستخدم من فئة واحدة لا داعي للقلق حول كيفية الطبقة سوف تؤدي المهمة التي يريد أن.

وأخذ المثال الخاص بك:

وكشف متغيرات فئة من شأنه أن يسمح للمستخدم لمعرفة صفك من الوجود، والتي هي شيء كنت لا تريد، على سبيل المثال: كنت مجرد الضغط على زر لتشغيل ضوء، لا تحتاج إلى الآن أن الداخل هو هناك النحاس أو whater التي يحتاجها لأداء هذه المهمة.

وجافا هو كائنية التوجه الناطقة البرمجة ، واحدة من المفاهيم الرئيسية في البرمجة كائنية التوجه هو التغليف .

والفكرة وراء التغليف هي "الاختباء بعيدا" تفاصيل التنفيذ مثل المتغيرات الداخلية التي تحمل حالة الكائن وأساليب العمل الداخلية مثل الخوارزميات، وتوفير سوى واجهة التي يمكن استخدامها غيرها من الأشياء من أجل أداء وظائف مع الكائن.

<ع> استخدام هذا المفهوم، فإن للمرء أن ترغب في إخفاء الدول الداخلية باستخدام متغيرات private لمنع كائنات أخرى من التأثير بشكل مباشر على الدول الداخلية. في جاوة، ومن الشائع أن نرى حاصل على واضعي (مثل getColor وsetColor) من أجل العمل مع الكائنات.

وكذلك التغليف يمكن أن تزيد من متانة متاحة أيضا.

وعلى سبيل المثال، عن طريق تقييد الوصول إلى الولايات الداخلية، سيكون من الممكن لأداء بعض الشيكات التعقل قبل تغيير كائن.

وكمثال الصلبة، ويقول كان هناك كائن Score التي كان من المقرر لها قيمة percent بين 0 و100. من خلال توفير وسيلة setPercent(int) وهو ما يؤكد أن القيمة المحددة كانت ضمن النطاق المسموح به، فإنه منع الكائن Score من يتم تعيين إلى حالة غير مقبولة.

وهكذا، في محاولة للتلاعب بشكل مباشر على الحالة الداخلية من خلال كتابة عبارة مثل score.percent = 150 يمكن تجنبها، إذا تسبب طريقة setPercent خطأ أو يطرح Exception إذا كانت القيمة المحددة غير مقبولة.

وهناك نوعان من القضايا هنا.

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

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

وعلى سبيل المثال، إذا كان لديك مربع فئة مع getArea وظيفة المحمية ()، تتوقع للعودة إلى مساحة مربع. ومع ذلك، يمكن أن تكون فئة جديدة التي تمتد مربع، ويقول الدرجة مستطيل يمتد مربع. الآن rectange يمكن تجاوز getArea ()، لكنه لا يزال من نوع مربع، والتي قد كسر شيء والتي تعتمد على هذه الوظيفة من الساحة. بجعل نهائي صفك كنت تؤكد على أن هذا لا يمكن أن تحدث في النظام الخاص بك.

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

وفقط لإضافة للآخرين ما سبق قال: بعض من هذه الميزات يمكن أيضا ببساطة أن ينظر إليه باعتباره وسيلة لتذكر تنوي. إذا قمت بعمل private عضو I جعله "المستحيل" من أجل الآخرين للوصول إليه (من الممكن، ولكن هذا بالإضافة إلى نقطة هنا)، ولكن الأهم من ذلك أقول للمستخدمين أن هذا هو تفصيل تطبيق، وأنها لا ينبغي أن تعتمد على .

وتخيل فقط لو كائن لديه خاصية الداخلية وهي ليست خاصة (الخفية) والتعليمات البرمجية الوصول إلى هذه الخاصية يحدث ليتم تشغيلها في بيئة خاصية تعدد، لذلك N أن المواضيع تبدأ في الوصول إليها في وقت واحد، فإن 5 المواضيع ترغب في تغيير هذه الخاصية (4)، للقراءة. لا توجد وسيلة لك تأكد من الأمور سيتم تشغيل بدقة، سوف لا موضوع معرفة أي البيانات التي تحتفظ بها في الوقت الراهن، وأنه لم يتغير خاصية هذا الكائن بنجاح.

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

وباختصار، كنت في مشكلة كبيرة، والتصحيح هو كابوس منذ كنت لا تعرف عندما تم chagned البيانات، التي لم ترابط، من حيث وقد حدث الخ.

واحد فقط سيناريو ما يحدث إذا لم يكن لتغليف ...

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

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

جافا هناك اثنين من أبرز أدلة:

في جاوة هناك نوعان من وسائط متميزة من آمن الترميز.

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

أكثر شيوعا كنت تتعامل مع البرامج التي تتعامل مع البيانات غير موثوق بها.على سبيل المثال, خوادم الويب (اعتقد XSS و SQL injection) و تطبيقات سطح المكتب برامج التعامل مع الملفات غير موثوق بها (عادة ما تكون المشكلة في التعليمات البرمجية C وجود تجاوزات المخزن المؤقت - حقيقية C++ هو أفضل).في بعض حالات الحرمان من الخدمة (دوس) يمكن أن تكون قضية شديدة.

هناك بعض التداخل.فعلى سبيل المثال المترجمين تشغيل مع أذونات مترجم رمز و قد تكون "قوية".

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