معهد ماساتشوستس للتكنولوجيا. محاضرة رقم 6.858. "أمن أنظمة الكمبيوتر." نيكولاي زيلدوفيتش ، جيمس ميكنز. 2014 سنة
أمان أنظمة الكمبيوتر هي دورة حول تطوير وتنفيذ أنظمة الكمبيوتر الآمنة. تغطي المحاضرات نماذج التهديد ، والهجمات التي تهدد الأمن ، وتقنيات الأمان بناءً على العمل العلمي الحديث. تشمل الموضوعات أمان نظام التشغيل (OS) ، والميزات ، وإدارة تدفق المعلومات ، وأمان اللغة ، وبروتوكولات الشبكة ، وأمان الأجهزة ، وأمان تطبيقات الويب.
المحاضرة 1: "مقدمة: نماذج التهديد"
الجزء 1 /
الجزء 2 /
الجزء 3المحاضرة 2: "السيطرة على هجمات القراصنة"
الجزء 1 /
الجزء 2 /
الجزء 3المحاضرة 3: "تجاوزات العازلة: المآثر والحماية"
الجزء 1 /
الجزء 2 /
الجزء 3المحاضرة 4: "فصل الامتيازات"
الجزء 1 /
الجزء 2 /
الجزء 3المحاضرة 5: "من أين تأتي أنظمة الأمن؟"
الجزء 1 /
الجزء 2المحاضرة 6: "الفرص"
الجزء 1 /
الجزء 2 /
الجزء 3المحاضرة 7: "وضع حماية العميل الأصلي"
الجزء 1 /
الجزء 2 /
الجزء 3المحاضرة 8: "نموذج أمن الشبكات"
الجزء 1 /
الجزء 2 /
الجزء 3المحاضرة 9: "أمان تطبيق الويب"
الجزء 1 /
الجزء 2 /
الجزء 3 على سبيل المثال ، سيأخذ Django أقواس الزاوية هذه ، ويترجمها إلى شكل HTML ، ويعيد بقية الأحرف. بمعنى ، إذا كانت قيمة الاسم المخصص تحتوي على أقواس زاوية ، وعلامات اقتباس مزدوجة ، وما شابه ، فسيتم استبعاد كل هذه الأحرف. سيجعل المحتوى لا يتم تفسيره على أنه رمز HTML على جانب متصفح العميل.

لذا نحن نعلم الآن أن هذا ليس دفاعًا موثوقًا به للغاية ضد بعض هجمات البرمجة النصية عبر المواقع. السبب ، كما أوضحنا في المثال ، هو أن هذه القواعد النحوية لـ HTML ، و CSS و JavaScript معقدة للغاية بحيث يمكن بسهولة الخلط بين محلل المتصفح.
على سبيل المثال ، لدينا شيء شائع جدًا يتم القيام به في إطار Django. لذا ، لديك بعض وظائف div ، ونريد تعيين فئة ديناميكية لها. نعطي الفصل قيمة var ، وهكذا دواليك. الفكرة هي أنه عندما يعالج Django هذا ، يحتاج إلى معرفة النمط الحالي ثم لصقه هنا.
في هذه الحالة ، يمكن للمهاجم إنشاء سلسلة تحدد هذه الفئة ، على سبيل المثال ، يكتب "class 1". كل شيء يسير على ما يرام حتى هذه اللحظة ، لأنه يبدو وكأنه تعبير CSS صالح.
ولكن بعد ذلك يقوم المهاجم بوضع عامل onclick هنا ، وهو ما يعادل رمز JavaScript الذي يجعل استدعاء النظام.

