매직 인용문

Magic quotes

마법 따옴표PHP 스크립팅 언어의 특징으로, 전달되기 전에 문자열이 자동으로 이스케이프(백슬래시로 접두사)된다. 신인들이 수동탈출 없이 기능하는 SQL 명령을 쓸 수 있도록 돕기 위해 도입됐다. 이후 SQL 주입 공격에 취약한 코드를 미숙한 개발자가 작성하지 못하도록 하기 위한 의도로 기술됐다.

이 기능은 보안상의 문제로 인해 PHP 5.3.0에서 공식적으로 사용되지 않고 PHP 5.4에서 제거되었다.[1]

개념

현재의 PHP 매뉴얼 개정에서는 마법 인용문 이면의 근거가 "초심자가 작성한 코드가 위험하지 않도록 방지하는 것"[2]이라고 언급하고 있다. 그러나 이는 원래 PHP 2에서 msql에 대한 ph.h 컴파일 시간 설정으로 도입되었으며, "양식 데이터를 msql 쿼리에 직접 전달하기 쉽게"라는 작은 따옴표만 이스케이프했다.[3] 그것은 원래 "보안 기능으로서가 아니라 편의적 기능"으로 의도되었다.[4][5]

사용자가 제공한 모든 데이터의 단일 인용문, 큰따옴표, 백슬래시 및 null 문자는 모두 백슬래시를 앞에 두고 있다가 PHP 3.에서 스크립트로 전달되었다. $_GET, $_REQUEST, $_POST 그리고 $_COOKIE 전지구적 변수 그러면 개발자들은 이론적으로 문자열 연결을 사용하여 사용자가 제공한 데이터와 함께 안전한 SQL 조회를 구성할 수 있다. (기본 지원 데이터베이스는 1바이트 문자 집합만 허용하므로 PHP 2와 PHP 3이 최신 상태일 때 가장 정확했다.)

비판

매직 인용문은 PHP 3과 4의 새로운 설치에서 기본적으로 활성화되었지만, 다음을 통해 비활성화할 수 있었다. magic_quotes_gpc 구성 지시. 마술 인용문의 조작이 막후에서 이루어졌고 즉각적으로 명백해지지 않았기 때문에, 개발자들은 자신의 존재와 그들이 도입할 수 있는 잠재적인 문제들에 대해 모르고 있었는지도 모른다. PHP 문서는 몇 가지 함정을 지적하고, 디폴트로 활성화되었음에도 불구하고 그러한 함정을 비활성화해야 한다고 권고했다.[6]

마법 인용문 관련 문제:

  • 사용자가 제공한 모든 데이터가 데이터베이스에 삽입되는 것은 아니다. 화면에 직접 렌더링하거나 세션에 저장하거나 저장하기 전에 미리 볼 수 있다. 이것은 백슬래시가 원하지 않는 곳에 추가되고 최종 사용자에게 보여지는 결과를 초래할 수 있다. 이 벌레는 종종 널리 사용되는 소프트웨어에도 몰래 들어간다.[7]
  • 사용자가 제공하고 데이터베이스 쿼리에 사용되는 모든 데이터가 마법 인용문으로 보호되는 소스에서 직접 얻어진 것은 아니다. 예를 들어, 사용자가 제공한 값은 데이터베이스에 삽입되고 마법의 따옴표로 보호되며 나중에 데이터베이스에서 검색되어 후속 데이터베이스 작업에 사용될 수 있다. 후자의 사용은 마법의 인용에 의해 보호되지 않으며, 그것에 의존하는 데 익숙한 순진한 프로그래머는 그것을 명시적으로 보호해야 할 필요성을 모를 수도 있다.
  • 매직 인용문은 PHP가 제공하는 일반적인 기능도 사용한다. addslashes() 유니코드를 인식하지 않고 일부 멀티바이트 문자 인코딩에서 여전히 SQL 주입 취약성이 있는 기능. 다음과 같은 데이터베이스별 기능 mysql_real_escape_string() 또는 가능한 경우 바인딩된 매개 변수를 사용하여 준비된 쿼리를 선호한다.[8][9]
  • 많은 데이터베이스 관리 시스템이 백슬래시로 유출된 인용문을 지원하지만, 이 표준은 실제로 다른 인용문을 사용할 것을 요구한다. 마법 인용문은 백슬래시로 유출되는 인용문을 지원하도록 설정되지 않은 데이터베이스에 대한 보호를 제공하지 않는다.
  • 이식성은 응용 프로그램이 마법 인용문이 사용 가능하다는 가정으로 코딩된 후, 사용이 불가능한 서버로 이동하거나, 그 반대로 이동될 경우 문제가 된다.
  • 적절한 경우 마법 인용구를 추가한 후 제거하면 작지만 불필요한 성능 오버헤드가 발생할 수 있다.
  • 매직 인용문은 사이트스크립팅 공격이나 SMTP 헤더 주입 공격과 같은 다른 일반적인 보안 취약점으로부터 보호되지 않는다.

