2011-09-28 2 views
2

그래서, 이것은 실제로 Rails 패턴 질문입니다.'#show'동작에서 ID를 필터링/검증하는 가장 좋은 방법은 무엇입니까?

나는 레일즈 3.0.9 응용 프로그램을 가지고 있습니다. 우리는 Airbrake를 사용하여 오류를 감지하고보고하며, 이는 프로그램 설계에서 마지막 몇 가지 누설을 조정하는 데 도움이됩니다.

잘못된 입력으로 로봇 (Google, 크롤러 등) 만 공격합니다.

ActiveRecord::StatementInvalid: PGError: ERROR: invalid input syntax for integer: 
"google_ads_dbg" LINE 1: ....message_thread_id WHERE "message_threads"."id" = 
'google_ad...^: SELECT "message_threads".* FROM "message_threads" INNER JOIN  
"message_thread_users" ON "message_threads".id = "message_thread_users".message_thread_id 
WHERE "message_threads"."id" = 'google_ads_dbg' AND (("message_thread_users".user_id = 
33899)) LIMIT 1 

평온한 경로 :

resource :inbox do 
    resources :messages 
end 

MessagesController 번호의 첫 번째 줄은

@message_thread = current_user.message_threads.find(params[:id]) 

보여 내가 입력의 정수 다움을 검증하기 위해 모든 .find params[:id] 전화를 앞에합니까? 내 routes.rb에 resource 행마다 :constraints => {:id => /[0-9]+/} 행을 붙이시겠습니까?

답변

2

여러 자원에 대한 제한을 한 번에 제공 할 수 있습니다.

scope :constraints => { :id => /\d+/ } do 
    resources :inbox do 
    resources :messages 
    end 
end 

이것은 나에게 가장 합당합니다. 컨트롤러에서 before-filters의 정수를 검증 할 수는 있지만 상황에 따라 지저분한 대안이라고 생각합니다.

+0

이것은 매우 의미가 있습니다. 라우팅 스코프를 잊어 버렸습니다. – nessur

+0

다음과 같은 질문이 있습니다.이 솔루션은 일반적인 라우팅 패턴의 일부가 아닌 드문 입력 문제입니까? 사이트 보안 및 안정성이 필수적인 것 같습니다. – nessur

관련 문제