Mysql 我应该如何避免sql注入?
我有一个问题:Mysql 我应该如何避免sql注入?,mysql,ruby-on-rails,Mysql,Ruby On Rails,我有一个问题: @results = the_db.where('name LIKE ?', '%#{input}%').paginate( :page => params[:page], :per_page => 50, :group => "name", :order => [ "CASE WHEN name like '#{input}%' THEN 0 WHEN name like '% %#
@results = the_db.where('name LIKE ?', '%#{input}%').paginate(
:page => params[:page],
:per_page => 50,
:group => "name",
:order => [
"CASE WHEN name like '#{input}%' THEN 0
WHEN name like '% %#{input}% %' THEN 1
END, name"
]
)
问题是,这很容易受到注射的影响。订单条款如何解决这个问题?是否有可能以某种方式清理用户的输入以消除任何攻击?使用参数化查询
@results = the_db.where('name LIKE ?', "%#{input}%").paginate(
:page => params[:page],
:per_page => 50,
:group => "name",
:order => [
"CASE WHEN name like ? THEN 0
WHEN name like ? THEN 1
END, name",
'#{input}%',
'% %#{input}% %'
]
)
尽管我不确定如果字符串中有%,它的行为如何。使用参数化查询
@results = the_db.where('name LIKE ?', "%#{input}%").paginate(
:page => params[:page],
:per_page => 50,
:group => "name",
:order => [
"CASE WHEN name like ? THEN 0
WHEN name like ? THEN 1
END, name",
'#{input}%',
'% %#{input}% %'
]
)
尽管我不确定如果字符串中有%,它的行为如何。您可以在嵌入之前或之后对输入字符串使用该方法。这基本上就是Rails参数化为您所做的
请注意,消毒将添加一个前导和尾随单引号',如果需要,您可以使用以下方法删除该引号:
sanitize(something)[1..-2]
在您的示例中,您可以执行以下操作:
:order => [
"CASE WHEN name like #{sanitize "#{input}%")} THEN 0
WHEN name like #{sanitize "% %#{input}% %")} THEN 1
END, name"
]
请注意,您需要在类方法或作用域内调用sanitize,或使用具有访问权限的命名空间,例如ModelName.sanitize或ActiveRecord::Base.sanitize。您可以在嵌入输入字符串之前或之后对其使用该方法。这基本上就是Rails参数化为您所做的
请注意,消毒将添加一个前导和尾随单引号',如果需要,您可以使用以下方法删除该引号:
sanitize(something)[1..-2]
在您的示例中,您可以执行以下操作:
:order => [
"CASE WHEN name like #{sanitize "#{input}%")} THEN 0
WHEN name like #{sanitize "% %#{input}% %")} THEN 1
END, name"
]
请注意,您需要在类方法或范围内调用sanitize,或使用具有访问权限的命名空间,例如ModelName.sanitize或ActiveRecord::Base.sanitize。您可以使用sanitize\u sql\u数组方法。不幸的是,它是一个私有方法,因此必须使用send调用它
您可以使用sanitize\u sql\u数组方法。不幸的是,它是一个私有方法,因此必须使用send调用它
您还可以试用squeel gem: Rian Bates在他的《铁路行家》中很好地介绍了斯奎尔:
您还可以试用squeel gem: Rian Bates在他的《铁路行家》中很好地介绍了斯奎尔:
我得到一个错误:在EOFAh之前找不到字符串查询,是的,您必须终止多行字符串。我忘了。很抱歉。查看我的编辑。我得到一个错误:在EOFAh之前找不到字符串查询,是的,你必须终止多行字符串。我忘了。很抱歉。查看我的编辑。我的一个网站上运行着类似的代码。我可以保证这对%%有效。参数没有填入o。o就在最后。我的一个网站上运行着类似的代码。我可以保证这对%%有效。参数没有填入o。o只是在结尾。