현재 위치: > 최신 기사 목록> get_magic_quotes_gpc의 일반적인 오류 기능 : 마법 따옴표를 무시하지 않는 방법?

get_magic_quotes_gpc의 일반적인 오류 기능 : 마법 따옴표를 무시하지 않는 방법?

gitbox 2025-06-10

이전 버전의 PHP에서는 get_magic_quotes_gpc ()가 "마술 따옴표"가 활성화되어 있는지 여부를 감지하는 데 사용되는 함수입니다. Magic Quotes는 SQL 주입 공격을 방지하려는 목표로 PHP가 사용자 입력 데이터 (예 : $ _get , $ _post , $ _cookie 와 같은)에서 따옴표를 자동으로 스케이프하는 메커니즘입니다. 그러나 PHP 버전의 업그레이드 로이 기능은 안전하지 않고 혼란스러워하는 것으로 간주되었으며 결국 PHP 5.4에서 완전히 제거되었습니다.

그럼에도 불구하고, 많은 오래된 프로젝트와 코드는 여전히 get_magic_quotes_gpc ()를 사용하고 있으며, 특히 마법 따옴표를 무시할 때 데이터 처리 오류 및 보안 위험이 발생할 때 일반적인 오류가 종종 발생합니다. 이 기사는 이러한 일반적인 실수와 피하는 방법을 다룰 것입니다.


1. 마법 인용문이란 무엇입니까?

Magic Quotes는 입력 데이터의 단일 따옴표 ( ' ), 이중 인용문 ( " ), 백 슬래시 ( \ ) 및 널 문자에 백 슬래시를 자동으로 추가합니다. 예를 들어 입력 O'Reilly는 자동으로 O \'Reilly 로 변환됩니다.

SQL 주입을 방지하는 것처럼 보이지만 실제로는 다음과 같은 문제가 발생합니다.

  • 데이터가 반복적으로 피해서 문자열 예외가 발생합니다.

  • 코드 논리는 혼란스럽고 데이터가 피해 졌는지 여부를 말하기가 어렵습니다.

  • 개발자는 마법 인용문을 닫는 상황을 무시하는 경향이 있습니다.


2. get_magic_quotes_gpc 함수의 일반적인 오류

오류 1 : 마법 인용문이 항상 켜져 있다고 가정하십시오

 if (get_magic_quotes_gpc()) {
    $input = stripslashes($_GET['input']);
} else {
    $input = $_GET['input'];
}

이 코드는 마법의 인용문이 켜지거나 꺼져 있다고 가정하고 처리 로직은이 두 가지 극단적 인 경우에만 고려합니다. 그러나 마법의 인용문이 닫힌 후 일부 입력이 탈출되지 않으면 스트립 슬래시 작업이 데이터를 파괴합니다.

오류 2 : 함수의 감지가 존재하지 않습니다

get_magic_quotes_gpc () 는 php 5.4 이상에서 폐기됩니다. 코드 가이 함수를 직접 호출하면 오류 가보고 될 수 있습니다.

 if (get_magic_quotes_gpc()) { // PHP 7+ 오류를보고하십시오
    // ...
}

오류 3 : 데이터 소스의 다양성을 무시하십시오

많은 개발자는 $ _get 또는 $ _post 에서 데이터의 특정 부분 만 처리하고 $ _cookie 와 같은 다른 과도로 변수에서 가능한 탈출 문자를 무시합니다.


3. 마법 인용문을 닫는 상황을 무시하지 않는 방법은 무엇입니까?

솔루션 1 : 함수가 존재하는지 여부를 감지하고 오류 방지

 if (function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc()) {
    $input = stripslashes($_GET['input']);
} else {
    $input = $_GET['input'];
}

이렇게하면 새 버전의 PHP에서 호출 되더라도 오류가 발생하지 않습니다.


솔루션 2 : 입력에서 탈출 한 모든 문자를 통일하게 제거하십시오 (마법 인용문이 켜지는 경우)

 function clean_magic_quotes() {
    if (function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc()) {
        $_GET = array_map('stripslashes', $_GET);
        $_POST = array_map('stripslashes', $_POST);
        $_COOKIE = array_map('stripslashes', $_COOKIE);
    }
}

clean_magic_quotes();

이 코드는 어떤 입력 소스에 관계없이 데이터 불일치를 피하기 위해 자동으로 추가 된 이스케이프 문자를 균일하게 제거 할 수 있도록합니다.


솔루션 3 : 마법 따옴표 감가 상각 및 현대 보안 방법 사용

마법의 인용문은 더 이상 사용되지 않으므로 기능을 완전히 끄고 SQL 주입을 방지하기 위해이 기능에 의존하지 않는 것이 좋습니다. 대신 다음 방법을 사용하십시오.

  • 준비된 문 및 매개 변수 바인딩 (예 : PDO 또는 MySQLI 확장)을 사용하십시오.

  • 사용자 입력의 엄격한 검증 및 필터링.

  • XSS 공격을 방지하기 위해 htmlspecialchars () 와 같은 함수를 사용하십시오.

샘플 코드 :

 $pdo = new PDO('mysql:host=gitbox.net;dbname=testdb', 'username', 'password');
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username");
$stmt->execute(['username' => $_GET['username']]);
$results = $stmt->fetchAll();

4. 요약

  • 마법 인용문에 의존하지 마십시오 . 구식적이고 안전하지 않은 디자인입니다.

  • 이전 코드를 유지하는 경우 먼저 get_magic_quotes_gpc ()를 호출하기 전에 함수가 존재하는지 확인해야합니다.

  • 로컬 처리로 인한 오류를 피하기 위해 모든 입력 데이터에서 탈출 된 문자를 통일하게 정리합니다.

  • 코드를 업그레이드하고 마법 인용문을 완전히 포기하고 안전한 데이터베이스 액세스 및 데이터 필터링 방법을 채택하는 것이 가장 좋습니다.

위의 방법을 통해 마법 인용문을 무시함으로써 발생하는 다양한 문제를 효과적으로 피하고 코드의 안정성과 보안을 보장 할 수 있습니다.