معهد ماساتشوستس للتكنولوجيا. محاضرة رقم 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المحاضرة 10: "التنفيذ الرمزي"
الجزء 1 /
الجزء 2 /
الجزء 3المحاضرة 11: "لغة برمجة Ur / Web"
الجزء 1 /
الجزء 2 /
الجزء 3 آخر شيء يتعين علينا القيام به والذي سيكون مفيدًا للغاية هو تغيير هذا الرمز من خلال الإشارة إلى وحدة الغرفة هناك ، ثم محاولة الوصول إلى طاولة الغرفة ، كما في المثال السابق. هذا الخيار غير مسموح به لأنه غير مسموح به.

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

يمكننا أن نذكر هذه الوحدة الإضافية ، التي أنشأناها للمتعة فقط.

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

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

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

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

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

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

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

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

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

ملفات تعريف الارتباط هذه خاصة بهذه الوحدة. لن تتمكن أجزاء أخرى من التعليمات البرمجية من قراءة ملفات تعريف الارتباط لأنها ببساطة لا تملك هذا الحقل الخاص. لذلك لن يتمكن أي شخص من رؤية المعرّف وكلمة المرور المحفوظين لهذا المستخدم مباشرةً. ولكن سيتم حفظها عند عرض صفحات مختلفة ، كما هو الحال مع ملفات تعريف الارتباط العادية.
الآن سأقوم بإدراج وظيفة تسجيل الدخول ، والتي ستبدأ عملية التحقق من قاعدة البيانات ومعرفة ما إذا كان هذا هو حقًا الزوج الصحيح من اسم المستخدم وكلمة المرور. ستتحقق هذه العملية من إمكانية العثور على صف في قاعدة البيانات يحتوي على معرف المستخدم وكلمة المرور.
إذا وجدنا ذلك ، فهذا جيد ، فهذا هو المعنى الصحيح. دعونا فقط حفظ هذا في ملفات تعريف الارتباط. نحن نستخدم طريقة تغير قيمة ملف تعريف الارتباط. وعلينا أن نضع بعض الأشياء هنا ، من أجل البساطة ، سأقول أن ملف تعريف الارتباط هذا لا ينتهي. لا أريد تشغيل طبقة المقابس الآمنة (SSL) هنا ، لذا سأقول إنه في هذه الحالة لا نحتاج إلى الأمان ، وقم بتعيين المعلمة Secure = false.
ولكن إذا كنت تهتم حقًا بالأمان ، فمن الواضح أنك ستكتب Secure = true. إذا فشل الفحص وأظهرت الوحدة خطأ ، سيتوقف البرنامج ، مع تقديم وصف لهذا الخطأ.

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

لذا دعني أتفقد هذا. نبدأ المترجم ، وترى النتيجة على الشاشة.

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

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

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


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

في الواقع ، لم نقم بإضافة أي تحكم في الوصول هنا ، لذلك لا يحدث شيء خاص هنا. ولكن يمكننا التحقق.

توجد ملفات تعريف ارتباط هنا ، لكن النظام قرر أننا لا نستخدم ملفات تعريف الارتباط. عندما نرسل هذا النموذج ، لا يمكن قراءة ملف تعريف الارتباط. وبالتالي ، حتى الآن ليست هناك حاجة لإضافة حماية CSRF هنا. لذا ، نحتاج الآن إلى إضافة طريقة لاستخدام ملفات تعريف الارتباط ونرى كيف ستظهر الحماية نفسها.
الطالب: ما هو محتوى ملفات تعريف الارتباط؟
البروفيسور: هذا هو المحتوى الذي تتوقع تلقيه من الكود. بمعنى آخر ، يتم تعريف ملف تعريف الارتباط على أنه يحتوي على نوع هذا السجل - المعرف وكلمة المرور.

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

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

الآن يجب أن يكون كل شيء في محله ، ويمكننا فعل المزيد من الأشياء باستخدام هذا المعرّف ، والذي يمكن أن يسبب بعض المشاكل الأمنية.

يتيح لنا هذا إضافة فحص التحكم في الوصول ، لذا دعنا نرى كيف يعمل ونعود إلى الصفحة الرئيسية.

الآن ظهرت هذه الأحرف الأربعة "a" في الدردشة.
في وحدة تحكم الواجهة ، نرى أنه الآن تلقى النموذج تلقائيًا اسم الإدخال المخفي sig ، وهو توقيع التشفير لقيم جميع ملفات تعريف الارتباط. سيج توقيع هذا ملفات تعريف الارتباط باستخدام مفتاح سر للخادم. وعندما يكون النموذج جاهزًا ، يعرف التطبيق - لأن المترجم أخبره بذلك - أن التطبيق يجب أن يتحقق من التوقيعات للمجموعة التالية من العمليات. لهذا ، لدينا عملية القول.
الطالب: هل للتوقيعات طابع زمني؟
البروفيسور: لا ، التوقيعات ليس لها طوابع زمنية.
الطالب: في هذه الحالة ، إذا تمكن مهاجم من "التجسس" على هذه البيانات ، فيمكنه التظاهر بأنه مستخدم ، لأن ملفات تعريف الارتباط هذه لن تنتهي صلاحيتها أبدًا.
الأستاذ: نعم ، لا تنتهي صلاحيته. هذا شيء يمكن تغييره بمجرد تغيير تطبيق اللغة دون تغيير التطبيقات ، ثم نشرها بسرعة. لكن الآن هذا ليس هنا. وأنا أفهم لماذا يكون هذا مفيدًا للإضافة.
الطالب: يمكنك أيضًا إصلاح ذلك عن طريق وضع طابع زمني على التوقيع.
البروفيسور: نعم ، أنت على حق ، يمكنك تغيير التطبيق بطريقة لتغيير بيانات ملف تعريف الارتباط عن قصد في كثير من الأحيان بما فيه الكفاية ، أي جعل التوقيع تنتهي صلاحيته.
الطالب: هل يمكنك إعادة تعيين عناوين URL؟
البروفيسور: نعم ، ما هي التخصيصات التي تود رؤيتها؟
الطالب: أي ، أريد فقط أن أرى كيف يتم ذلك.
البروفيسور: إذن ، المترجم يعين ... كما نرى ، نسمي الوظيفة say ، ويتم استدعاء تسلسل الوظيفة كنوع محدد من URL. لنفترض أننا لا نحب هذا النموذج.

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