نظرًا لأن هذا خطأ ، يجب أن يتوقف المتصفح هنا. ولكن المشكلة هي أنه إذا شاهدت HTML من قبل لصفحة ويب حقيقية ، فإن كل شيء يكون مكسورًا ومربكًا ، حتى بالنسبة للمواقع "الصديقة" الشرعية. لذلك إذا توقف المتصفح قبل كل تعبير HTML خاطئ ، فلن يعمل موقع واحد تحبه ببساطة. إذا كنت تريد أن تشعر بخيبة أمل في العالم ، ولم أساعدك بما يكفي ، فقط افتح وحدة تحكم جافا سكريبت في متصفحك عند عرض الموقع لمعرفة عدد الأخطاء التي ستسببها لك.
يمكنك ، على سبيل المثال ، الانتقال إلى CNN ومعرفة عدد الأخطاء التي تحصل عليها. نعم ، تعمل CNN بشكل أساسي ، ولكن بشكل غير متساوٍ. على سبيل المثال ، لفتح برنامج Acrobat Reader ، تحتاج باستمرار إلى وضع استثناءات مؤشر فارغة ، وفي الوقت نفسه ستشعر بخداع الحياة قليلاً. لكننا تعلمنا على الإنترنت قبول ذلك دون الكثير من السخط.
لذلك ، نظرًا لأن المتصفحات يجب أن تكون متسامحة جدًا مع هذه الأشياء ، فستحاول تحويل الشفرة الضارة إلى شيء يبدو معقولًا بالنسبة لها. وهذه هي الثغرة الأمنية.
هذه هي الطريقة التي يعمل بها تطهير المحتوى ، ولا يزال أفضل من لا شيء. يمكنها التقاط الكثير من الأشياء الضارة ، لكنها لا تستطيع الدفاع عن نفسها من كل شيء.
هناك شيء آخر يجب التفكير فيه - استخدام لغة ترميزية أقل تعبيرًا. دعونا نرى ما هو المقصود.
الجمهور: ماذا أفعل إذا لم ينجح تنظيف المحتوى؟
البروفيسور: نعم ، هذا ممكن ، على سبيل المثال ، في هذه الحالة لن تتمكن Django من تحديد أنها سيئة. على سبيل المثال ، في هذه الحالة بالذات. ولكن في حالة إدراج علامة صورة ضارة ...
الجمهور: في هذه الحالة بالذات ، أتوقع أن يكون تعيين الصف ضمن علامات اقتباس وفي هذه الحالة يجب ألا يكون له أي تأثير ...
البروفيسور: حسنًا ، كما ترى ، هناك حيل صغيرة. بافتراض أن قواعد HTML و CSS محددة بدقة ، يمكنك أن تتخيل عالماً يستطيع فيه المحللون المثاليون التقاط هذه المشكلات بطريقة أو بأخرى أو تحويلها بطريقة أو بأخرى إلى أشياء عادية. ولكن في الواقع ، فإن قواعد HTML وقواعد CSS تعاني من عدم الدقة. بالإضافة إلى ذلك ، لا تطبق المستعرضات المواصفات. لذلك ، إذا كنت تستخدم قواعد أقل تعبيرًا ، فسيكون من الأسهل بالنسبة لنا تطهير المحتوى.
هنا يتم استخدام المصطلح Markdown - "ترميز سهل القراءة" بدلاً من المصطلح Markup - الترميز العادي. تتمثل الفكرة الرئيسية لـ Markdown في أنها مصممة كلغة تسمح ، على سبيل المثال ، للمستخدمين بنشر التعليقات ، ولكنها لا تحتوي على القدرة على استخدام علامة فارغة ودعم التطبيق الصغير وما شابه. لذلك ، في Markdown ، من الأسهل في الواقع تحديد القواعد النحوية بشكل فريد ثم تطبيقها فقط.

التطهير أسهل بكثير في لغة بسيطة منه في HTML و CSS و JavaScript. وبطريقة ما ، هذا يشبه الفرق بين فهم كود C وكود Python. هناك فرق كبير في فهم لغة أكثر تعبيرا. لذلك ، من خلال الحد من التعبيرية ، غالبًا ما تحسن السلامة.
للحماية من هجمات البرمجة النصية عبر المواقع ، يتم أيضًا استخدام CSP وسياسة أمان المحتوى. فكرة CSP هي أنه يسمح لخادم الويب ...
الجمهور: أشعر بالفضول لمعرفة المزيد عن لغة التخفيض هذه. هل جميع المتصفحات قادرة على أداء تحليل اللغة؟
الأستاذ: لا ، لا ، لا. يمكنك ببساطة تحويل أنواع مختلفة من اللغات إلى HTML ، لكن المتصفحات لا تفهمها في شكلها الأصلي. وبعبارة أخرى ، لديك نظام تعليق ويستخدم Markdown. أي ، التعليقات ، قبل عرضها على الصفحة ، انتقل إلى مترجم Markdown ، الذي يترجمها إلى تنسيق HTML.
الجمهور: فلماذا لا تستخدم Markdown دائمًا؟
البروفيسور: Markdown يسمح لك باستخدام HTML المضمن ، وعلى حد علمي ، هناك طريقة لتعطيله في المترجم. ولكن قد أكون مخطئا في ذلك. الحقيقة هي أنه ليس من الممكن دائمًا استخدام لغة محدودة ، ولا يريد الجميع القيام بذلك.
لذا ، دعنا نواصل المناقشة حول كيفية زيادة الأمان بمساعدة سياسة أمان المحتوى. تسمح هذه السياسة للخادم بإخبار متصفح الويب بأنواع المحتوى التي يمكن تحميلها على الصفحة التي يرسلها ، وكذلك من أين يجب أن يأتي هذا المحتوى.
على سبيل المثال ، في استجابة HTTP ، قد يستخدم الخادم شيئًا من هذا القبيل: فهو يتضمن رأس المحتوى - الأمان - السياسة ، والمصدر الافتراضي هو ذاتي وسيستقبل البيانات من * .mydomain.com.

