
تطبيق Rails بسيط لعرض الثغرة CVE-2013-0156
== مرحبًا بكم في Rails
Rails هو إطار عمل لتطبيقات الويب يتضمن كل ما يلزم لإنشاء تطبيقات ويب مدعومة بقاعدة بيانات وفق نمط Model-View-Control.
يقسم هذا النمط العرض (ويُسمى أيضًا طبقة العرض التقديمي) إلى قوالب "البسيطة" المسؤولة بشكل أساسي عن إدراج البيانات الجاهزة بين وسوم HTML. أما النموذج فيحتوي على كائنات المجال "الذكية" (مثل Account وProduct وPerson وPost) التي تحمل كل منطق الأعمال وتعرف كيفية حفظ نفسها في قاعدة البيانات. وتتولى وحدة التحكم معالجة الطلبات الواردة (مثل حفظ حساب جديد، تحديث منتج، عرض مشاركة) عن طريق معالجة النموذج وتوجيه البيانات إلى العرض.
في Rails، يُدار النموذج عبر ما يُسمى طبقة تعيين كائنات-علائقية تُدعى Active Record. تتيح لك هذه الطبقة عرض البيانات من صفوف قاعدة البيانات ككائنات، وإثراء كائنات البيانات هذه بأساليب منطق الأعمال. يمكنك قراءة المزيد عن Active Record في link:files/vendor/rails/activerecord/README.html.
تتم معالجة وحدة التحكم والعرض بواسطة Action Pack، الذي يعالج الطبقتين بجزأيه: Action View وAction Controller. وتُجمَّع هاتان الطبقتان في حزمة واحدة بسبب اعتمادهما المتبادل الكبير. وهذا يختلف عن العلاقة بين Active Record وAction Pack التي تكون أكثر انفصالًا. يمكن استخدام كل من هذه الحزم بشكل مستقل خارج Rails. يمكنك قراءة المزيد عن Action Pack في link:files/vendor/rails/actionpack/README.html.
== البدء
في موجه الأوامر، أنشئ تطبيق Rails جديدًا: rails new myapp (حيث myapp هو اسم التطبيق)
انتقل إلى المجلد myapp وشغّل خادم الويب: cd myapp; rails server (شغّله مع --help للاطلاع على الخيارات)
انتقل إلى http://localhost:3000/ وسترى: "مرحبًا بك: أنت على متن Ruby on Rails!"
اتبع الإرشادات لبدء تطوير تطبيقك. يمكنك الاستعانة بالموارد التالية:
== تصحيح أخطاء Rails
أحيانًا لا يعمل تطبيقك كما يجب. لحسن الحظ، هناك الكثير من الأدوات التي ستساعدك على تصحيح أخطائه وإعادته إلى المسار الصحيح.
أول ما يجب فحصه هو ملفات سجلات التطبيق. شغّل أوامر "tail -f" على server.log وdevelopment.log. سيعرض Rails تلقائيًا معلومات التصحيح ومعلومات وقت التشغيل في هذه الملفات. كما ستُعرض معلومات التصحيح في المتصفح عند الطلبات القادمة من 127.0.0.1.
يمكنك أيضًا تسجيل رسائلك الخاصة مباشرةً في ملف السجل من خلال الكود باستخدام فئة Ruby logger من داخل وحدات التحكم. مثال:
class WeblogController < ActionController::Base def destroy @weblog = Weblog.find(params[:id]) @weblog.destroy logger.info("#{Time.now} Destroyed Weblog ID ##{@weblog.id}!") end end
ستكون النتيجة رسالة في ملف السجل على غرار:
Mon Oct 08 14:22:29 +1000 2007 Destroyed Weblog ID #1!
يمكنك الاطلاع على مزيد من المعلومات حول كيفية استخدام logger على http://www.ruby-doc.org/core/
يمكنك أيضًا العثور على توثيق Ruby على http://www.ruby-lang.org/. وهناك أيضًا عدة كتب متاحة على الإنترنت:
سيساعدانك على الإلمام بلغة Ruby وبالبرمجة عمومًا.
== مصحح الأخطاء
يتوفر دعم مصحح الأخطاء عبر أمر debugger عند تشغيل خادم Mongrel أو WEBrick مع --debugger. هذا يعني أنه يمكنك إيقاف التنفيذ مؤقتًا عند أي نقطة في الكود، وفحص النموذج وتغييره، ثم استئناف التنفيذ! تحتاج إلى تثبيت ruby-debug لتشغيل الخادم في وضع التصحيح. مع gems، استخدم sudo gem install ruby-debug. مثال:
class WeblogController < ActionController::Base def index @posts = Post.all debugger end end
إذن ستقبل وحدة التحكم الإجراء، وتنفذ السطر الأول، ثم تعرض عليك موجه IRB في نافذة الخادم. وهنا يمكنك القيام بأشياء مثل:
@posts.inspect => "[#<Post:0x14a6be8 @attributes={"title"=>nil, "body"=>nil, "id"=>"1"}>, #<Post:0x14a6620 @attributes={"title"=>"Rails", "body"=>"Only ten..", "id"=>"2"}>]" @posts.first.title = "hello from a debugger" => "hello from a debugger"
...والأفضل من ذلك، يمكنك فحص كيفية عمل كائنات وقت التشغيل فعليًا:
f = @posts.first => #<Post:0x13630c4 @attributes={"title"=>nil, "body"=>nil, "id"=>"1"}> f. Display all 152 possibilities? (y or n)
أخيرًا، عندما تكون مستعدًا لاستئناف التنفيذ، يمكنك إدخال "cont".
== الكونسول
الكونسول هو غلاف Ruby، ويتيح لك التفاعل مع نموذج مجال تطبيقك. ستجد هنا جميع أجزاء التطبيق مُهيأة تمامًا كما تكون عندما يعمل التطبيق. يمكنك فحص نماذج المجال، وتغيير القيم، والحفظ في قاعدة البيانات. عند تشغيل السكربت بدون وسائط، سيتم إطلاقه في بيئة التطوير.
لبدء الكونسول، نفّذ rails console من مجلد التطبيق.
الخيارات:
لإعادة تحميل وحدات التحكم والنماذج بعد تشغيل الكونسول، نفّذ reload!
مزيد من المعلومات حول irb متاح على: link:http://www.rubycentral.org/pickaxe/irb.html
== dbconsole
يمكنك الانتقال إلى سطر أوامر قاعدة البيانات مباشرةً عبر rails dbconsole. سيتم الاتصال بقاعدة البيانات باستخدام بيانات الاعتماد المعرّفة في database.yml. تشغيل السكربت بدون وسائط سيوصلك بقاعدة بيانات التطوير، بينما تمرير وسيط سيوصلك بقاعدة بيانات مختلفة، مثل rails dbconsole production. يعمل حاليًا مع MySQL وPostgreSQL وSQLite 3.
== وصف المحتويات
الهيكل الافتراضي للمجلدات في تطبيق Ruby on Rails مُولّد:
|-- app
| |-- assets
| |-- images
| |-- javascripts
| -- stylesheets | |-- controllers | |-- helpers | |-- mailers | |-- models | -- views
| -- layouts |-- config | |-- environments | |-- initializers | -- locales
|-- db
|-- doc
|-- lib
| -- tasks |-- log |-- public |-- script |-- test | |-- fixtures | |-- functional | |-- integration | |-- performance | -- unit
|-- tmp
| |-- cache
| |-- pids
| |-- sessions
| -- sockets -- vendor
|-- assets
-- stylesheets -- plugins
app يحتوي على كل الكود الخاص بهذا التطبيق تحديدًا.
app/assets يحتوي على مجلدات فرعية للصور وأوراق الأنماط وملفات JavaScript.
app/controllers يحوي وحدات تحكم يجب تسميتها مثل weblogs_controller.rb لتعيين العناوين تلقائيًا. يجب أن تنحدر جميع وحدات التحكم من ApplicationController الذي ينحدر بدوره من ActionController::Base.
app/models يحوي نماذج يجب تسميتها مثل post.rb. تنحدر النماذج افتراضيًا من ActiveRecord::Base.
app/views يحوي ملفات قوالب العرض ويجب تسميتها مثل weblogs/index.html.erb لإجراء WeblogsController#index. تستخدم جميع العروض صيغة eRuby افتراضيًا.
app/views/layouts يحوي ملفات قوالب التخطيطات (layouts) لاستخدامها مع العروض. يحاكي هذا الأسلوب الشائع لتغليف العروض عبر ترويسة/تذييل. في عروضك، عرّف تخطيطًا باستخدام layout :default وأنشئ ملفًا باسم default.html.erb. داخل default.html.erb، استدعِ <% yield %> لعرض العرض باستخدام هذا التخطيط.
app/helpers يحوي مساعدات العرض (helpers) التي يجب تسميتها مثل weblogs_helper.rb. تُنشأ لك تلقائيًا عند استخدام مولّدات وحدات التحكم. يمكن استخدام المساعدات لتغليف وظائف العروض في دوال.
config ملفات الإعدادات لبيئة Rails، وخريطة التوجيه، وقاعدة البيانات، والاعتماديات الأخرى.
db يحتوي على مخطط قاعدة البيانات في schema.rb. يحتوي db/migrate على كل تسلسل الترحيلات (Migrations) لمخططك.
doc هذا المجلد هو المكان الذي ستُخزَّن فيه وثائق تطبيقك عند إنشائها باستخدام rake doc:app
lib مكتبات خاصة بالتطبيق. بشكل أساسي، أي كود مخصص لا ينتمي إلى وحدات التحكم أو النماذج أو المساعدات. هذا المجلد موجود في مسار التحميل.
public المجلد المتاح لخادم الويب. يحتوي أيضًا على الموزّعات (dispatchers) وملفات HTML الافتراضية. يجب تعيينه كـ DOCUMENT_ROOT لخادم الويب الخاص بك.
script سكربتات مساعدة للأتمتة والإنشاء.
test اختبارات الوحدة والاختبارات الوظيفية بالإضافة إلى الـ fixtures. عند استخدام أمر rails generate، سيتم إنشاء ملفات اختبار قالبية لك ووضعها في هذا المجلد.
vendor مكتبات خارجية يعتمد عليها التطبيق. يتضمن أيضًا مجلدًا فرعيًا باسم plugins. إذا كان التطبيق يحتوي على rails مجمّدة، فستوضع هذه الـ gems أيضًا هنا، تحت vendor/rails/. هذا المجلد موجود في مسار التحميل.