Ruby on Rails має вбудовані функції безпеки, але розробники повинні дотримуватися кращих практик, щоб запобігти вразливостям, таким як SQL Injection, Cross-Site Scripting (XSS) і обходу аутентифікації.
Rails має вбудовані функції безпеки, але розробники повинні дотримуватися кращих практик, щоб уникнути ризиків безпеки.
🔒 Безпечна аутентифікація та авторизація
✅ Використовуйте сильну аутентифікацію
- Використовуйте Devise, bcrypt або Authlogic для аутентифікації.
- Встановіть Багатофакторну аутентифікацію (MFA) для адміністративних користувачів.
- Зберігайте паролі безпечно, використовуючи bcrypt з сильним алгоритмом хешування.
Приклад: Хешування паролів безпечно
class User < ApplicationRecord
has_secure_password # Використовує bcrypt для хешування паролів
end
✅ Реалізуйте контроль доступу на основі ролей (RBAC)
- Використовуйте Pundit або CanCanCan для контролю доступу на основі ролей.
- Обмежте доступ до адміністративних маршрутів за допомогою аутентифікації.
before_action :authenticate_user!
before_action :check_admin, only: [:destroy]
def check_admin
redirect_to root_path, alert: "Access Denied" unless current_user.admin?
end
🛡️ Запобігання SQL-ін'єкціям
Rails ActiveRecord захищає від SQL-ін'єкцій, використовуючи параметризовані запити.
✅ Приклад безпечного запиту
User.where("email = ?", params[:email]) # Безпечно
🚫 Небезпечний (Уникайте динамічного SQL)
User.where("email = '#{params[:email]}'") # ❌ Вразливий до SQL-ін'єкцій
🛡️ Захист від Cross-Site Scripting (XSS)
XSS дозволяє зловмисникам вставляти шкідливий JavaScript на веб-сторінки.
✅ Уникайте введення користувача (за замовчуванням Rails)
<%= user.name %>
🚫 Уникайте використання html_safe
без санітизації
<%= user.bio.html_safe %> # ❌ Небезпечно, якщо введення користувача не було санітизовано
✅ Використовуйте sanitize
для безпечного HTML-контенту
<%= sanitize user.bio %> # Дозволяє тільки безпечні HTML-елементи
✅ Використовуйте Політику безпеки контенту (CSP)
В файлі config/initializers/content_security_policy.rb
:
Rails.application.config.content_security_policy do |policy|
policy.default_src :self, :https
policy.script_src :self, :https
policy.object_src :none
policy.frame_ancestors :none
end
🛡️ Запобігання Cross-Site Request Forgery (CSRF)
Rails автоматично захищає від атак CSRF.
✅ Перевірте, чи увімкнута захист від CSRF
Перевірте application_controller.rb:
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
end
✅ Включіть токен CSRF у формах
<%= form_with(model: @user, authenticity_token: true) do |f| %>
🚫 Ніколи не вимикайте захист CSRF, якщо це не обов'язково.
🛡️ Безпечне управління сесіями
✅ Увімкніть безпечні та HTTP-only cookies
У файлі config/application.rb
:
Rails.application.config.session_store :cookie_store, key: '_myapp', secure: Rails.env.production?, httponly: true
✅ Керуйте сесіями з обмеженням часу дії
Rails.application.config.session_store :cookie_store, expire_after: 30.minutes
✅ Анулюйте сесію при виході
reset_session
🛡️ Безпечне завантаження файлів та зберігання
- Ніколи не зберігайте завантажені файли в
/public
каталозі. - Використовуйте ActiveStorage з S3 замість локального зберігання.
- Обмежте типи та розмір файлів.
✅ Приклад: Перевірка завантажених файлів
class AvatarUploader < CarrierWave::Uploader::Base
def extension_allowlist
%w[jpg jpeg png gif]
end
def size_range
1..5.megabytes
end
end
🛡️ Безпечні API ендпоінти
✅ Використовуйте токени аутентифікації API
- Використовуйте JWT (JSON Web Tokens) або OAuth для аутентифікації.
Приклад: Використання JWT з Devise Token Auth
class Api::UsersController < ApplicationController
before_action :authenticate_user!
end
✅ Обмежте API за допомогою Rack Attack
У файлі config/initializers/rack_attack.rb
:
class Rack::Attack
throttle('requests per ip', limit: 100, period: 60.seconds) do |request|
request.ip
end
end
🛡️ Забезпечте безпеку залежностей та гемів
- Запускайте
bundle audit
, щоб перевірити вразливі геми. - Використовуйте Brakeman для сканування коду Rails на наявність проблем з безпекою.
gem install brakeman
brakeman .
Увімкніть автоматичні оновлення безпеки в Gemfile
:
gem "rails", ">= 7.1.3"
gem "devise", ">= 4.9.4"
🛡️ Реалізуйте заголовки безпеки
✅ Увімкніть HTTPS
В файлі config/environments/production.rb
:
config.force_ssl = true
✅ Встановіть безпечні заголовки в Rails
Rails.application.config.action_dispatch.default_headers = {
'X-Frame-Options' => 'SAMEORIGIN',
'X-XSS-Protection' => '1; mode=block',
'X-Content-Type-Options' => 'nosniff'
}
🛡️ Проводьте регулярні аудити безпеки
✅ Використовуйте OWASP ZAP, Burp Suite або Brakeman для тестування на проникнення.
✅ Моніторьте логи за допомогою AWS CloudTrail або Splunk.
✅ Проводьте перегляд коду та навчання безпеці для розробників.
🛠 Інструменти безпеки для Rails
Висновок
Дотримуючись цих кращих практик, ви можете значно знизити ризики безпеки у вашому додатку на Rails. Безпечна аутентифікація, валідація введених даних, управління сесіями та захист API є ключовими для забезпечення безпеки вашого додатку.
Перекладено з: Best Practices for Application Security in Ruby on Rails 🛡️🚀