من خلال عامل التشغيل الذاتي ، يشير الخادم إلى أن المحتوى من هذا الموقع يجب أن يأتي فقط من نطاق صفحة معينة أو أي نطاق فرعي من mydomain.com. هذا يعني أنه إذا كان لدينا ربط ذاتي لـ foo.com ، فإن الخادم سيرسل هذه الصفحة مرة أخرى إلى المتصفح.
لنفترض أن هجومًا بالبرمجة النصية عبر المواقع يحاول إنشاء رابط لموقع bar.com. في هذه الحالة ، سيرى المتصفح أن bar.com ليس ذاتيًا وليس نطاقًا من نطاق mydomain.com ، ولن يتخطى هذا الطلب أكثر. هذه آلية قوية جدًا حيث يمكنك تحديد عناصر تحكم أكثر تفصيلاً. يمكنك تعيين معلمات تشير إلى أن صورك يجب أن تأتي من مثل هذا المصدر ومثل هذه ، والنصوص البرمجية من هذا وما إلى ذلك. إنه مناسب بالفعل.
بالإضافة إلى ذلك ، تمنع هذه السياسة في الواقع جافا سكريبت المضمنة ، لذا لا يمكنك فتح العلامة وكتابة نوع من النص البرمجي وإغلاق العلامة ، لأن كل ما يمكن أن يدخل إلى المتصفح يجب أن يأتي فقط من مصدر شرطي. يمنع CSP الأشياء الخطيرة مثل استخدام الوسيطة للدالة Eval () ، والتي تسمح لصفحة الويب بتنفيذ تعليمات JavaScript البرمجية التي يتم إنشاؤها ديناميكيًا. لذلك إذا تم تعيين رأس CSP ، فلن يقوم المستعرض بتنفيذ ().
الحضور: هل كل CSP يحمي من؟
الأستاذ: لا. هناك قائمة كاملة من الموارد التي تحميها بالفعل ، ويمكنك تكوين الحماية ضد العديد من الأشياء غير المرغوب فيها ، على سبيل المثال ، تحديد المكان الذي يسمح فيه بقبول CSS الصادر ومجموعة من الأشياء الأخرى.
الجمهور: ولكن إلى جانب التقييم () ، هناك أشياء أخرى تهدد الأمن؟
الأستاذ: نعم ، إنهم موجودون. لذلك ، يطرح السؤال دائمًا عن اكتمال الحماية. لذا ، على سبيل المثال ، لا يمكن فقط للتقييم إنشاء شفرة JavaScript ديناميكيًا. هناك أيضًا مُنشئ للوظائف ، وهناك طرق معينة لاستدعاء مهلة معينة ، وتذهب إلى السطر ويمكنك تحليل الكود بهذه الطريقة. يمكن لـ CSP تعطيل جميع ناقلات الهجوم الخطيرة هذه. لكن هذه ليست حلا سحريا للعزل الكامل للمآثر الخبيثة.
الجمهور: هل صحيح أنه يمكن تكوين CSP لمنع التحقق من كافة البرامج النصية الداخلية على الصفحة؟
البروفيسور: نعم ، إنه يساعد على منع تنفيذ التعليمات البرمجية التي تم إنشاؤها ديناميكيًا ، بينما يجب تجاهل التعليمات البرمجية المضمنة. يجب أن يحصل المتصفح دائمًا على الرمز من سمة المصدر. في الواقع ، لا أعرف ما إذا كانت جميع المتصفحات تفعل ذلك. تظهر التجربة الشخصية أن المتصفحات تظهر سلوكيات مختلفة.
بشكل عام ، يعد أمان الإنترنت شبيهًا بالعلوم الطبيعية ، لذلك طرح الناس نظريات حول كيفية عمل المتصفحات. ثم ترى كيف يحدث هذا بالفعل. وقد تخيب الصورة الحقيقية ، لأننا علمنا أن هناك خوارزميات وأدلة وما شابه ذلك. لكن هذه المتصفحات تتصرف بشكل سيئ للغاية بحيث لا يمكن التنبؤ بنتائج عملها.
يحاول مطورو المتصفح أن يكونوا متقدمين على المهاجمين ، وفي المحاضرة سترى أمثلة على ذلك. في الواقع ، CSP شيء رائع.
شيء آخر مفيد هو أنه يمكن للخادم تعيين رأس HTTP يسمى X-Content-Type-Options ، قيمته nosniff.

