이전 버전의 PHP에서는 get_magic_quotes_gpc ()가 "마술 따옴표"가 활성화되어 있는지 여부를 감지하는 데 사용되는 함수입니다. Magic Quotes는 SQL 주입 공격을 방지하려는 목표로 PHP가 사용자 입력 데이터 (예 : $ _get , $ _post , $ _cookie 와 같은)에서 따옴표를 자동으로 스케이프하는 메커니즘입니다. 그러나 PHP 버전의 업그레이드 로이 기능은 안전하지 않고 혼란스러워하는 것으로 간주되었으며 결국 PHP 5.4에서 완전히 제거되었습니다.
그럼에도 불구하고, 많은 오래된 프로젝트와 코드는 여전히 get_magic_quotes_gpc ()를 사용하고 있으며, 특히 마법 따옴표를 무시할 때 데이터 처리 오류 및 보안 위험이 발생할 때 일반적인 오류가 종종 발생합니다. 이 기사는 이러한 일반적인 실수와 피하는 방법을 다룰 것입니다.
Magic Quotes는 입력 데이터의 단일 따옴표 ( ' ), 이중 인용문 ( " ), 백 슬래시 ( \ ) 및 널 문자에 백 슬래시를 자동으로 추가합니다. 예를 들어 입력 O'Reilly는 자동으로 O \'Reilly 로 변환됩니다.
SQL 주입을 방지하는 것처럼 보이지만 실제로는 다음과 같은 문제가 발생합니다.
데이터가 반복적으로 피해서 문자열 예외가 발생합니다.
코드 논리는 혼란스럽고 데이터가 피해 졌는지 여부를 말하기가 어렵습니다.
개발자는 마법 인용문을 닫는 상황을 무시하는 경향이 있습니다.
if (get_magic_quotes_gpc()) {
$input = stripslashes($_GET['input']);
} else {
$input = $_GET['input'];
}
이 코드는 마법의 인용문이 켜지거나 꺼져 있다고 가정하고 처리 로직은이 두 가지 극단적 인 경우에만 고려합니다. 그러나 마법의 인용문이 닫힌 후 일부 입력이 탈출되지 않으면 스트립 슬래시 작업이 데이터를 파괴합니다.
get_magic_quotes_gpc () 는 php 5.4 이상에서 폐기됩니다. 코드 가이 함수를 직접 호출하면 오류 가보고 될 수 있습니다.
if (get_magic_quotes_gpc()) { // PHP 7+ 오류를보고하십시오
// ...
}
많은 개발자는 $ _get 또는 $ _post 에서 데이터의 특정 부분 만 처리하고 $ _cookie 와 같은 다른 과도로 변수에서 가능한 탈출 문자를 무시합니다.
if (function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc()) {
$input = stripslashes($_GET['input']);
} else {
$input = $_GET['input'];
}
이렇게하면 새 버전의 PHP에서 호출 되더라도 오류가 발생하지 않습니다.
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();
이 코드는 어떤 입력 소스에 관계없이 데이터 불일치를 피하기 위해 자동으로 추가 된 이스케이프 문자를 균일하게 제거 할 수 있도록합니다.
마법의 인용문은 더 이상 사용되지 않으므로 기능을 완전히 끄고 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();
마법 인용문에 의존하지 마십시오 . 구식적이고 안전하지 않은 디자인입니다.
이전 코드를 유지하는 경우 먼저 get_magic_quotes_gpc ()를 호출하기 전에 함수가 존재하는지 확인해야합니다.
로컬 처리로 인한 오류를 피하기 위해 모든 입력 데이터에서 탈출 된 문자를 통일하게 정리합니다.
코드를 업그레이드하고 마법 인용문을 완전히 포기하고 안전한 데이터베이스 액세스 및 데이터 필터링 방법을 채택하는 것이 가장 좋습니다.
위의 방법을 통해 마법 인용문을 무시함으로써 발생하는 다양한 문제를 효과적으로 피하고 코드의 안정성과 보안을 보장 할 수 있습니다.