2010-01-25 2 views
2

SQL 인젝션에 대해 잘 알지 못하는 동료가 입력을 이스케이프 처리하고 매개 변수 배열을 대신 전달하는 것을 기억할 필요가 없도록 매개 변수가있는 쿼리를 사용하기 위해 직장에서 사용하는 데이터베이스 라이브러리를 업데이트하려고합니다. 나는 pg_query_params를 사용하고 있습니다).매개 변수화 된 쿼리의 외삽 된 버전을 얻으려면 어떻게해야합니까?

그러나 문제가 발생합니다. 데이터베이스 라이브러리의 요구 사항 중 하나는 실행되는 각 쿼리를 기록한다는 것이고 매개 변수가 채워지면 매개 변수화 된 쿼리의 텍스트를 가져 오는 방법을 알 수 없습니다. 매개 변수화 된 쿼리에 대한 내 자신의 함수를 롤백하는 것 외에는)?

pg_query_params('SELECT id FROM table WHERE foo = $1', array('bar')); 

같은 매개 변수가있는 쿼리를 실행할 때 즉

, 나는 (pg_query_params에 의해 사용되는)

SELECT id FROM table WHERE foo = 'bar' 

답변

2

PostgreSQL 확장 프로토콜 같은 것을 얻을 쿼리에서 매개 변수를 분리하려고합니다.

쿼리는 궁극적으로 서버 쪽에서 만 구성되며 PostgreSQL의 기능 만 사용하여 클라이언트 쪽에서 쿼리를 구성 할 수 없습니다.

preg_replace을 사용하여 매개 변수를 전송하기 전에 제공된 매개 변수의 값을 대체하고 쿼리를 기록 할 수 있습니다.

업데이트 :

그런 다음 주기적으로 PostgreSQL 테이블에이 파일을로드, 서버 측에서 파일이나 (바인딩 매개 변수를 포함하여) syslog에 쿼리를 기록 할 PostgreSQL logging을 활성화 할 수 있습니다.

+0

postgres에서 마지막으로 실행 된 쿼리를 가져올 방법이 없습니까? 'preg_replace' 등을 사용할 수는 있지만 어쨌든 수동으로 인용하거나 이스케이프 처리해야합니다. –

+1

페이지의 나머지 부분과 함께 쿼리를 출력 할 수 있어야하기 때문에 정확하게 문제가 해결되지는 않지만 질문에 답하기 때문에 받아 들였습니다. –

0

소스 코드의 모든 항목을 자신의 래퍼 함수로 바꿀 수있는 경우가 아니면 (PHP에서 자동 추가 기능을 사용하여 래퍼 선언을 포함 할 수 있습니다) 데이터베이스 수준에서만이 작업을 수행 할 수 있습니다.

C.

관련 문제