يمنع هذا الرأس MIME من تجاهل الاستجابة من نوع المحتوى المعلن عنه ، حيث يخبر الرأس المتصفح بعدم تجاوز نوع محتوى الاستجابة. باستخدام خيار nosniff ، إذا قال الخادم أن المحتوى هو text / html ، فسيعرضه المستعرض كنص / html.
ببساطة ، يمنع هذا الرأس المتصفح من "استنشاق" الاستجابة من نوع المحتوى المعلن بحيث لا يحدث الموقف عندما يقول المتصفح: "نعم ، شممت عدم تطابق بين امتداد الملف والمحتوى الفعلي ، لذلك سأحول هذا المحتوى إلى بعض المفاهيم الأخرى المفهومة لي شيء ". اتضح أنك فجأة أعطت البرابرة مفاتيح المملكة.
لذلك ، من خلال تعيين هذا الرأس ، فأنت تطلب من المتصفح ألا يفعل أي شيء من هذا القبيل. هذا يمكن أن يخفف إلى حد كبير من آثار أنواع معينة من الهجمات. فيما يلي نظرة عامة موجزة على بعض الثغرات في هجمات البرمجة النصية عبر المواقع.
الآن دعونا نلقي نظرة على ناقل هجوم شعبي آخر - SQL. ربما سمعت عن هجمات تسمى "إدخال SQL" أو هجوم إدخال SQL. جوهر هذه الهجمات هو استخدام قاعدة بيانات الموقع. لإنشاء الصفحة المعروضة للمستخدم ديناميكيًا ، يتم إصدار استعلامات قاعدة البيانات التي يتم إصدارها لهذا الخادم الداخلي. تخيل أن لديك طلبًا لتحديد جميع القيم من جدول محدد ، حيث يساوي حقل معرف المستخدم ما يتم تحديده على الإنترنت من مصدر غير موثوق به.

نعلم جميعًا كيف ستنتهي هذه القصة - ستنتهي بشكل سيئ للغاية ، ولن يكون هناك ناجون. لأن ما يأتي من مصدر لم يتم التحقق منه يمكن أن يسبب الكثير من المتاعب. بدلاً من ذلك ، يمكنك إعطاء سلسلة معرف المستخدم القيمة التالية: معرف المستخدم = “0؛ حذف الجدول ".
إذن ماذا سيحدث هنا؟ بشكل أساسي ، ستقول قاعدة بيانات الخادم: "حسنًا ، سأعيِّن معرّف المستخدم على صفر ، ثم سأنفذ أمر" حذف جدول "." وهذا كل شيء ، لقد انتهيت!
يقولون أنه قبل عامين ظهرت صورة فيروسية معينة. قام بعض الأشخاص في ألمانيا بتثبيت لوحات على السيارات ، كتب عليها صفر. حذف الجدول. كانت الفكرة هي أن كاميرات الطريق تستخدم التعرف الضوئي على الحروف للتعرف على رقمك ، ثم وضع هذا الرقم في قاعدة البيانات. بشكل عام ، قرر سكان فولكسفاغن استغلال هذه الثغرة الأمنية بوضع كود خبيث على أرقامهم.
لا أعرف إذا كان هذا يعمل لأنه يبدو مضحكًا. ولكن أود أن أصدق أن هذا صحيح. لذا أكرر مرة أخرى - فكرة التطهير هي منع تنفيذ المحتوى من مصادر غير موثوقة على موقعك.

