이전 PHP 버전에서는 get_magic_quotes_gpc () 함수를 사용하여 magic_quotes_gpc 구성 항목이 활성화되어 있는지 여부를 결정했습니다. 이 항목이 켜져 있으면 PHP는 Get , Post 및 Cookie를 통해 제출 된 데이터를 자동으로 탈출합니다. 즉, 특수 문자 (예 : 단일 따옴표 , 이중 인용문 및 백 슬래시 \ ) 앞의 백 슬래시를 자동으로 추가합니다. 이것은 SQL 주입을 방지하기위한 것이지만,이 관행은 많은 시나리오에서 불편을 초래할 것이며 심지어 데이터에서 두 배에 걸리게됩니다.
magic_quotes_gpc가 활성화되면 사용자가 제출 한 데이터가 탈출 문자로 자동 추가되었습니다. 개발자가 데이터를 수신 한 후 이러한 입력을 처리하기 위해 AddSlashes () 및 기타 기능을 수동으로 사용하면 이중 탈출 문제가 발생합니다. 예를 들어, 원래 입력 한 문자열은 다음과 같습니다.
I'm a user.
Magic_Quotes_gpc 에 의해 처음으로 자동으로 탈출되면 다음이됩니다.
I\'m a user.
현재 AddSlashes ()를 사용하는 경우 다음과 같습니다.
I\\'m a user.
그런 다음 데이터베이스에 저장된 콘텐츠는 사용자의 원래 의도와 일치하지 않으며 데이터 혼동을 쉽게 유발할 수 있습니다.
이중 탈출을 피하기 위해 개발자는 먼저 magic_quotes_gpc가 활성화되어 있는지 여부를 결정해야합니다. 활성화 된 경우 먼저 데이터 반전을 수행 한 다음 필요에 따라 수동 탈출을 수행할지 여부를 결정하십시오.
모든 데이터의 백 슬래시가 올바르게 제거되도록 사용자의 배열 입력을 재귀 적으로 처리 할 수 있습니다.
다음은 샘플 코드입니다.
<code> function cleanInput ($ data) {if (is_array ($ data)) {return array_map ( 'cleanInput', $ data); } else {return stripSlashes ($ data); }} if (get_magic_quotes_gpc ()) {
$ _get = cleanInput ($ _ get);
$ _post = CleanInput ($ _ post);
$ _cookie = CleanInput ($ _ 쿠키);
}
</코드>
이 예에서는 어레이에서 각 값을 재귀 적으로 처리하는 CleanInput () 함수를 정의하여 StripSlashes () 호출하여 불필요한 탈출 문자를 제거합니다. get_magic_quotes_gpc () 가 true를 반환하면 3 개의 hyperglobal 배열, $ _get , $ _post 및 $ _cookie가 청소됩니다.
Magic_Quotes_GPC는 PHP 5.4.0에서 더 이상 사용되지 않았으며 PHP 7.0.0에서 완전히 제거되었습니다. 따라서 현대 PHP 개발에는이 문제가 더 이상 존재하지 않습니다. 그러나 오래된 프로젝트를 유지하거나 일부 레거시 시스템을 처리 할 때는 여전히이를 처리하는 방법을 알아야합니다.
이전 버전의 PHP를 사용하고 업그레이드 할 수없는 경우 프로젝트가 초기화 될 때 통합 처리 로직을 수행하는 것이 좋습니다. 후속 작업을 수행하기 전에 모든 입력을 정리하십시오.
또한, 파라미터 결합 메커니즘과 결합 된 최신 데이터베이스 액세스 방법 (예 : PDO)을 사용하면 SQL 주입을 방지 할 수있을뿐만 아니라 수동으로 빠져 나가는 문자열의 번거음을 피할 수 있습니다. 예를 들어:
<code> $ pdo = new pdo ( 'mysql : host = localhost; dbname = test', 'user', 'password'); $ stmt = $ pdo-> 준비 ( 'Select * where email = : email'); $ stmt-> execute ([ 'email'=> '[email protected]']); </코드>위에서 볼 수 있듯이, 파라미터 결합은 SQL의 직접적인 스 플라이 싱을 피하고, 탈출 및 주입의 문제를 근본적으로 해결합니다.
Magic_Quotes_GPC 의 자동 탈출 메커니즘은 "겉보기에 안전한"디자인이지만 실제 개발에 더 많은 문제가 발생합니다. 작업 원칙을 이해하고 적절한 처리 방법을 채택하면 데이터의 이중 탈출 문제를 효과적으로 피할 수 있습니다. 동시에, 현대의 PHP 프로그래밍 패러다임 및 데이터베이스 인터페이스를 사용하여 코드의 유지 관리 및 보안을 향상시키기 위해 이러한 구식 기능에 대한 종속성을 점차적으로 제거하는 것이 좋습니다.