2013-07-20 2 views
2

매개 변수화 된 PDO 문 : 신뢰할 수있는 상수 값을 매개 변수화해야합니까? 이 쿼리에서

SELECT name FROM customers WHERE location = ? AND active = '1' 
위치의 값은 신뢰할 수없는 소스에서 온 것이지만, 활성의 값은 내가 PHP/MySQL 용 PDO를 사용하고 항상 = 1이 될 것입니다.

또한 의 값을으로 매개 변수화해야합니까?
이 상수가 아니지만 변경되고 신뢰할 수있는 출처에서 제공된 경우 매개 변수화해야합니까? (즉, 캐싱의 이점은 무엇입니까?)

+0

규칙은 다음과 같습니다. 사용자 데이터를 쿼리와 혼합 할 때마다 매개 변수가있는 쿼리 –

+1

을 코드 가독성/이해력에 근거한 의견을 사용합니다. 해당 상수 *가 SQL에 하드 코딩 된 경우. 가변성을 부여하면 코드의 독자가 왜/어디에서 값을 가변 시킬지 궁금해집니다. 그러나 하드 코드 된 경우 한눈에 누군가 "아,이 쿼리는 모든 활성 사용자를 얻습니다"라고 말할 수 있습니다. – goat

답변

3

아니요, 상수 값을 매개 변수화하는 것은 이점이 없습니다.

파라미터 설정의 목적은 응용 프로그램 데이터는 SQL 표현식을 반복안전하게과 결합 될 수 있도록하는 것입니다. 안전한 부분은 SQL 삽입을 방지하는 것입니다. 반복적 인 부분은 다른 값으로 준비된 쿼리를 다시 실행할 수 있으므로 RDBMS가 쿼리를 다시 구문 분석하고 다시 최적화하지 않아도된다는 점입니다.

항상 같은 상수 값을 쿼리에 사용하면 이러한 문제가 발생하지 않습니다. 하드 코드 된 값으로 인해 SQL 주입이 발생할 위험이 없으며 필요할 때 재 파싱하지 않고도 쿼리를 다시 실행할 수 있습니다.

진행중인 매개 변수의 캐싱이 없습니다. 무엇이든 준비된 문을 사용하면 이 더 열악 해져서이 결과를 캐시합니다 (예 : query cache has limitation on caching results from prepared statements). 하지만 일단 준비된 문장을 사용하면 두 개 이상의 매개 변수를 가지고 있는지 여부가 중요하지 않습니다.


왜 정수를 따옴표로 넣을지 궁금합니다. 나는 그것을 많이 보았지만 그것이 어떻게 시작되었거나 그것이 필요하다고 생각하는지 전혀 모른다.

+0

정교하게 관리 할 수 ​​있습니까? 그것은 일반적으로 검색 필터/등으로 조작되는 다른 값과 같이 변경되지 않으므로 캐싱 효과가 없기 때문입니까? 단순히 보안 위협이 없기 때문입니까? 우리가 매개 변수화 한 것이 보안 문제일까요? – prograhammer

+0

인용 부호가 1 인 것은 데이터베이스 유형이 정수인지 아닌지 걱정할 필요가 없다고 생각합니다. 그것은 약한 주장이지만. 하! 저는 습관의 일부가 과거에 이렇게 많이했던 것으로 생각합니다 :'something = ' ".mysql_real_escape_string ($ untrusted)."'모든 것을 둘러싼 따옴표를주의 깊게 조심해서 다루십시오. – prograhammer

+0

감사 빌! 더 명확한 부분이 있다면, 상수가 아니지만 여전히 신뢰할 만하다면 계속 진행하고 매개 변수화한다는 것입니다. – prograhammer