2005년 11월, 핵심 PHP 개발자들은 이러한 문제들 때문에, 마법 인용문 기능이 PHP 6에서 제거될 것이라고 결정했다.[10] PHP 6 개발이 정체되고 대신 5.x 지점에서 개발이 계속되자, PHP 5.3.0에서 기능이 더 이상 사용되지 않고 5.4에서 제거되었다.[1]

기타 접근법

  • Perl[11] Ruby[12] 같은 일부 언어는 데이터 태인을 수반하는 접근방식을 선택하는데, 여기서 사용자 입력과 같이 신뢰할 수 없는 출처의 데이터는 "가공된" 것으로 간주되며 일반적으로 검증이나 인코딩 후 신뢰할 수 있는 것으로 명시적으로 표시될 때까지 위험한 작업에 사용될 수 없다. 이러한 맥락에서 SQL 질의의 구성은 "위험한" 것으로 간주되기 때문에, 이것은 프로그래머가 문제를 해결하도록 강요한다. 태닝은 문제를 해결하지는 않지만 프로그래머가 적절하게 해결할 수 있도록 문제가 있는 경우를 강조한다.
  • 조엘 스폴스키는 데이터가 안전한지 안전하지 않은지를 나타내는 헝가리 표기법을 사용할 것을 제안했다.[13]
  • 현대의 데이터베이스 엔진과 라이브러리는 매개변수화된 쿼리를 사용하여 SQL 명령과 별도로 데이터베이스에 데이터를 전달하므로 쿼리를 구성하기 전에 데이터를 이스케이프할 필요성이 크게 감소한다.

참고 항목

참조

  1. ^ a b "Magic Quotes". PHP Manual. PHP.net. Retrieved 2014-01-17.
  2. ^ "PHP:Why use magic quotes?". PHP documentation. Retrieved 2007-02-19.
  3. ^ "If the MAGIC_QUOTES variable is defined in the php.h file then these quotes will be automatically escaped making it easier to pass form data directly to msql queries". Retrieved 2011-03-27.
  4. ^ "Magic Quotes is oft-understood, even by journeymen PHP programmers".
  5. ^ "Re: [PHP3] what are magic_quotes?". PHP-dev mailing list. 1999-08-27. Retrieved 2011-01-17.
  6. ^ "PHP:Why not to use magic quotes". PHP documentation. Retrieved 2007-02-19.
  7. ^ "Quotation marks are double escaped when editing a comment". WordPress issue tracker. Retrieved 2007-02-19.
  8. ^ Chris Shiflett. "addslashes() versus mysql_real_escape_string()". Retrieved 2007-02-19.
  9. ^ MySQL AB. "Changes in release 5.0.22 (24 May 2006)". MySQL 5.0 Reference Manual. Archived from the original on 22 February 2007. Retrieved 2007-02-19.
  10. ^ PHP Group (2005-11-12). "Minutes PHP Developers Meeting". Retrieved 2007-02-19.
  11. ^ Dan Ragle (2006-04-18). "Introduction to Perl's Taint Mode". webreference.com. Retrieved 2007-03-21.
  12. ^ "Locking Ruby in the Safe". Programming Ruby. Archived from the original on 2009-05-30. Retrieved 2014-05-21.
  13. ^ Joel Spolsky (2005-05-11). "Making Wrong Code Look Wrong". Joel on Software: Painless Software Management. Retrieved 2007-02-19.

외부 링크