1

Railsは初めてで、この小さなログインコントローラーを作成しました。

  def create
    username = params[:user].downcase
    user = User.where("username = ? OR email = ?", username, username)[0]
    if user and user.check_password(params[:password], user.password, user.salt)
        cookies[:auth] = user.auth
        redirect_to root_url
    else
        flash.now.notice = 'Login failed'
        render 'new'
    end
  end

これが安全かどうか疑問に思っていますか、それともユーザー名にサニタイズを追加する必要がありますか?

4

1 に答える 1

4

プレースホルダーの目的である提供されたエスケープ機能を使用している場合は、最新バージョンのRailsやその他の重要なコンポーネントを使用していれ?ば、SQLインジェクションのバグから安全であるはずです。

安全なコードの例:

User.where(:username => arg)
User.where('username=?', arg)

安全でないコードの例:

User.where('username="#{arg}"')

SQLインジェクションのバグを作成するには、文字列補間を使用する必要があることに注意してください。これらはコードを監査するときにかなり明白になるはずであり、これを行う言い訳はめったにありません。何らかの理由で必要な場合は、注入する値が適切にエスケープされているか、既知の適切な値のホワイトリストから取得されていることを絶対に確認してください。

Railsの古いバージョンと、人気のあるページネーションおよび認証ツールのいくつかには、悪用される可能性のあるSQLインジェクションのバグがありました。これらの最新バージョンがあることを確認してください。必要に応じて、削除Gemfile.lockしてクリーンアップを実行しますbundle install

于 2013-02-20T04:50:36.743 に答える