Ruby安全コーディング入門
Ruby応用とセキュリティ対策
Ruby on Rails は開発速度と柔軟性を兼ね備えたフレームワークですが、セキュリティ対策を怠ると脆弱性が潜む可能性があります。まずは、Rails のデフォルト機能を最大限に活用し、入力検証とエスケープを徹底することが重要です。例えば、params.require(:user).permit(:name, :email) を使って許可された属性だけを受け取ることで、Mass Assignment のリスクを軽減できます。
さらに、ActiveRecord のクエリビルダーを利用し、SQL を文字列連結で作成しないようにしましょう。User.where(email: params[:email]) のようにプレースホルダーを使うことで、SQLインジェクションを防止できます。脆弱性診断ツールを定期的に走らせ、潜在的な問題を早期に発見する習慣をつけることも推奨されます。
SQLインジェクション対策
SQLインジェクションは、攻撃者がデータベースに不正なクエリを注入する手法です。Rails では、sanitize_sql や sanitize_sql_array を使って手動でクエリを生成する場合でも、必ずパラメータをバインドするようにします。例えば、User.where("name = ?", params[:name]) のように書くことで、入力値が自動的にエスケープされます。
また、データベース接続設定で prepared_statements: true を有効にすると、Rails が内部でプリペアドステートメントを使用し、SQLインジェクションのリスクをさらに低減します。脆弱性診断ツールで「SQLインジェクション」カテゴリをチェックし、検出された問題を修正することで、堅牢なアプリケーションを構築できます。
XSS・CSRF対策
XSS(クロスサイトスクリプティング)は、ユーザー入力をそのままブラウザに返すことで発生します。Rails では、ERB テンプレートで <%= h @user.name %> のように自動エスケープを行うか、sanitize ヘルパーを使って安全に表示します。さらに、content_security_policy を設定し、外部スクリプトの実行を制限することで、XSS の影響範囲を縮小できます。
CSRF(クロスサイトリクエストフォージェリ)は、ユーザーが意図しないリクエストを送信される攻撃です。Rails はデフォルトで protect_from_forgery を有効にしており、フォームに csrf_token を埋め込むことで対策します。API を提供する場合は、verified_request? を使ってトークンを検証し、外部からの不正リクエストをブロックします。脆弱性診断で CSRF の検出項目を確認し、必要に応じてヘッダーを追加することで安全性を確保します。
Mass Assignmentと安全なコーディング
Mass Assignment は、ユーザーが送信したパラメータを一括でモデルに割り当てる機能です。Rails 5 以降では、Strong Parameters を使って許可された属性を明示的に指定することで、管理者権限を持たないユーザーが重要なフィールドを変更できないようにします。params.require(:post).permit(:title, :body) のように書くことで、admin フラグや role を不正に変更されるリスクを排除します。
安全なコーディングの実践としては、モデルに attr_readonly を設定し、変更不可の属性を固定すること、また before_save フィルタで値を検証・正規化することが挙げられます。脆弱性診断ツールで「Mass Assignment」カテゴリをチェックし、許可リストに漏れがないか確認することで、アプリケーションの堅牢性を高められます。
コメント
コメントを投稿