نبدأ المترجم ونذهب إلى الشاشة الرئيسية للتطبيق. دعنا نرى ما يحدث. كل شيء على ما يرام ، يمكننا أيضًا إدخال أي رسائل نصية وتظهر في سطر الدردشة. يمكن استخدام الأحرف غير المتوقعة في هذه القواعد لاستبدال بادئة بأخرى ، وسيضمن المترجم أن كل وظيفة لديها نظام URL منفصل ، ولكن يتم إنشاء عنوان URL تلقائيًا بشكل افتراضي.
الطالب: ذكرت أن HTML ليس خاصًا بالمترجم ، إنه مجرد مكتبة. هل هناك مكتبات أخرى لأشكال أخرى؟
البروفيسور: هناك مكتبات أخرى لا تتحقق من النوع بالاكتمال الوظيفي نفسه ، ولكن ، على سبيل المثال ، هناك مكتبة لتسلسل JSON وإلغاء تسلسله ، وعدد كبير من الطرق المؤتمتة لإدارة بنية النوع. بهذه الطريقة يمكنك القيام بأشياء غير مدمجة في المترجم.
الطالب: لنفترض أننا ما زلنا نريد الكتابة في جافا سكريبت ، على سبيل المثال ، لتحريك بعض الأشياء على الصفحة ...
الأستاذ: دعني أحمل نسخة أياكس من هذا ، والتي ستجيب على سؤالك. هذا الإصدار له كود من جانب العميل. دعنا ننتقل فقط إلى إصدار من البرنامج يسمى demo3. لقد أدخلت البيانات في الصفحة الرئيسية في خط الدردشة ، وظهرت أيضًا في أسفل المحادثة. صدق أو لا تصدق ، عملت هذه الوظيفة الإضافية هذه المرة باستخدام مكالمة Ajax. هذا يرجع إلى قيمة زر علامة الزر. يحتوي على سمة onclick ، والتي عندما ينقر المستخدم على الزر ، يعمل كل هذا الرمز أسفل السطر مع هذه السمة على جانب العميل.

]
ولكن هذا هو رمز Ur / Web ، وهذا ليس رمز JavaScript. يقوم المترجم بترجمة هذا إلى JavaScript من أجلك ويضمن أنه يحفظ الخصائص التي نريدها للتجريد في قائمتنا إذا لم يرغب المستخدم في العبث بها يدويًا في المتصفح.
الطالب: أعتقد أن هناك اليوم العديد من المكتبات التي تقوم بأشياء مفيدة ، وفي كثير من الحالات أشياء معقدة ، إذا كنت تريد إعادة كتابة كل شيء بنفسك. هل هناك أي طريقة للتفاعل مع جافا سكريبت من Ur / Web؟
البروفيسور: نعم ، هناك واجهة وظيفة خارجية تسمح لك بإعطاء أسماء وظائف Ur / Web لأسماء ووظائف JavaScript. ولكن عند استخدام واجهة وظيفة خارجية ، لم يعد بإمكانك استخدام جميع وظائف البناء المفيدة هذه. في هذه الحالة يجب أن تكون حذرا للغاية.
يجب أن تفهم تنفيذ بعض هذه التجريدات حتى لا تتداخل معها. طالما لدي هذا الرمز ، دعني أريك شيئًا آخر.
لا يزال لدينا نفس وظيفة القول كما كان من قبل. ولكن الآن ، بدلاً من تسميته بالإشارة ، نأخذ مكالمة دالة فقط ، والتي يتم ملؤها بالحجج التي تأتي من سياق معالج onclick.

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

, , , . , , .
, - , . GUI , , , , .
, , , . , DOM. , , .

, GUI, , , , .
, , .
: ?
: , , . , - .
: . , ?
:أفضل طريقة هي حث الأشخاص على استخدام هذه الأشياء والإبلاغ عن الأخطاء. هذه أفضل نصيحة يمكنني تقديمها لك. الفكرة هي أنه يجب كتابة مثل هؤلاء المترجمين بشكل أقل تكرارًا من التطبيقات الجديدة. لأنه يجمع كل الأخطاء في مكان واحد ويحاول إزالتها ، حتى لو لم يحدث ذلك بالطريقة الأكثر فاعلية.الطالب: لماذا اخترت مثل هذا الاسم للغتك - أور؟البروفيسور: أور مفهوم من اللغويات ، اسم اللغة التي هي سلف اللغة الحديثة. والفكرة هي أن هذه اللغة تسمح لك بإدراج جميع أنواع اللغات الأخرى داخلها. هذا نوع من السلف بجميع اللغات.النسخة الكاملة من الدورة متاحة هنا .شكرا لك على البقاء معنا. هل تحب مقالاتنا؟ هل تريد رؤية مواد أكثر إثارة للاهتمام؟ ادعمنا عن طريق تقديم طلب أو التوصية به لأصدقائك ،
خصم 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 يورو مقابل سنت واحد؟