2010-03-25 98 views
2

我已經繼承了一些rails應用程序,我需要稍微擴展它。這實際上很簡單,但我想確保我以正確的方式執行它...在ruby-on-rails項目中獲取參數 - 最佳實踐?

如果我訪問myapp:3000/api /個人,它會給我一個XML格式的完整列表。我想在URL中傳遞參數,以便我可以返回與登錄或電子郵件相匹配的用戶,例如yapp:3000/api/persons?login = jsmith會爲我提供相應登錄信息的人員。下面的代碼:

def index 
    if params.size > 2 # We have 'action' & 'controller' by default 
    if params['login'] 
     @person = [Person.find(:first, :conditions => { :login => params['login'] })] 
    elsif params['email'] 
     @persons = [Person.find(:first, :conditions => { :email => params['email'] })] 
    end 
    else 
    @persons = Person.find(:all) 
    end 
end 

兩個問題...

  1. 安全嗎? ActiveRecord是否可以保護我免受SQL注入攻擊(注意我相信正在進入的參數)?
  2. 這是做這件事的最佳方式嗎?還是有一些我不熟悉的自動導軌功能?

回答

0

這裏是關於軌道上的紅寶石安全指南部分SQL Injection。它看起來像你使用哈希條件,是非常安全的。聽起來像使用Person.find_by_loginPerson.find_by_email可能會好一點。

4
  1. 是的,你列出的代碼應該是安全的SQL注入。
  2. 是的,這通常是可以接受的Rails代碼...但

有一些古怪。

您的索引操作將會討論@person和@persons。按照慣例,@persons是預期的,@person是不尋常的。我懷疑你可以消除@person,並且一舉解決問題。像這樣(未經測試):

def index 
    @persons = if params[:email] 
    Person.find_all_by_email(params[:email]) 
    elsif params[:login] 
    Person.find_all_by_login(params[:login]) 
    else 
    Person.all 
    end 
end 

不要忘記更新您的視圖 - 我懷疑它仍在尋找@person。如果您的視圖使用@person進行任何「有趣」的操作,您可能需要將其移至show動作。

+0

note - find_all_by_xxxx返回一個數組,它不應與find_by_xxxx混淆,它將返回任何舊匹配或零。 – Levi 2010-03-26 04:41:05