2014-10-20 3 views
0

나는 루비 1.8.7를 사용하고 2.3.2SQL 삽입을 피할 수있는 가장 좋은 방법은 무엇입니까?

다음 코드는 SQL 주입하는 경향이 레일하고

params[:id] = "1) OR 1=1--" 
User.delete_all("id = #{params[:id]}") 

내 질문 SQL 주입을 방지하기 위해 최적의 솔루션이 될 것입니다 다음을 수행하여 또는 아니. 그렇지 않다면 그렇게하는 가장 좋은 방법은 무엇입니까?

User.delete_all("id = #{params[:id].to_i}") 

답변

2

무엇에 대해 :

User.where(id: params[:id]).delete_all 

가 레일에 대한 확인 미안 2.x으로는 :

User.delete_all(["id = ?", params[:id]]) 
Btw는

Check doc

, 당신은 delete_all를 사용하려면 반드시대신, 전자는 콜백을 트리거하지 않습니다.

+0

감사합니다. 나는 이것이 SQL 삽입을 피할 수있는 최선의 방법이라고 생각한다. to_i를 사용하는 데있어서 단점이 있습니까? –

+0

특히,하지만이 pududo 검증의 요점을 보지 못했습니다. – apneadiving

+0

레일이 당신을 위해 처리하므로 코드를 오염시키지 마십시오 – apneadiving

1

이 또한

User.delete(params[:id]) 
0

where 옵션을 전달하기 위해 레일의 방법을 사용하여 사용할 수 있습니다. 당신은 항상 당신이주는 예에서와 같이, 그들을 하드 코드 수 있지만 일반적인 방법은 무엇인가처럼 될 것입니다 : 그들은 잘 테스트하고 새로운 취약점이 발견되는 경우에

User.where(:id => params[:id]).delete_all 
User.where("id = ?", params[:id]).delete_all 
User.where("id = :id", :id => params[:id]).delete_all 

, 업데이트가 문제를 해결하는 것 코드를 변경할 필요가 없습니다. 당신은 단지 해당 ID를 기반으로 한 기록을 삭제하려면 그런데

은, 내가 무엇을 할 것입니다 것은 :

User.find (PARAMS [: ID]).

+0

이전 버전을 사용 중입니다 ... –

1

다른 답변을 파괴 Rails에 대해서도 잘 대답하면 제안을 따르면 잘 작동 할 것입니다. 보다 일반적인 설정에서 직접 처리해야하는 경우 일반적으로 정규 표현식을 사용하여 예상되는 형식의 값을 추출 할 수 있습니다. 이것은 정수 ID를 사용하면 정말 간단합니다. 다음과 같이 생각하십시오.

if params[:id] =~ /(\d+)/ 
    safe_id = $1.to_i 
    # do something with safe_id now 
end 

문자열 및 임의 데이터를 처리 할 때 좀 더 복잡해집니다. 이러한 데이터를 처리해야하는 경우 데이터베이스 어댑터에서 사용 가능한 인용 방법을 사용할 수 있습니다. 레일이 궁극적으로 일관된 인터페이스로 출시된다

safe_string = ActiveRecord::Base.connection.quote(unsafe_string) 

대부분의 데이터베이스 시스템의 경우이 특별한 방식으로 작은 따옴표와 백 슬래시를 처리합니다.

레일스 외부에 있다면 데이터베이스 어댑터와 관련된 인용 방법을 사용해야하지만 사용법은 비슷합니다.

테이크 아웃 : 데이터가 특정 형식이있는 경우

  1. ,
  2. 그렇지 않으면 정규 표현식의 형식을 시행 A의 사용에 대한 데이터 "안전한"확인하기 위해 데이터베이스 어댑터의 인용 기능을 사용 쿼리
  3. 다양한 방법과 조건을 제대로 사용하면 레일스가 대부분을 처리합니다.
관련 문제