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只是在结尾。