我是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
我想知道这是否安全,还是我需要在用户名之上添加一些清理工作?
答案 0 :(得分:4)
如果你正在使用提供的转义工具,这是?
占位符的用途,那么你应该免受SQL注入错误提供你最迟Rails版本和其他关键组件。
安全代码示例:
User.where(:username => arg)
User.where('username=?', arg)
不安全代码的示例:
User.where('username="#{arg}"')
请注意,您必须使用字符串插值来创建SQL注入错误。在审计代码时,这些应该非常明显,并且很少有借口这样做。如果您出于某种原因必须,请绝对确定您正在注射的任何值都已正确转义或来自已知良好值的白名单。
旧版本的Rails和一些流行的分页和身份验证工具都有可以被利用的SQL注入错误。确保您拥有这些版本的当前版本。如有必要,请删除Gemfile.lock
并执行清除bundle install
。