gpt4 book ai didi

ruby-on-rails - 这样容易出现SQL注入(inject)吗?

转载 作者:行者123 更新时间:2023-12-02 15:34:22 29 4
gpt4 key购买 nike

在我的 Controller 操作中,我有以下内容:

def index
@articles = (params[:mine] == "true") ? current_user.articles : Article.search(params[:search])
@articles = @articles.sort! { |a,b| b.created_at <=> a.created_at }
@articles = Kaminari.paginate_array(@articles).page(params[:page]).per(25)

respond_to do |format|
format.html
format.json { render json: @articles }
end
end

在模型中:

  def self.search(search)
if search.present?
where("category LIKE ? OR article_type LIKE ?", "%#{search}%","%#{search}%")
else
find(:all)
end
end

据我了解,如果直接在查询中使用参数,则可能会发生 SQL 注入(inject)。在这里,我通过 Article.search(params[:search]) 将参数直接传递到 where 查询。这样容易出现SQL注入(inject)吗?如果是的话,我怎样才能让它更安全?我也怀疑我是否正确编写了 Controller 代码。如果您对重构 Controller 代码有建议,请告诉我,我们将非常感激。非常感谢!

最佳答案

对于您的查询,您应该尝试使用 ActiveRecord 提供的方法或通过 Arel 本身(不过您当前的方法很好)。这将确保您的 SQL 被正确转义。如果您现在不想深入了解 Arel 的详细信息,您可以使用像 squeel 这样的 gem。或meta_where (对于较旧的 rails )。

我强烈推荐这些 gem 来满足您的大多数查询构建需求。任何更高级的内容都可以直接使用 Arel 写出。

我不记得,如果您可以在没有帮助的情况下直接使用基本的 ActiveRecord.where 语法进行匹配 (LIKE) gem ,还没有。但您绝对可以直接在 Arel 中执行此操作。

articles = Article.arel_table
articles = articles[:category].matches("%#{search}%").
or(articles[:article_type].matches("%#{search}%"))

此时,您可以对 articles 执行 to_a 或使用 to_sql 并将其传递给您的 Article使用 find_by_sql 进行模型。

Article.find_by_sql articles.to_sql

will_paginate有一个 paginate_by_sql 方法,我认为 kaminari 也会有一个方法(或者至少我认为会有)。

对于您的 Controller 代码,如果可以的话,我会将任何类型的排序选项传递给数据库(这也适用于您的分页)。

articles.sort('`articles`.created_at DESC')

您现在使用的方法将抓取“所有”[允许的]记录,然后排序,然后返回您的per_page限制。在这种情况下,这根本违背了分页的目的。

至少,尝试将当前设置重构为:

@articles = (params[:mine] == "true") ? current_user.articles : Article.search(params[:search])
@articles = @articles.sort('`articles`.created_at DESC').page(params[:page]).per(25)

只要您传递 ActiveRelation,由于 Rails 延迟加载数据库查询的方式,您就可以将其他内容绑定(bind)到此。

关于ruby-on-rails - 这样容易出现SQL注入(inject)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12127496/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com