2016-10-31 2 views
0

someposts은 검색 상자에서 사용자 입력을 ActiveRecord Parameterized 문으로 변환하는 것에 대해 설명했습니다.이 문은 SQL 주입에 취약 할 수 있지만 솔루션이있을 수 있습니다.레일 : SQL 주입에 대해 여전히 혼란 스럽습니다

검색 방법은 다음과 같습니다. 사용자가 검색 창에 이런 식으로 뭔가를 입력 :

query = ["name LIKE ? AND address.town NOT LIKE ?", "hello", "villa"] 

에 대한 : 내부적으로

name="hello" AND NOT address.town="Villa" 

, 내가로 변환

다음
if search 
    query = convert_search_to_query search 
    begin 
    includes(:address).where(query) 
    # rescue Exception ... 
... 
... 

내 생각 : 단순히 사용자 -을 확인 입력 된 속성 (이 경우 "name", "address.town")을 사용하여 허용 가능한 사용자 속성 목록에이라는 일치 항목이 정확히 일치하는지 확인하십시오 ().

내가 이것을 수행한다면 사용자 입력의 유일한 부분을 처리하기 위해 매개 변수화 된 문 ('?')을 사용하고 있으므로 SQL 삽입이 불가능할 것이라고 생각합니다. 그가 각 속성에 대해 입력 한 값.

여기에있는 다른 게시물에서 읽은 내용을 토대로이 코드가 일반적인 매개 변수화 된 검색보다 더 취약 할 수는 없지만 SQL 주입에 대한 많은 경험이 없습니다. 그것은 취약한가요? 또한

: 내가 거기에 도움을 줄 수 있습니다 플러그인이 있습니다,하지만 내가 원하는 것은 정말 매우 간단합니다, 이미 작동하고, 나는 오히려만큼 가볍고 내 응용 프로그램을 유지 거라고 이해

가능한.

+2

레일에 주사를 방지하려면 활성 레코드 만 사용하십시오. 레일에서 직접 SQL 쿼리를 수행 할 필요가 없습니다. –

+0

사용자가 동적 쿼리를 입력 할 수 있습니까? – ineedahero

+1

ActiveRecord는 SQL이 작동하는 곳이면 어디에서나 작동합니다. 설명서를 읽으십시오. SQL을 사용하고 주입에 대해 걱정해야하는 것보다 훨씬 쉽습니다. –

답변

1

ActiveRecord는 SQL 주입 공격을 막습니다. 당신은 매개 변수화 된 양식을 사용하고 있습니다. 일반적으로, ALL 사용자로부터 오는 정보는 매개 변수 여야합니다. 액티브는 SQL 주입에서 hellovilla을 보호 할이 경우

where(["name LIKE ? AND address.town NOT LIKE ?", "hello", "villa"])

하지만 name LIKE ? AND address.town NOT LIKE ?을 보호하지됩니다 : 당신의 예에서

당신은으로 사용자 쿼리를 변환 말할 것도. ActiveRecord는 개발자 (하드 코드) 또는 응용 프로그램에서 name LIKE ? AND address.town NOT LIKE ?이 생성되고 있다고 가정합니다.이 경우 실행하는 것이 안전하다고 가정합니다.

따라서 name LIKE ? AND address.town NOT LIKE ?의 일부분이 사용자로부터 유입되면 앱이 SQL 주입 공격에 취약 할 수 있습니다.

올바른 방법은 언어 구문 분석기를 사용하여 사용자 쿼리를 완전히 분해 한 다음 안전한 쿼리로 다시 생성하는 것입니다. regex를 사용하면 Regex와 보안의 마스터가 아닌 한 순응적인 접근이 가능합니다.

+0

정규 표현식을 시도하고 있으며 마스터 XD에서 멀리 떨어져 있습니다. – ineedahero

관련 문제