"매직 따옴표"가 비활성화되어 있는데, 왜 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
'source' 카테고리의 다른 글
| MongoDB 문서 및 컬렉션 시각 관리 (0) | 2023.02.23 |
|---|---|
| 스프링 부트를 사용한 Maven 리소스 필터링: 자리 표시자를 확인할 수 없습니다. (0) | 2023.02.23 |
| AngularJs ng-repeat에서 중복 요소 제거 (0) | 2023.02.23 |
| Mongoose Schema가 모델에 등록되지 않았습니다. (0) | 2023.02.23 |
| node.js와 함께 기본 Ajax 송수신 (0) | 2023.02.23 |