2013-08-19 3 views
0

주문시 SQL 주입을 피하려고하지만 NULLS가 마지막인지 확인해야합니다.SQL 주입 피하기 ActiveRecord 주문

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

그러나 @vals [ 'order']를 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 문서를보고 모델의 모든 특성을 제공하는 기능이 있는지 확인할 수 있습니다. 그렇다면 당신은 그것을 반복 할 수 있습니다 ...하지만 정말로, 저는 제 머리 꼭대기에서 알지 못합니다. –