php에서 get_magic_quotes_gpc는 magic_quotes_gpc 구성 항목이 활성화되어 있는지 확인하는 함수입니다. Magic_Quotes_GPC는 한때 SQL 주입 공격을 방지하기 위해 양식 입력, URL 또는 쿠키에서 데이터를 자동으로 탈출하는 데 사용 된 오래된 PHP 설정입니다. 그러나 다중 바이트 문자 인코딩 (예 : UTF-8)에서 get_magic_quotes_gpc 의 처리는 특히 영어 이외의 문자 세트에서 예기치 않은 문제를 일으킬 수 있습니다.
get_magic_quotes_gpc는 php의 magic_quotes_gpc 설정을 확인하여 true 또는 false를 반환합니다. magic_quotes_gpc가 ON 으로 설정되면 PHP는 $ _get , $ _post 및 $ _cookie 에서 데이터를 자동으로 탈출합니다. 이것은 모든 단일 따옴표 ( ' ), 이중 인용문 ( " ) 및 백 슬래시 ( \ )가 Backslash ( \\ )로 자동으로 탈출 함을 의미합니다.
magic_quotes_gpc는 종종 Multibyte 문자 인코딩 (예 : UTF-8)을 다룰 때 예상치 못한 결과를 초래할 수 있습니다. UTF-8 인코딩은 여러 바이트를 사용하여 문자를 나타내는 반면, Magic_Quotes_GPC 의 처리는 주로 단일 바이트 문자 세트를 목표로하며, 이는 실수로 멀티 바이트 문자에 백 슬래시를 추가 할 수 있으므로 문자의 원래 인코딩을 깨뜨릴 수 있습니다.
양식 입력에 중국어 "Hello"가 포함되어 있다고 가정하십시오. magic_quotes_gpc가 활성화되면 문자에 인코딩 된 바이트 스트림의 중간에 백 슬래시가 일부 바이트에 삽입되어 문자열이 "You \ Ok"또는 "You \ Ok"가되므로 백엔드가 처리 할 때 원래 문자를 올바르게 디코딩하지 못하도록 방해 할 수도 있습니다.
Magic_Quotes_GPC는 초기에 SQL 주입을 방지하도록 설계되었지만 PHP의 지속적인 개발로 인해이 구성은 더 이상 많은 문제를 일으키기 때문에 권장되지 않습니다.
멀티 바이트 문자 인코딩을 올바르게 처리하지 않습니다.
추가 탈출 문자가 추가되어 개발자가 입력 데이터를 처리 할 때 추가 역전을 수행하게됩니다.
최신 데이터베이스 쿼리의 경우 준비된 문을 사용하면 Magic_Quotes_GPC 에 의존하지 않고 SQL 주입을 효과적으로 방지 할 수 있습니다.
따라서 PHP 5.4.0 후 Magic_Quotes_GPC는 완전히 포기되어 PHP 7.0.0에서 완전히 제거되었습니다.
먼저 magic_quotes_gpc가 비활성화되어 있는지 확인하십시오. PHP 구성 파일 ( php.ini )을 확인하여 비활성화 할 수 있습니다.
<span><span><span class="hljs-attr">magic_quotes_gpc</span></span><span> = </span><span><span class="hljs-literal">Off</span></span><span>
</span></span>또한 PHP 코드에서 get_magic_quotes_gpc ()를 사용하여 설정이 현재 활성화되어 있는지 확인할 수도 있습니다. 활성화되면 탈출 된 문자를 수동으로 제거 할 수 있습니다.
<span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">get_magic_quotes_gpc</span></span><span>()) {
</span><span><span class="hljs-variable">$_GET</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_map</span></span><span>(</span><span><span class="hljs-string">'stripslashes'</span></span><span>, </span><span><span class="hljs-variable">$_GET</span></span><span>);
</span><span><span class="hljs-variable">$_POST</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_map</span></span><span>(</span><span><span class="hljs-string">'stripslashes'</span></span><span>, </span><span><span class="hljs-variable">$_POST</span></span><span>);
</span><span><span class="hljs-variable">$_COOKIE</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_map</span></span><span>(</span><span><span class="hljs-string">'stripslashes'</span></span><span>, </span><span><span class="hljs-variable">$_COOKIE</span></span><span>);
}
</span></span>양식 입력을 처리 할 때 클라이언트와 서버가 동일한 문자 인코딩을 사용하고 UTF-8을 권장하는지 확인하십시오. 이것은 HTML 문서에 설정된 문자를 지정하여 수행 할 수 있습니다.
<span><span><span class="hljs-tag"><<span class="hljs-name">meta</span></span></span><span> </span><span><span class="hljs-attr">charset</span></span><span>=</span><span><span class="hljs-string">"UTF-8"</span></span><span>>
</span></span>동시에, 문자 인코딩의 일관성을 보장하기 위해 PHP에서 MB_CONVERT_ENCODING 함수를 사용하십시오.
<span><span><span class="hljs-variable">$input</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mb_convert_encoding</span></span><span>(</span><span><span class="hljs-variable">$input</span></span><span>, </span><span><span class="hljs-string">'UTF-8'</span></span><span>, </span><span><span class="hljs-string">'auto'</span></span><span>);
</span></span>SQL 주입 공격을 방지하려면 항상 Magic_Quotes_GPC 에 의존하는 대신 준비된 SQL 문을 사용하여 자동으로 탈출해야합니다. 이 방법은 인코딩 문제를 해결할뿐만 아니라 SQL 주입을 효과적으로 방지합니다.
PDO 또는 MySQLI를 사용하여 준비된 진술을 구현하십시오.
<span><span><span class="hljs-comment">// 사용PDO</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"SELECT * FROM users WHERE username = :username"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bindParam</span></span><span>(</span><span><span class="hljs-string">':username'</span></span><span>, </span><span><span class="hljs-variable">$username</span></span><span>, PDO::</span><span><span class="hljs-variable constant_">PARAM_STR</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
</span><span><span class="hljs-comment">// 사용MySQLi</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"SELECT * FROM users WHERE username = ?"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bind_param</span></span><span>(</span><span><span class="hljs-string">"s"</span></span><span>, </span><span><span class="hljs-variable">$username</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
</span></span>get_magic_quotes_gpc 및 magic_quotes_gpc 는 더 이상 최신 PHP 개발에서 권장되지 않습니다. 다중 바이트 문자 인코딩 처리의 경우 데이터의 정확성과 보안을 보장하기 위해 탈출 및 캐릭터 인코딩의 일관성에 특별한주의를 기울여야합니다. 가장 좋은 방법은 magic_quotes_gpc를 비활성화하고 준비된 SQL 문과 같은 최신 입력 검증 방법을 사용하고 균일 한 문자 인코딩 (예 : UTF-8)을 사용하여 문자가없는 문자 및 불필요한 탈출 문제를 피하는 것입니다.