لذلك ، انتبه إلى حقيقة أنه قد تكون هناك بعض الأشياء البسيطة التي لا تعمل كما ينبغي. لذا ، قد تعتقد: "حسنًا ، لماذا لا يمكنني فقط وضع اقتباس آخر في بداية السطر وآخر في النهاية لاستبعاد تنفيذ التعليمات البرمجية الخبيثة للمهاجم بين علامات اقتباس ثلاثية"؟
معرف المستخدم = "" + معرف المستخدم + ""
لكن هذا لن ينجح ، لأن المهاجم يمكنه دائمًا وضع علامات اقتباس داخل سلسلة الهجوم. لذلك ، في معظم الحالات ، لن يجلب لك هذا "نصف القرصنة" قدرًا من الأمان كما تتوقع.
الحل هنا هو أنك تحتاج إلى تشفير بياناتك بعناية. ومرة أخرى أكرر أنه عندما تتلقى معلومات من مصدر غير موثوق به ، فلا تدخله في النظام بالشكل الذي تكون فيه. تأكد من أنه لا يمكنه القفز من وضع الحماية إذا وضعته هناك للقيام باستغلال ضار.
على سبيل المثال ، تريد إدراج وظيفة هروب لمنع استخدام عامل الفاصلة الخام. للقيام بذلك ، تحتوي العديد من أطر عمل الويب ، مثل Django ، على مكتبات مدمجة تسمح لك بتجنب استعلامات SQL لمنع حدوث مثل هذه الأشياء. تشجع هذه الأطر المطورين على عدم التفاعل مباشرةً مع قاعدة البيانات. على سبيل المثال ، يوفر Django نفسه واجهة عالية المستوى تعقيمك.
لكن الناس يهتمون دائمًا بالأداء ، وفي بعض الأحيان يعتقد الناس أن أطر الويب هذه بطيئة جدًا. لذا ، كما سترى قريبًا ، سيواصل الأشخاص إجراء استعلامات SQL الأولية ، مما قد يؤدي إلى حدوث مشاكل.
يمكن أن تحدث المشكلات إذا قبل خادم الويب أسماء المسارات من الصور غير الموثوق بها. تخيل أنك في مكان ما على خادمك تفعل شيئًا مشابهًا: افتح باستخدام "www / images /" + اسم الملف ، حيث يتم تمثيل اسم الملف بشيء مثل ... / ... / ... / ... / الخ / كلمة المرور.

أي أنك تعطي الأمر لفتح الصورة على هذا العنوان من ملف مستخدم غير موثوق به ، والذي يمكن أن يضر بك بشكل خطير. وبالتالي ، إذا كنت ترغب في استخدام خادم ويب أو إطار عمل ويب ، فيجب أن تكون قادرًا على اكتشاف هذه الأحرف الخطيرة وتجنبها من أجل منع تنفيذ هذه الأوامر غير المعالجة.
لنأخذ استراحة من مناقشة تطهير المحتوى ونتحدث قليلاً عن ملفات تعريف الارتباط. تعد ملفات تعريف الارتباط طريقة شائعة جدًا لإدارة الجلسات من أجل ربط المستخدم بمجموعة معينة من الموارد الموجودة على جانب الخادم. تضع الكثير من الإطارات مثل Django أو Zoobar ، والتي ستلتقي بها لاحقًا ، معرف جلسة عشوائي داخل ملفات تعريف الارتباط. الفكرة هي أن معرف الجلسة هذا هو فهرس في نوع من الجداول من جانب الخادم:
جدول [معرف الجلسة] = معلومات المستخدم.
أي أن معرف الجلسة يساوي بعض معلومات المستخدم. ونتيجة لذلك ، يعد معرّف الجلسة وملفات تعريف الارتباط قطعًا حساسة جدًا في امتدادها. تتضمن العديد من الهجمات سرقة ملفات تعريف الارتباط من أجل الحصول على معرف الجلسة هذا. كما ناقشنا في محاضرتنا الأخيرة ، يمكن أن تساعدك نفس السياسة لنفس المصدر الأصلي ، إلى حد ما ، في مواجهة بعض هجمات سرقة ملفات تعريف الارتباط هذه. لأن هناك قواعد تستند إلى سياسة المنشأ نفسها التي تمنع التعديل التعسفي لملفات تعريف الارتباط.
الحذق هو أنه يجب ألا تشارك مجالًا أو نطاقًا فرعيًا مع شخص لا تثق به. لأنه ، كما قلنا في المحاضرة الأخيرة ، هناك قواعد تسمح لنطاقين أو نطاقات فرعية من نفس الأصل بالوصول إلى ملفات تعريف الارتباط الخاصة ببعضهما البعض. وبالتالي ، إذا كنت تثق في مجال لا يجب أن تثق به ، فقد يكون قادرًا على تعيين معرف الجلسة مباشرة في ملفات تعريف الارتباط هذه ، والتي يمكن لكليهما الوصول إليها. سيسمح هذا للمهاجم بإجبار المستخدم على استخدام معرف الجلسة الذي يختاره المهاجم.

