2010-03-23 3 views
10

가능한 경우 버그가있는 가능한 정규식을 수동으로 작성하지 않고도 사용자 입력과 관련된 문자열을 삭제하려고합니다. 그러나 이것이 올바른 방향으로 나를 가리킬 수 있다면 감사 할 수있는 유일한 방법입니다. 아무것도 놓치지 않을 것 같은 정규식. Rails에는 네이티브 SQL 명령을 입력 할 수있는 여러 가지 방법이 있습니다. 사람들이 어떻게 사용자 입력을 피할 수 있습니까?Ruby on Rails : 찾기를 사용하지 않을 때 SQL 용 문자열을 어떻게 위생 처리합니까?

필자가 묻는 질문은 넓은 의미이지만, 필자의 특별한 경우에는 필자가 알기에 레일스가 네이티브로 이해하지 못하는 포스트그레스 데이터베이스의 칼럼으로 작업하고있다. 텍스트 검색 정보. Rails는 문자열 인 것처럼 문자열을 쓰고 읽을 수 있지만 문자열과 달리 벡터 내부에 vector = 같은 일을하면 자동으로 이스케이프 처리되지 않는 것처럼 보입니다.

예를 들어, 내가 model.name = '::'을 수행 할 때, name은 문자열이고, 제대로 작동합니다. 내가 model.vector = '::'그 오류를 수행 할 때 :

ActiveRecord::StatementInvalid: PGError: ERROR: syntax error in tsvector: "::" 
"vectors" = E'::' WHERE "id" = 1 

을이 세미콜론의 탈출의 부족으로 인한 문제가 될 것 같다, 나는 수동으로 미세 벡터 =을 '::'설정할 수 있습니다 . 원시 SQL 명령이의 탈출 방법을 찾아 액세스 할 수 없기 때문에,

ActiveRecord::Base.connection.execute "UPDATE medias SET vectors = ? WHERE id = 1", "::" 

그러나,이 구문이 작동하지 않습니다

는 또한 어쩌면 난 그냥 뭔가를 호출 할 수 있습니다, 밝은 생각을했다 와? 표.

이것은 모든 유형의 사용자 입력으로 connection.execute를 호출하는 것과 동일한 문제로 나타납니다. 모든 문제는 문자열을 살균하는 것으로 끝나지 만 Rails의 SQL 문자열을 수동으로 호출하는 방법을 찾지 못하는 것 같습니다. 위생 처리 방법. 누구든지 조언을 해줄 수 있습니까?

답변

14

모델에이 방법을 추가

class Media < ActiveRecord::Base 
    def self.execute_sql(*sql_array)  
    connection.execute(send(:sanitize_sql_array, sql_array)) 
    end 
end 

지금 당신과 같은 모든 SQL을 실행할 수 있습니다

Media.execute_sql('UPDATE medias SET vectors = ? WHERE id = 1', '::') 

참조

1) 팁을위한 sanitize_sql_array

+1

감사합니다, 네가 말했듯이 정확하게 일했다. 불행히도, 레일스는 SQL에 콜론 (:)을 실제로 살균하지 못하는 것 같아요. 아마도 콜론이 소독되도록 요구하는 것은 송수화기에 고유합니다. 나는 삐걱 거리는 정규 표현식 경로로 가야 할 것처럼 보입니다. –