2013-08-19 66 views
0

我试图避免在订购时进行sql注入,但我也需要确保NULLS是最后一个。避免sql注入ActiveRecord命令

query = books.order(@vals['order'] + ' NULLS LAST') 

但是,如果我采取@vals [“顺序”]作为API参数我易受SQL注入。有没有更好的方式来形成命令来避免这种情况?

回答

1

如果这实际上只是一个API,那么我只会为您的API使用者提供某些类型的订购,并在您的代码中预先捕获订单条件(例如,白名单方法)。

if @evals['order'] == 'title' 
    ordering = 'title' 
elsif @evals['order'] == 'published' 
    ordering = 'created_at' 
else 
    ordering = 'id' 
end 

query = books.order(ordering + ' NULLS LAST') 

这不是最漂亮的代码,但至少你会安全无需解析参数。

+1

并不像处理注射后那样丑陋;)谢谢! – lostintranslation

+0

任何方式动态允许在表中的任何列的顺序。 I.E.而不用硬编码所有列。 – lostintranslation

+0

Puh ......我不知道从头顶上看,但也许你可以看一下AR文档,看看是否有一个函数为你提供模型的所有属性。然后你可以重复这个...但是真的,我不知道从头顶上。 –