2010-11-24 4 views
2

Rails 3 앱 페이지에서 비즈니스 이름이나 도시로 클라이언트를 검색 할 수있는 검색 창이 있다고 가정 해 보겠습니다. 내 컨트롤러의 인덱스 메서드에서이 작업을 수행합니다.이 Rails 3 검색은 SQL 삽입에 취약합니까?

if params[:search] 
    @clients = Client.where("clients.business_name LIKE :business_name OR clients.city = :city", :business_name => "%#{params[:search]}%", :city => params[:search]) 

이러한 해시 값은 SQL에 대체되고 따옴표로 묶입니다. 검색 창에 입력 한 내용이 따옴표 나 다른 위험한 문자가 포함되어있는 경우 다음과 같이 개발 로그에서 이스케이프 처리되는 것을 볼 수 있습니다.

... WHERE (clients.business_name LIKE '% Something \'DROP TABLE Foo % '...

또는

그래서
...WHERE... OR clients.city = 'Something OR 1=1') 

OR 1=1는 따옴표 레일의 내부에 있기 때문에 그냥 도시 이름에 대한 일치를 생산하지 않으며, DROP TABLE 시도에서 인용 이후, 탈출하고, 추가 업체명도 일치하지 않습니다.

이것은 실제로 준비된 명령문을 사용하지 않습니다. 검색 값이 채워지지 않은 상태에서 쿼리가 데이터베이스로 먼저 보내지면 검색 값이 데이터베이스로 보내져 채워집니다. 가장 안전한 방법이라고 생각했습니다. 그러나 레일스는 그것을하지 않습니다. 나는 이것이 모든 데이터베이스에서 이용 가능하지 않고 구현이 다양하기 때문에 이것이라고 생각한다.

어떤 방식 으로든 SQL 주입이 가능합니까? 나는 그것을 보지 못했지만, 다시 말해, 준비된 문장을 사용하지 않기 때문에 궁금합니다. 취약점이있는 경우 어떻게하면 더 안전하게 수행 할 수 있습니까?

답변

5

아니요, 여기에 SQL 삽입 취약점이 없습니다. ActiveRecord는 두 번째 매개 변수로 전달한 해시 값을 where으로 connection.quote으로 호출하므로 사용자는 안전합니다.

내가 생각할 수있는 유일한 잠재적 인 SQL 주입 지점은 connection.quote에 발견되지 않은 버그가있는 경우 일 수 있습니다. 이것은 거의 없습니다.

+0

많은 사람들이이 질문을보고 아무도 취약점을 지적하지 않았기 때문에이 대답을 수락합니다. 감사! 물론, 누군가 발견하면, 나는 그것을 바꿔야 할 것이다. –