Logo for Parsclick

امنیت در ریلز

  محمد محمودی محمد محمودی
  December 18, 2015 at 4:09 PM
  ۲۷ آذر، ۱۳۹۴ ساعت ۱۶:۰۹
این متن به مرور زمان تکمیل تر میشه

هکر ممکنه با دستکاری ورودی ها مارو هک کنه می ریم با هم چند روش رو امتحان کنیم

۱- گرفتن ورودی از کاربر


render "Hi #{params[:name]}"

خوب حالا فرض کنید هکر چه کد هایی می تونه جایگزین اسمش کنه مثلا کله فایل هامونو پاک کنه یا اطلاعات کاربر هارو از دیتابیس بگیره !

بهترین راه برای جلوگیری از این روش اینه که ما نوع رندر و خروجی رو مشخص کنیم


render :text=>params[:name].to_s + "goodbye ;)"

نکته : شما باید بسته به نیازتون خروجی رو چاپ کنید مثلا html یا json

۲-تزریق به پایگاه داده

فرض کنید برای کاربر لینک فراموشی پسورد فرستادید قطعا از یه توکن برای پیدا کردن کاربر استفاده می کنید و خوب اگر کاربر جای توکن شما عدد ۰ یا ۱ بزاره چی ؟ به همین سادگی هک می شید (که اکثرا هم کسی هواسش به این قسمت نیست) حتما براتون سوال پیش اومده که چطور ؟ به کد زیر دقت کنید.


SELECT token FROM users WHERE token = 0
# true ,1 row selected

خوب فکر کنم تا الان متوجه شدید که 0 و 1 یه نوع بولین هست وما باید اون رو تغیر بدیم به استیرینگ


"SELECT token FROM users WHERE token = "0
# false ,0 row selected

نکته:برای تبدیل داخل کنترلر و… شما می تونید از to_s استفاده کنید var.to_s

یکی از اشتباه برتامه تویس های ریلز ایته که می خوان sql رو دستی بنویسن و این ممکنه باعثه یه شکاف بشه داخله اپلیکیشنتون به کد زیر توجه کتید.


User.where("name = #{params[:name]})")

خوب حالا فرض کنید هکر با گزاشتن یه and یا or ساده چه کار ها که با دیتایستون نمی کنه مثلا :


User.where("name = #{params[:name]}) "
# name = or 1
SELECT * FORM user WHERE name = or 1

بهترین روش برای جلوگیری از این حملات استفاده از سیمبل های ریلز یا رزرو کردن هست به کد زیر توجه کتید


User.where(:name=>params[:name])
# or
User.where("name = ?",params[:name])

۳- فراخوان

یکی دیگه از راه های نفوذ اطلاعاتی است که کاربر در دیتابیس ذخیره می کند به کد زیر توجه کتید


link_to 'mohammad mahmoudi',@user.twitter_url 

همون جور که معلومه کاربر می تونه با مدلمون هر کا ری کنه برای جلوگیری از این کار باید از کمکی ها استفاده کنیم


link_to 'mohammad mahmoudi',@user.twitter_url.html_safe 

sanitize
html_scape
html_safe
strip_tags
strip_links

نکنه : کاربر می تونه جاوااسکریپت اضافه کنه شما باید توسط کمکی های بالا جلوشوتو بگیرید و یا با regex داخله مدل جلوشو بگیرید !


۴- دیگر

سعی کنید از ssl استفاده کنید


از WEBrick فقط برای پروژه های لوکال استفاده کنید و به جاش از انجینکس و اپاچی استفاده کنید

همیشه پسورد هارو هش کنید ( برای rails از جم bcrypt استفاده کنید)

پسوند فایل های ارسالی توسط کاربر رو چک کنید!


از csrf_meta_tags استفاده کنید ( این کار باعث میشه که ربات ها نتونن به سایت نفوذ کنن)

سعی کنید از تکتولوژی های جدید به جای Soap استفاده کنید مثله RestAPI، JsonRPC، ProtocolBuffer


برای ارتباط با من می تونید از ایمیل پارسکلیک استفاده کنید : mohammad@parsclick.net