2012-12-20 2 views
3

나는 pg_querypg_exec 함수를 사용하는 PHP 파일이 많이있는 웹 사이트를 가지고 있습니다 ( ). Postgre SQL 쿼리에서 아포스트로피를 이스케이프 처리하지 않습니다.PHP PostgreSQL에서 SQL 쿼리를 이스케이프 처리합니다.

그러나 보안상의 이유로 데이터베이스에 아포스트로피를 사용하여 이름을 저장할 수 있으므로 데이터베이스 입력에 이스케이프 메커니즘을 추가하려고합니다. 가능한 해결책은 모든 PHP 파일을 통해 으로 이동하고 pg_querypg_execpg_query_params을 사용하도록 변경하는 것입니다. 그러나 시간이 많이 걸리므로 과 오류가 발생하기 쉽습니다. 좋은 생각은 어떻게 든 과 pg_exec을 PHP 파일을 변경하지 않고도 이스케이프를 수행 할 래퍼 함수로 대체하는 것이지만이 경우에는 PHP 함수 정의를 변경하고 매우 그렇지 않은 경우 다시 컴파일해야합니다. 이상.

그래서 질문은 열려 있고 은 최소한의 시간 소비로 원하는 것을 할 수있는 아이디어는 대단히 환영합니다.

+1

그래서, 당신은 많은 PHP 파일에서 데이터베이스를 호출하고 있습니까?PHP 함수를 덮어 쓰고 안전하게 다시 작성하는 번거 로움을 덜어 주시겠습니까? 제발 그렇게하지 마. 이것은 데이터베이스를 일반적으로 재 작업 할 때가 될 수 있습니다. 많은 PHP 파일들이 모두 데이터베이스에 직접 액세스해야 함을 의미하지 않기 때문에 (MVC) – Najzero

+0

가능한 중복 http://stackoverflow.com/questions/6030249/is-there-php-mysql-real-escape-string-for- postgresql –

+0

@ShyamK 질문이 전혀 관련이 없습니다 –

답변

2

이것은 데이터베이스 계층과 관련 API가 많은 시간을 절약 할 수있는 완벽한 예입니다. 좋은 해결책은 DB 클래스를 싱글 톤으로 만드는 것입니다. 싱글 톤은 앱의 어느 곳에서나 인스턴스화 할 수 있습니다. 래퍼 함수의 간단한 세트를 사용하면 DB에 대한 모든 쿼리를 한 지점으로 진행할 수 있으므로 작업 방법을 매우 쉽게 변경할 수 있습니다. 하나의 DB에서 다른 DB로 변경하거나 하나의 DB 공급 업체에서 다른 DB 공급 업체로 변경할 수도 있습니다.

이스케이프 처리시 발생하는 문제는 pg_query()와 같은 기능 대신 PDO 인터페이스를 사용하여 적절하게 해결되므로 이스케이프 처리가 불필요합니다. DB를 사용하는 앱의 모든 부분을 변경해야하므로 리팩토링 담당자는이 패턴을 동일한 양의 작업으로 사용할 수 있습니다.

class db_wrapper { 

    // Singleton stuff 
    private $instance; 

    private function __construct() { 
     // Connect to DB and store connection somewhere 
    } 

    public static function get_db() { 
     if (isset($instance)) { 
      return $instance; 
     } 
     return $instance = new db_wrapper(); 
    } 

    // Public API 

    public function query($sql, array $vars) { 
     // Use PDO to connect to database and execute query 
    } 

} 

// Other parts of your app look like this: 

function do_something() { 
    $db = db_wrapper::get_db(); 
    $sql = "SELECT * FROM table1 WHERE column = :name"; 
    $params = array('name' => 'valuename'); 
    $result = $db->query($sql, $params); 

    // Use $result for something. 
} 
3

당신은 어떤 코드를 게시하지 않습니다하지만 난 당신이 이것을 가지고 추측 :

$name = "O'Brian"; 
$result = pg_query($conn, "SELECT id FROM customer WHERE name='{$name}'"); 

... 그리고이 있어야합니다 것 :

$name = "O'Brian"; 
$result = pg_query_params($conn, 'SELECT id FROM customer WHERE name=$1', array($name)); 

을 ...하지만 당신이 생각 작업은 부당한 시간을 소비합니다.

확실히 복잡하지만 대체 방법은 무엇입니까? pg_query()을 무시할 수는 없지만 my_pg_query()을 검색하고 바꿀 수 있습니다. 그리고 지금 뭐야? 사용자 정의 함수는 문자열이 표시됩니다

SELECT id FROM customer WHERE name='O'Brian' 
SELECT id FROM customer WHERE name='foo' OR '1'='1' 

을 버그없는 SQL 구문 분석기 구현하기 위해 관리하는 경우에도 : 그것은 유효하지 않은 SQL 안정적으로 작동하지 않습니다

  1. 합니다.
  2. 쿼리가 의도적 인 SQL 주입 제품인지 여부를 판단 할 수 없습니다.

하나씩 쿼리를 수정하면됩니다. 시간이 많이 걸릴지 모르지만 생각만큼 많이하지는 않습니다. 귀하의 앱이 점점 더 좋아질 것입니다.

+0

"하지만 당신은 그 작업이 비합리적인 시간을 소비 할 것이라고 생각합니다."라는 말은 조숙 한 최적화를 의미합니다. 최적화 클럽의 규칙 1은 "최적화하지 않음"입니다. 최적화 클럽의 규칙 2는 "먼저 측정하지 않고 최적화하지 마십시오." –

+0

보안 구멍을 고치는 것이 "최적화"라고 할 수 없다고 생각합니다 ... –

+0

아니요. 여하튼 따옴표를 붙이면 데이터베이스 액세스 속도가 느려지므로 조기에 최적화하는 것이 걱정됩니다. –

관련 문제