افترض أن أحد المهاجمين قام بتعيين ملف تعريف ارتباط مستخدم Gmail. يقوم المستخدم بتسجيل الدخول إلى Gmail ويكتب بعض الحروف. يمكن للمهاجم بعد ذلك استخدام ملف تعريف الارتباط هذا ، على وجه الخصوص ، استخدام معرف الجلسة هذا ، وتنزيل Gmail ، ثم الوصول إلى Gmail كما لو كان مستخدمًا ضحية. وبالتالي ، هناك العديد من التفاصيل الدقيقة التي يمكنك القيام بها باستخدام ملفات تعريف الارتباط هذه لإدارة جلساتك. سنناقش بعضها اليوم وفي المحاضرات اللاحقة.
ربما تعتقد أنه يمكنك فقط التخلص من ملفات تعريف الارتباط؟ بعد كل شيء ، يجلبون مشاكل أكثر من الفوائد. لماذا لا يمكن التخلي عنها؟
stateless cookie, « », - , , , .
, , , . , . , , . , , , , .
— MA — Message Authentication Codes, . , . HCK - m. , , K. , , . , , .

, . , stateless cookie, Amazon, , x3. - Amazon, AWS, . – K, – AWS, .

, AWS HTTP, .
, , , :
GET /photos/ cat; .jpg HTTP/1.1, - AWS:
HOST: — - — - — , , :
DATE: Mon, June 4, , , . , ID , , , .

? , 3- .
, String To Sign :
— HTTP, GET;
— MDS;
— , html jpg;
— ;
— , , .

, , HCK MAC. , . , . , . ?
, , , - . Amazon , stateless cookie, MD5 .
, , , cookie, . – , , .
, . , , “HCK, m”.

. GET /photos/ cat; .jpg HTTP/1.1 , , . , , . , ? : «, , , ».
56:15
دورة معهد ماساتشوستس للتكنولوجيا "أمن أنظمة الكمبيوتر" 9: « Web-», 3النسخة الكاملة من الدورة متاحة
هنا .
شكرا لك على البقاء معنا. هل تحب مقالاتنا؟ هل تريد رؤية مواد أكثر إثارة للاهتمام؟ ادعمنا عن طريق تقديم طلب أو التوصية به لأصدقائك ،
خصم 30 ٪ لمستخدمي Habr على نظير فريد من خوادم مستوى الدخول التي اخترعناها لك: الحقيقة الكاملة حول VPS (KVM) E5-2650 v4 (6 نوى) 10GB DDR4 240GB SSD 1Gbps من 20 $ أو كيفية تقسيم الخادم؟ (تتوفر الخيارات مع RAID1 و RAID10 ، حتى 24 مركزًا وحتى 40 جيجابايت DDR4).
VPS (KVM) E5-2650 v4 (6 نوى) 10GB DDR4 240GB SSD 1Gbps حتى ديسمبر مجانًا عند الدفع لمدة ستة أشهر ، يمكنك الطلب
هنا .
ديل R730xd أرخص مرتين؟ فقط لدينا
2 x Intel Dodeca-Core Xeon E5-2650v4 128GB DDR4 6x480GB SSD 1Gbps 100 TV من 249 دولارًا في هولندا والولايات المتحدة! اقرأ عن
كيفية بناء مبنى البنية التحتية الطبقة باستخدام خوادم Dell R730xd E5-2650 v4 بتكلفة 9000 يورو مقابل سنت واحد؟