2014-07-21 2 views
3

PHP에서는 mysqli를 사용하여 차이점과 개선점 및 이유를 알려줍니다.실제 이스케이프 문자열 대 바인드 파라미터

나는 실제 이스케이프 문자열로 작성된 전체 프로젝트를 가지고 있으므로 객체 지향형 준비된 명령문으로 변환해야합니까?

+1

[이 '건설적인'질문에는 좋은 토론이있다] (http://stackoverflow.com/questions/13569/mysqli-or-pdo-what-are-the-pros-and-cons) – ahruss

+0

기사 그러나 그것의 차이를 설명하지 않습니다 – shane

답변

5

프로그래머 관점에서 보면 수동으로 값을 이스케이프하는 것과 PDO에서 구현하는 매개 변수화 된/준비된 문과의 차이는 분리, 자동화 및 책임 이동의 정도입니다.

  • 대응 *_escape_string 함수를 통과하고 *_escape_string 함수 탈출에 사용되도록 의도 된 바와
  • 가 SQL 스트링 리터럴 내에 배치되어 개발자가 모든 값이되도록한다 *_escape_string으로

    문자열 리터럴 값만.

개발자가 각 매개 변수의 처리 과정을 추적해야하는 경우 완벽하게 작동 할 수 있습니다. 그러나 그것은 더 복잡 해지는 경향이 있으며 따라서 진술이 점점 복잡해질수록 오류가 발생하기 쉽습니다.

적절한 처리 또는 처리가 누락 된 매개 변수가 하나만있는 경우 SQL 문에 취약 할 수 있습니다. 그리고 솔직히 말해 스택 오버플로 (Stack Overflow)에 실제로 많은 경우가 있습니다.이 수동 기법은 앞에서 지적한 사항 중 하나를 놓치기 쉽기 때문에 오류가 발생하기 쉽습니다.

이와 반대로 PDO는 문에 자리 표시 자만 있으면서 추상화 계층을 제공합니다. 매개 변수 값은 별도로 전달되며 PDO는 적절한 처리 및 처리를 담당합니다. 모든 개발자는 문구를 문 자열로 준비한 다음 준비된 문을 실제 값으로 실행해야합니다.

이제 어느 것이 더 낫습니까? 분명히 후자의 PDO 변형은 오류가 발생하기 쉽고 더 깨끗합니다. 개발자가 고려해야 할 사항은 적습니다. 이제는 PDO가 수행했기 때문입니다.

+0

고마워요 그래서 그것의 인터페이스 이외의 근본적인 차이가 없습니다. * _escape_string 함수는 이스케이프 문자열 리터럴 값에만 사용되기 때문에 SQL 문자열 리터럴 내에 배치 할 수 있습니까? ' 나는이 문구를 모른다. – shane

+0

@ user3667450'* _escape_string' 함수는 마술을하지 않는다. 문자열 리터럴에서 중요한 특정 문자를 이스케이프합니다. 예를 들어, [mysql_real_escape_string']은 NULL ('\ 0'), 라인 피드 ('\ n') QUOTATION MARK ('''')와 SUBSTITUTE ('\ x1a')와 같은 것들이 있는데, 이들 중 일부는 [MySQL 문자열 리터럴] (http : // dev. mysql.com/doc/en/string-literals.html) 문자열 리터럴의 끝을 나타내거나 이스케이프 시퀀스를 나타 내기 때문에. – Gumbo

+0

@ user3667450 그러나 문자열 리터럴 밖의 값을 사용하면 필요가 없습니다 공격자가 문자열 리터럴에서 벗어나 임의의 SQL 코드를 삽입 할 수 있습니다. – Gumbo

관련 문제