source

"매직 따옴표"가 비활성화되어 있는데, 왜 PHP/WordPress는 계속해서 내 POST 데이터를 자동 이스케이프합니까?

nicesource 2023. 2. 23. 22:55
반응형

"매직 따옴표"가 비활성화되어 있는데, 왜 PHP/WordPress는 계속해서 내 POST 데이터를 자동 이스케이프합니까?

그것은 이상하리만치 이해하기 어려운 간단한 질문이다.

get_magic_quotes_gpc()리포트 0 입니다.반복한다, 마법의 인용문은 틀렸다매직 따옴표는 에서 비활성화되어 있는 것 같습니다.php.ini(런타임이 아님).

단, 작은따옴표(')를 포함한 모든 POST 데이터는 PHP에서 액세스할 때 이스케이프됩니다.원인은 무엇입니까?


테스트 케이스를 준비하던 중 문제의 일반적인 원인을 발견했습니다.어플리케이션이 WordPress 멀티사이트 설치와 통합됨에 따라 WordPress를 부트스트랩하고 있습니다.WordPress 부트스트래핑을 비활성화하면 자동 이스케이핑이 비활성화됩니다.WordPress의 자동 이스케이프 코드는 어디에 있습니까?

난 내가 그걸 발견한 것 같다.문제(버그): http://core.trac.wordpress.org/ticket/18322

솔루션: http://codex.wordpress.org/Function_Reference/stripslashes_deep

    $_GET       = array_map('stripslashes_deep', $_GET);
    $_POST      = array_map('stripslashes_deep', $_POST);
    $_COOKIE    = array_map('stripslashes_deep', $_COOKIE);
    $_SERVER    = array_map('stripslashes_deep', $_SERVER);
    $_REQUEST   = array_map('stripslashes_deep', $_REQUEST);

주의: @Alexandar O'Mara의 제안대로 슈퍼글로벌 덮어쓰기를 재고해 보는 것이 좋습니다.예를 들어 상황에 맞는 경우 다음과 같은 대체 방법을 사용하여 "로컬 스트립"할 수 있습니다.$post = array_map('stripslashes_deep', $_POST);

@quickshiftin의 훌륭한 답변도 참조하십시오.

@rinogo의 답변을 상세하게 설명하고, 또 다른 회피책을 제시.


wp 설정에서.php 무조건 호출이 있습니다.wp_magic_quotes

// Add magic quotes and set up $_REQUEST ( $_GET + $_POST )
wp_magic_quotes();

WordPress는 어떠한 경우에도 인용구를 피한다.

function wp_magic_quotes() {
    // If already slashed, strip.
    // Escape with wpdb.
    // Force REQUEST to be GET + POST.
}

흥미로운 점은 이 콜은 플러그인이 로드된 테마가 로드되기 전에 이루어집니다.Soooo, 플러그인의 맨 위에

// A hack to cope with un-configurable call to wp_magic_quotes
// E.G. Make the original $_POST available through a global $_REAL_POST
$_REAL_GET     = $_GET;
$_REAL_POST    = $_POST;
$_REAL_COOKIE  = $_COOKIE;
$_REAL_REQUEST = $_REQUEST;

그럼 자유롭게 사용하실 수 있습니다.$_REAL_POST대신 등$_POST(이것이 슈퍼글로벌이 아닌 글로벌임을 기억하라) 필요한 경우입니다.또한 테마 전에 플러그인이 로딩되어 있는 동안 테마가 를 사용하는 플러그인 함수 중 하나로 호출되는 경우$_POST, 에서 읽어야 합니다.$_REAL_POST탈출하지 않은 가치를 얻기 위해서요

저는 이 문제에 대처해야 했고, 제가 생각하기에는 꽤 좋은 해결책인 것 같습니다.그러면 GPC가 절단되지 않습니다.플러그인 파일의 맨 위에 두었을 뿐입니다(테마의 맨 위에서도 사용할 수 있을 것 같습니다).

add_action( 'init', 'unslash_gpc' );
function unslash_gpc() {
    $_GET       = array_map('stripslashes_deep', $_GET);
    $_POST      = array_map('stripslashes_deep', $_POST);
    $_COOKIE    = array_map('stripslashes_deep', $_COOKIE);
    $_SERVER    = array_map('stripslashes_deep', $_SERVER);
    $_REQUEST   = array_map('stripslashes_deep', $_REQUEST);
}

이제 모든 게 완벽해!

여기서 제공하는 최선의 답변은 다음과 같이 자신의 용도로 복사하는 것입니다.

$post = array_map('stripslashes_deep', $_POST);

그러나 여기에는 이론적인 문제가 있습니다. 복제품을 사용하고 있기 때문에 슈퍼글로벌에 대한 어떠한 변경도 지속할 수 없습니다(이것이 좋은 프랙티스라고 말하는 것은 아닙니다).

해결책: 접근 방식

이 , 「하고 있습니다.stripslashes_deep() ★★★★★★★★★★★★★★★★★」addslashes_deep()*다음 슈퍼글로벌 어레이에 대한 요구를 가져오거나 설정합니다.

던져야만 했어addslashes_deep()WordPress의 'WordPress'에서 함께 제공stripslashes_deep().

  • $_GET
  • $_POST
  • $_COOKIE
  • $_SERVER
  • $_REQUEST

다음과 같이 사용할 수 있습니다.

echo _get('username');    // echo stripslashes_deep($_GET['username']);
_cookie('name', 'value'); // $_COOKIE['name'] = addslashes_deep('value');

가 있습니다(을 코드라고 .gpcsr.php

<?php

// cat stripslashes_deep() | sed 's/stripslashes/addslashes/g'
function addslashes_deep( $value ) {
    if ( is_array($value) ) {
        $value = array_map('addslashes_deep', $value);
    } elseif ( is_object($value) ) {
        $vars = get_object_vars( $value );
        foreach ($vars as $key=>$data) {
            $value->{$key} = addslashes_deep( $data );
        }
    } elseif ( is_string( $value ) ) {
        $value = addslashes($value);
    }

    return $value;
}

function _generic_slashes_wrap(&$arr, $key, $value = null) {
    if (func_num_args() === 2) return stripslashes_deep($arr[$key]);
    else $arr[$key] = addslashes_deep($value);
}

function _get       ($key, $value = null) { if (func_num_args() === 1) return _generic_slashes_wrap($_GET,      $key); else _generic_slashes_wrap($_GET,        $key, $value); }
function _post      ($key, $value = null) { if (func_num_args() === 1) return _generic_slashes_wrap($_POST,     $key); else _generic_slashes_wrap($_POST,       $key, $value); }
function _cookie    ($key, $value = null) { if (func_num_args() === 1) return _generic_slashes_wrap($_COOKIE,   $key); else _generic_slashes_wrap($_COOKIE,     $key, $value); }
function _server    ($key, $value = null) { if (func_num_args() === 1) return _generic_slashes_wrap($_SERVER,   $key); else _generic_slashes_wrap($_SERVER,     $key, $value); }
function _request   ($key, $value = null) { if (func_num_args() === 1) return _generic_slashes_wrap($_REQUEST,  $key); else _generic_slashes_wrap($_REQUEST,    $key, $value); }

?>

WordPress는 WordPress 함수 stripslashes_deep를 사용하여 이 문제를 해결합니다.따라서 @rinogo의 답변에서 언급된 부분은 다음과 같습니다.

$_GET     = stripslashes_deep($_GET);
$_POST    = stripslashes_deep($_POST);
$_COOKIE  = stripslashes_deep($_COOKIE);
$_REQUEST = stripslashes_deep($_REQUEST);

에서는 워드프레스에 아무 .$_SERVER이치

WordPress는 $_POST/$_GET/$_REQUEST/$_COOK에 슬래시를 추가합니다.반환되는 get_magic_quotes_gpc()에 관계없이 IE를 지정합니다.따라서 WordPress에서는 이러한 변수를 사용할 때 stripslashes() 또는 stipslashes_deep()를 사용해야 합니다.lashes_deep()를 사용해야 합니다.

아니면 그냥 내가 했던 대로 해.로드의 모든 실장을 코멘트 아웃 합니다.php의 wp_param_param() 메서드.

난 마법의 인용은 필요없어.이것은 나에게 가치보다 훨씬 더 많은 두통을 야기했다.개인적으로, 저는 입력 위생에 대한 저만의 규율을 유지하는 것을 선호합니다.나쁜 프로그래밍 습관을 들이고 싶지 않아요.

그러나 WordPress가 이러한 "기능"을 포함하도록 강요하는 것은 이해합니다.아마도 개발 공동체는 그것을 무력화시킬 수 있는 전 세계적인 선택권을 갖는 것이 가장 좋을 것이다.

언급URL : https://stackoverflow.com/questions/8949768/with-magic-quotes-disabled-why-does-php-wordpress-continue-to-auto-escape-my

반응형