2009-12-23 7 views
0

mySQL 쿼리를 파일에 저장하고 싶습니다. 내 프로그램의 변수로 문자열의 일부를 문자열로 바꿀 계획입니다.파일에서 문자열을 평가하는 쉬운 방법은 무엇입니까?

나는 루비에서 'eval'메서드로 놀았지만 제대로 작동하지만 약간의 어색함이 느껴진다.

irb를 사용하여 다음을 수행했습니다.

>> val = 7 
=> 7 
>> myQuery = "select * from t where t.val = \#{val}" #escaped hash simulates reading it from file 
=> "select * from t where t.val = \#{val}" 
>> myQuery = eval "\"#{myQuery}\"" 
=> "select * from t where t.val = 7" 

알 수 있듯이 작동합니다. 하지만 그것이 작동하도록하려면 'myQuery'변수를 이스케이프 된 따옴표로 묶어야하고, 모든 것이 약간 지저분 해 보입니다.

더 쉬운 방법이 있습니까?

답변

1

일반적으로, 당신은 SQL 쿼리를 구축하는 문자열 보간을 사용하지 않아야합니다. 이렇게하면 SQL injection 공격을받을 수 있습니다. 누군가가 닫는 따옴표 문자가있는 입력을 제공하고 다른 쿼리가 이어집니다. 예를 들어, 귀하의 예제를 사용 : 인스턴스 누군가가 자신의 입력에 인용 부호를 포함하기위한 경우

>> val = '7; DROP TABLE users;' 
=> "7; DROP TABLE users;" 
>> myQuery = "select * from t where t.val = \#{val}" 
=> "select * from t where t.val = \#{val}" 
>> eval "\"#{myQuery}\"" 
=> "select * from t where t.val = 7; DROP TABLE users;" 

심지어 악의적 인 입력없이, 당신은 단순히 실수로, 당신이 의도되지 않은 코드를 실행할 수 있습니다.

절대적으로 필요한 경우가 아니면 eval을 사용하지 않는 것이 좋습니다. 프로그램에 버그가있는 경우 다른 사람이 eval으로 전달하여 임의의 코드를 실행할 수 있으며 일부 소스 코드가 일반 소스 트리가 아닌 다른 위치에서로드되기 때문에 코드 유지 관리가 어려워 질 수 있습니다.

그럼 대신 어떻게해야합니까? 데이터베이스 API에는 일반적으로 prepare 명령이 포함되어 있으며 SQL 문 실행을 준비 할 수 있습니다. 이 명령문에는 ? 문자를 포함 할 수 있습니다.이 문자는 해당 명령문에서 대체 할 수있는 매개 변수를 나타냅니다. 그런 다음 문에 execute을 호출하여 해당 매개 변수의 값을 전달하면 다른 사람이 임의의 SQL을 실행하는 방법이 없어도 안전하게 실행됩니다.

다음은 귀하의 예에서 작동하는 방법입니다. 이것은 this MySQL/Ruby module을 사용한다고 가정합니다. 다른 인터페이스를 사용하는 경우 인터페이스가 동일하지만 정확히 같지 않을 수 있습니다.

>> val = 7 
>> db = Mysql.new(hostname, username, password, databasename) 
>> query = db.prepare("select * from t where t.val = ?") 
>> query.execute(val) 
0

대신 ERB 템플릿을 사용하여 파일에서 읽고 변수를 삽입 할 수 있습니다 (< % = something %> 태그를 실제 값으로 변환).

Here's the official doc은 매우 완전하고 간단합니다. 프로그램이 변수를 사용하는 미리 알고 있다면

0

당신은 문자열 교체

"123 %s 456" % 23 # => "123 23 456" 

이 유일한 작품 같은 문법의 printf를 사용할 수 있습니다.

0

매개 변수화 된 쿼리를 사용할 수 있습니까?

나는 루비에서 그렇게하는 법을 알지 못하지만 기본적으로 SQL이 인식하는 명령으로 SQL 문을 표시하는 것은 SQL 문과 함께 전송되는 매개 변수로 바뀝니다.

이 링크는 도움이 될 수 있습니다 : http://sqlite-ruby.rubyforge.org/sqlite3/faq.html#538670816

관련 문제