2011-03-28 3 views
0

이것은 레일 앱이지만 일반 루비 질문에 더 많은 것이 있습니다.Ruby : 가변 변수/메소드 호출 + 보안 문제

나는 여러 범위의 모델을 가지고 있습니다. 예를 들면 :

Photo.recent 
Photo.popular 
Photo.featured 

내가 가지고 내가 하나의 PARAM을 통과 할 수 있도록하려면 내 응용 프로그램에서보기 "사진을 찾아"사용자들이보기를 원하는 범위, 즉 지정할 수 있습니다 :

example.com/photos/browse?view=recent 

이것은 저에게 params [: view]를 주며 Photo에 메서드 호출로 첨부해야합니다.

제 첫 질문은 루비에서 어떻게 그런 일을 할 수 있느냐입니다.

둘째, 사진 첨부 만하면 입력을 제한 할 수 없다면 보안 상 위험 할 수 있습니다. whatever the user types in the url 그러면 해커가 말하는 위험에 처해 있습니다. example.com/photos/browse?view=delete_all 분명히 나쁜 생각입니다.

두 번째 질문은 URL에서 param을 안전하게 받아 들일 수있는 몇 가지 종류의 메소드를 호출하여 사용자가 사용할 수있는 경우에만 정보를 반환 할 수있는 방법으로 허용 목록이나 뭔가를 만들 수있는 방법입니다. 유효한 명명 된 범위를 요청합니다.

마지막으로 관리자 용 범위 만 있습니다. 사용자가 아무 것도 인증되지 않았는지 확인하기 위해 current_user.has_role?을 쿼리 할 수 ​​있도록 사용자 기능이 정의되어 있습니다 (CanCan 사용). 그러나 사용 권한을 범위와 연관시키는 방법이 있습니까?

감사합니다. 당신이이 범위의 많은가없는 한

답변

2

TBH, 난 그냥 그들을 하드 코딩하거나 당신이 말한 정확히하고 싶지 않을 경우

를 람다에 대한 URL PARAM 값을 매핑 해시를 만들 것 , 당신은 같은 일을 할 수있는 :

whitelist = %w(
    recent 
    popular 
    featured 
) 

if whitelist.include? params[:view] 
    photos = Photo.send params[:view].to_sym 
end 

참조 : http://apidock.com/ruby/Object/send

편집 : 아마도이 시도?

if Photo.valid_scope_name? params[:view] 
    photos = Photo.send params[:view].to_sym 
end 

그것은 당신이 사용해야 할 수도 있습니다 있도록 보호 방법은 다음과 같습니다

if Photo.send :valid_scope_name?, params[:view] 
    photos = Photo.send params[:view].to_sym 
end 

http://apidock.com/rails/ActiveRecord/NamedScope/ClassMethods/valid_scope_name%3F

+0

이 방법은 유용 할 것으로 보이며 범위의 수를 관리 할 수 ​​있다고 생각합니다. 호기심에서 수작업으로 작성된 화이트리스트없이 어떻게 할 수 있습니까? – Andrew

+0

@Andrew 편집 참조 –

1

이 방법을 보내려면 send 방법 : 그러나

Photo.send(params[:view].to_sym) 

를 사용 , 당신은 이것이 (보안상의) 우려라고 생각하는 것은 100 % 정확합니다. 이후에 다음과 같은 작업을 수행 할 수 있습니다.

Photo.send(params[:view].to_sym) if %w(recent popular featured).include?(params[:view]) 
+0

참고로 보내기 메서드는 문자열도 허용합니다. to_sym은 필요 없습니다. – icecream