
CVE-2013-0156 भेद्यता प्रदर्शित करने के लिए एक भोला-भाला Rails ऐप
== Rails में आपका स्वागत है
Rails एक वेब-एप्लिकेशन फ्रेमवर्क है जिसमें मॉडल-व्यू-कंट्रोल पैटर्न के अनुसार डेटाबेस-समर्थित वेब एप्लिकेशन बनाने के लिए आवश्यक सब कुछ शामिल है।
यह पैटर्न व्यू (जिसे प्रस्तुति भी कहा जाता है) को "डम्ब" टेम्पलेट्स में विभाजित करता है जो मुख्य रूप से HTML टैग्स के बीच पूर्व-निर्मित डेटा डालने के लिए जिम्मेदार होते हैं। मॉडल में "स्मार्ट" डोमेन ऑब्जेक्ट (जैसे Account, Product, Person, Post) होते हैं जो सभी व्यावसायिक तर्क रखते हैं और जानते हैं कि खुद को डेटाबेस में कैसे संग्रहीत करना है। कंट्रोलर मॉडल में हेरफेर करके और डेटा को व्यू में निर्देशित करके आने वाले अनुरोधों (जैसे Save New Account, Update Product, Show Post) को संभालता है।
Rails में, मॉडल को एक ऑब्जेक्ट-रिलेशनल मैपिंग परत द्वारा संभाला जाता है जिसे Active Record कहा जाता है। यह परत आपको डेटाबेस पंक्तियों से डेटा को ऑब्जेक्ट के रूप में प्रस्तुत करने और इन डेटा ऑब्जेक्ट्स को व्यावसायिक तर्क विधियों से सजाने की अनुमति देती है। आप Active Record के बारे में और अधिक पढ़ सकते हैं link:files/vendor/rails/activerecord/README.html।
कंट्रोलर और व्यू को एक्शन पैक द्वारा संभाला जाता है, जो अपने दो भागों: एक्शन व्यू और एक्शन कंट्रोलर द्वारा दोनों परतों को संभालता है। ये दोनों परतें अपनी भारी परस्पर निर्भरता के कारण एक ही पैकेज में बंडल की जाती हैं। यह Active Record और एक्शन पैक के बीच संबंध से अलग है जो कहीं अधिक अलग है। इनमें से प्रत्येक पैकेज का उपयोग Rails के बाहर स्वतंत्र रूप से किया जा सकता है। आप एक्शन पैक के बारे में और अधिक पढ़ सकते हैं link:files/vendor/rails/actionpack/README.html।
== शुरुआत करना
कमांड प्रॉम्प्ट पर, एक नया Rails एप्लिकेशन बनाएं: rails new myapp (जहाँ myapp एप्लिकेशन का नाम है)
डायरेक्टरी को myapp में बदलें और वेब सर्वर शुरू करें: cd myapp; rails server (विकल्पों के लिए --help के साथ चलाएँ)
http://localhost:3000/ पर जाएं और आप देखेंगे: "Welcome aboard: You're riding Ruby on Rails!"
अपने एप्लिकेशन को विकसित करना शुरू करने के लिए दिशानिर्देशों का पालन करें। आपको निम्नलिखित संसाधन उपयोगी लग सकते हैं:
== Rails को डीबग करना
कभी-कभी आपका एप्लिकेशन गलत हो जाता है। सौभाग्य से, बहुत सारे उपकरण हैं जो इसे डीबग करने और इसे वापस पटरी पर लाने में आपकी मदद करेंगे।
जांचने का पहला क्षेत्र एप्लिकेशन लॉग फाइलें हैं। server.log और development.log पर "tail -f" कमांड चलाते रहें। 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!
लॉगर का उपयोग कैसे करें, इस बारे में अधिक जानकारी http://www.ruby-doc.org/core/ पर है
साथ ही, Ruby दस्तावेज़ीकरण http://www.ruby-lang.org/ पर पाया जा सकता है। ऑनलाइन कई पुस्तकें भी उपलब्ध हैं:
ये दोनों पुस्तकें आपको Ruby भाषा और सामान्य रूप से प्रोग्रामिंग पर गति प्रदान करेंगी।
== डीबगर
डीबगर समर्थन डीबगर कमांड के माध्यम से उपलब्ध है जब आप अपने 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 उन कंट्रोलर को रखता है जिन्हें स्वचालित URL मैपिंग के लिए weblogs_controller.rb जैसा नाम दिया जाना चाहिए। सभी कंट्रोलर को ApplicationController से व्युत्पन्न होना चाहिए जो स्वयं ActionController::Base से व्युत्पन्न होता है।
app/models उन मॉडल को रखता है जिन्हें post.rb जैसा नाम दिया जाना चाहिए। मॉडल डिफ़ॉल्ट रूप से ActiveRecord::Base से व्युत्पन्न होते हैं।
app/views व्यू के लिए टेम्पलेट फाइलें रखता है जिन्हें WeblogsController#index कार्रवाई के लिए weblogs/index.html.erb जैसा नाम दिया जाना चाहिए। सभी व्यू डिफ़ॉल्ट रूप से eRuby सिंटैक्स का उपयोग करते हैं।
app/views/layouts व्यू के साथ उपयोग किए जाने वाले लेआउट के लिए टेम्पलेट फाइलें रखता है। यह व्यू को लपेटने की सामान्य हेडर/फुटर विधि का मॉडल बनाता है। अपने व्यू में, layout :default का उपयोग करके एक लेआउट परिभाषित करें और default.html.erb नामक फाइल बनाएं। default.html.erb के अंदर, इस लेआउट का उपयोग करके व्यू प्रस्तुत करने के लिए <% yield %> को कॉल करें।
app/helpers व्यू हेल्पर रखता है जिन्हें weblogs_helper.rb जैसा नाम दिया जाना चाहिए। ये कंट्रोलर के लिए जनरेटर का उपयोग करने पर स्वचालित रूप से आपके लिए उत्पन्न होते हैं। हेल्पर का उपयोग आपके व्यू के लिए कार्यक्षमता को विधियों में लपेटने के लिए किया जा सकता है।
config Rails वातावरण, रूटिंग मैप, डेटाबेस और अन्य निर्भरताओं के लिए कॉन्फ़िगरेशन फाइलें।
db इसमें schema.rb में डेटाबेस स्कीमा शामिल है। db/migrate में आपकी स्कीमा के लिए माइग्रेशन का पूरा क्रम होता है।
doc यह वह निर्देशिका है जहां rake doc:app का उपयोग करके उत्पन्न होने पर आपके एप्लिकेशन का दस्तावेज़ीकरण संग्रहीत किया जाएगा।
lib एप्लिकेशन विशिष्ट लाइब्रेरी। मूल रूप से, किसी भी प्रकार का कस्टम कोड जो कंट्रोलर, मॉडल या हेल्पर के अंतर्गत नहीं आता है। यह निर्देशिका लोड पथ में है।
public वेब सर्वर के लिए उपलब्ध निर्देशिका। इसमें डिस्पैचर और डिफ़ॉल्ट HTML फाइलें भी शामिल हैं। इसे आपके वेब सर्वर के DOCUMENT_ROOT के रूप में सेट किया जाना चाहिए।
script स्वचालन और जनरेशन के लिए हेल्पर स्क्रिप्ट।
test फिक्स्चर के साथ यूनिट और फंक्शनल परीक्षण। rails generate कमांड का उपयोग करने पर, टेम्पलेट टेस्ट फाइलें आपके लिए उत्पन्न की जाएंगी और इस निर्देशिका में रखी जाएंगी।
vendor बाहरी लाइब्रेरी जिन पर एप्लिकेशन निर्भर करता है। इसमें प्लगइन्स उपनिर्देशिका भी शामिल है। यदि ऐप में frozen Rails है, तो वे gems भी यहाँ vendor/rails/ के अंतर्गत जाते हैं। यह निर्देशिका लोड पथ में है।