[완료] php의 magic_quotes_gpc에 대한 문제

flowerdog의 이미지

인터넷에서 http://phpsec.org/projects/phpsecinfo/tests/magic_quotes_gpc.html 이 문서를 읽었습니다.

magic_quotes_gpc 를 세팅(그리고 코드제작)을 어떻게 하는게 보안상 좋은가요?

7339989b62a014c4ce6e31b3540bc7b5f06455024f22753f6235c935e8e5의 이미지

magic_quotes_gpc는 끄고 데이터베이스에 입력할 때 직접 이스케이핑을 해주는 것이 보안상 좋습니다.
MySQL을 쓴다면 mysql_real_escape_string 등의 함수를 사용하면 됩니다.

flowerdog의 이미지

정말 기다리던 답변! 감사합니다.

몇 개 더 찾아보니 magic_quotes_gpc(get/post/cookie)는 오직 get/post/cookie에 대해서만 작동을 하기 때문에
database등에서 읽어들인 문자열은 이스케이핑 되지 않아 SQL inject이 가능하다는 문서를 읽었습니다.

결국 magic_quotes_gpc off를 하라는 얘기는 몇 가지 문제만 해결하는 기능은 끄고(off) 처음부터 직접 보안을 위한 코딩을 해야
magic_quotes_gpc가 제공하는 몇 가지 해결에만 의존한 코딩을 피할 수 있다는 얘기인것 같군요.

제가 질문을 올리게 된 이유는 많은 문서, 특히 한국 문서들에서 보안을 위해 magic_quotes_gpc를 on하기를 권장하는
내용을 자주 발견하기 때문입니다(제가 검색방법이 별로여서 이럴지도 모르겠지만..). 이러한 문서들은 제가 링크건 문서에서 말하는
"보안을 위해 magic_quotes_gpc를 on을 하면 좋다고 소개됐던 일"들이 여태까지 소개되는 것인가요?

다른 질문도 생겼습니다. magic_quotes_gpc에 의존해서 만들어진 프로그램들을 가져다 사용하는 경우 위의 이유로
magic_quotes_gpc off를 하게되면 위험할 수 있을것 같습니다. 이제 이런것은 어떻게 대처하시는지요? 이미 다 한물간
얘기라 magic_quotes_gpc를 믿고 off하면 되는 건가요?

7339989b62a014c4ce6e31b3540bc7b5f06455024f22753f6235c935e8e5의 이미지

저의 경우는 배포하는 프로젝트에서 magic_quotes_gpc가 켜져있으면 강제로 다시 백슬래시를 떼어낸 뒤 처리합니다. 아마 대부분의 소프트웨어는 이런 식으로 되어있을거라고 생각합니다. 확신이 가지 않으면 그냥 켜놓으세요.
그런데, PHP 6부터는 아예 해당 옵션이 사라집니다.

flowerdog의 이미지

두 분 답변 감사드립니다. drupal 구버전을 제 호스팅 계정(PHP 4.4.4, MySQL 4.0.27)에서
사용하려고 하는데 계젱에서 해당옵션이 on되어있고 바꿀수도 없더군요.

Drupal은 해당 옵션이 켜져있으면 주석처리 없이는 작동도 하지 않기에 이것저것 살펴보게 됐네요.

호스팅 서버에 on설정이 되어있는 것도 아마 magic_quotes_gpc on에 의존해서 만들어진 프로그램이
많이 사용돼서 그런것 같은데 그런거 쓰자니 찝찝하고 drupal에서 magic_quotes_gpc on해서 쓰자니
이상한 일이 생길것 같고 어떻게든 magic_quotes_gpc를 off 하는게 답인것 같습니다.

# PHP 4, Apache 1
[IfModule mod_php4.c]
  php_value magic_quotes_gpc                0
  php_value register_globals                0
  php_value session.auto_start              0
[/IfModule]

위는 drupal 설치시 .htaccess 에 저장되어있는 일부내용입니다. php_value 라인을 주석처리 하지 않으면
Internal Server Error가 나옵니다. php.ini를 직접 고칠 수 있는것도 아니고.. 이 글을 쓰는 도중에
혹시 php 코드로 magic_quotes_gpc를 끌 수 있지 않을까란 생각이 들어서 찾아보니 있더군요.

<?
        ini_set('magic_quotes_gpc', off);
        echo $_GET['input'];
?>

그러나 위의 코드에

<a href="http://www.example.com/test.php?input=h'aha
" rel="nofollow">http://www.example.com/test.php?input=h'aha
</a>

이렇게 접근하면 결과가 여전히 h\'aha 로 나오네요. 제가 실수한 게 있다던가 다른 방법 없을까요?

위에서 drupal에서 이상한 일이 생길것 같다는 한 말은 자동으로 백슬래쉬 달린것에 drupal이 다시
백슬래쉬를 붙힐것 같다는 추측이었데 DB를 확인해 보니 그런것은 아닌가 보네요. 그냥 써도 되는건지..
답변 기다리는 동안 drupal 코드를 봐야겠습니다. 어흐흑.

송효진의 이미지

<?php
if(ini_get('register_globals')) {
foreach($_GET as $key => $value) {
unset $$key;
}
foreach($_POST as $key => $value) {
unset $$key;
}
foreach($_COOKIE as $key => $value) {
unset $$key;
}
}
if(ini_get('magic_quote_gpc')) {
array_walk($_GET, 'unescapeall');
array_walk($_POST, 'unescapeall');
array_walk($_COOKIE, 'unescapeall');
}

function unescapeall(&$var)
{
if(is_array($var)) {
array_walk($var, 'unescapeall');
} else {
$var = stripslashes($var);
}
}
?>

emerge money
http://wiki.kldp.org/wiki.php/GentooInstallSimple - 명령어도 몇개 안되요~

flowerdog의 이미지

감사합니다. 몇가지 수정하니 잘 작동하네요.

수정내용
+ unset $$key; -> unset($$key);
+ 'magic_quote_gpc' -> 'magic_quotes_gpc'

두 분 덕분에 정말 빨리 많은것을 알았습니다. drupal 내에서 위의 처리를 한다면 서버세팅이 magic_quotes_gpc를 on한다고 할지라도
stripslashes($var) 처리를 해서 모든것을 magic_quotes_gpc off 상태로 만들기 때문에 문제없이 db쿼리에서 SQL injection 검사를 할 수 있겠군요.

require_once './includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

코드를 찾아봤습니다. index.php에서 위와 같이 호출이 일어나면 이리저리 함수호출을 하다가

function _fix_gpc_magic(&$item) {
  if (is_array($item)) {
    array_walk($item, '_fix_gpc_magic');
  }
  else {
    $item = stripslashes($item);
  }
}
 
function fix_gpc_magic() {
  static $fixed = false;
  if (!$fixed && ini_get('magic_quotes_gpc')) {
    array_walk($_GET, '_fix_gpc_magic');
    array_walk($_POST, '_fix_gpc_magic');
    array_walk($_COOKIE, '_fix_gpc_magic');
    array_walk($_REQUEST, '_fix_gpc_magic');
    array_walk($_FILES, '_fix_gpc_magic_files');
    $fixed = true;
  }
}

결국 stripslashes 처리를 해주는 군요. 이제 정신건강을 위해 믿고 drupal을 사용하려구요. 감사합니다!

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.