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 回答