programing

Word Press는 왜 아직도 adslash(), register_globals() 및 magic_quotes를 사용하고 있습니까?

closeapi 2023. 3. 12. 10:49
반응형

Word Press는 왜 아직도 adslash(), register_globals() 및 magic_quotes를 사용하고 있습니까?

워드프레스에 대한 더 많은 경험을 쌓기 위해 코드 베이스를 파고들어 내부 작업과 워크플로우를 연구했습니다.그걸 보고 깜짝 놀랐어요.

  1. register_globals(wp-includes/class-wp.php에서 발췌)를 구현합니다.

     // The query_vars property will be extracted to the GLOBALS. So care should
     // be taken when naming global variables that might interfere with the
     // WordPress environment.
     function register_globals() {
        global $wp_query;
        // Extract updated query vars back into global namespace.
        foreach ( (array) $wp_query->query_vars as $key => $value) {
            $GLOBALS[$key] = $value;
        }
    
  2. 이들은 매직 따옴표를 사용합니다(wp-includes/functions.php. magic_quotes_gpc는 이 함수를 호출하기 전에 부트스트래핑 시 꺼집니다).

    function add_magic_quotes( $array ) {
        foreach ( (array) $array as $k => $v ) {
        if ( is_array( $v ) ) {
            $array[$k] = add_magic_quotes( $v );
        } else {
                $array[$k] = addslashes( $v );
        }
    
  3. addslash에 , 2.8.0 이후 만, "mysql_real_escape_string"은 mysql_real_escape_string입니다._weak_escape()" " 를 사용하는 "addslashes() class wpdb는 아직 합니다.)
    업데이트: 다음 명령어를 사용하여 준비된 스테이트먼트를 에뮬레이트합니다.sprintf()커스텀 플레이스 홀더도 있기 때문에 쿼리는 안전하다고 생각합니다.Mysql과 PHP 버전이 모두 부트스트래핑 시퀀스에서 초기에 검출된 후에 왜 적어도 mysqli를 제공하지 않는지 아직도 의문입니다.

1년 동안 SO를 자주 사용함으로써 많은 것을 배웠습니다.특히 위의 세 가지 기능이 '비판'되어 보안상의 문제를 나타내고 있으며 많은 사람들이 공포에 떨고 있습니다.

하지만 WP가 그것들을 사용할 이유가 있을 것이다.더 경험이 많은 프로그래머에게 보안상의 문제가 있는지, 아니면 루머나 잘못된 설득으로 인해 사용이 너무 흐려지는 경우가 있는지 알고 싶습니다.magic_quotes는 과거의 유산이고 addslash(최소한 데이터베이스에 사용할 경우)도 마찬가지라고 말할 수 있지만, 이것을 묻기 전에 googling을 하면서 mysql_real_escape_string() 위에 adslash()를 사용하는 것에 대해 많은 웹 사이트를 발견했습니다.

저는 왜 이러한 나쁘게 묘사된 기능이 사용되는지에 대한 명확하고 상세한 이유를 알고 싶습니다. Wordpress는 여러 가지 측면을 다루면서 몇 년 동안 많은 개선이 이루어졌지만 여전히 이러한 기능이 사용되고 있습니다. 따라서 저는 부정적인 측면을 무시하고 정당화하는 긍정적인 측면에 대한 구체적인 설명을 찾고 있습니다.그는 그 기능들을 사용한다.

나는 의견을 찾는 것도 아니고(여기서는 완전히 주제에서 벗어난다는 것을 알고 있다), 워드프레스에 대해 불평하는 것도 아니다. 나는 이것이 명확하기를 바란다.나는 왜 많은 php 프로그래머들이 이 함수들을 "나쁘다"고 생각하는지 알고 싶을 뿐인데, Wordpress와 같은 세계적인 거물들이 아직도 그것들을 사용하고 있다.

것른른른른른른른른른른른른 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (?((어느쪽이든)
이기 대해 해해 족? ?? ?? ?? 워드프레스(또는 일반)와 같은 환경에서 이 기능이 얼마나 중요합니까?솔직히 좀 헷갈리네요.

Wordpress 시간 경과에 따른 티켓 열기
(Wordpress 오픈 티켓 시간 경과)

Wordpress 코드베이스에 의존하여 PHP 코딩의 모범 사례 또는 현재 표준에 대한 가정을 하지 마십시오.오랜 시간 동안 워드프레스 발달에 만지작거린 사람으로서 하는 말이다.

워드프레스 코드베이스는 10년 정도 됐고, 레거시[1] 코드들로 가득해요.그 때문에, 프로그램은 코드 레벨로 진화할 수 없기 때문에, 현재는 이미 해결이 끝난 문제에 대해서, 많은 회피책을 찾을 수 있습니다.

이 이야기를 들어보세요.PHP는 마법의 인용구를 가지고 있습니다.워드프레스 개발자들은 그것이 유용하다고 생각했다.설정되어 있지 않은 호스트에 대해서는, 이 호스트를 추가했습니다.입력 데이터가 여러 곳에서 잘릴 것으로 예상되는 Whith 코드입니다.간단히 말해, 이제는 거의 모든 곳에서 정적 글로벌 상태를 도입하는 (슈퍼)글로벌 사용으로 인해 적절한 입력 처리 및 삭제로 쉽게 변경할 수 없습니다.

이러한 코드는 쉽게 리팩터링 할 수 없습니다.

데이터베이스 클래스도 마찬가지입니다.원래 ezSQL의 초기 버전을 기반으로 하는 오랜 역사를 가지고 있습니다.mysql_real_escape_stringWP devs는 도입 당시 모든 설치 기반이 이를 지원하지 않는다는 문제를 안고 있었다.

따라서 Wordpress 코드에서 찾을 수 있는 코딩 연습에 대해 궁금해하지 마십시오.몇 년 전에 어떻게 PHP 버전이 구식이거나 다소 뒤떨어졌는지를 알게 될 것이다.예를 들어 Wordpress가 PHP 5로 전환한 것은 그리 오래되지 않았습니다.

  • 하위 호환성
  • 대량의 (기술적으로는 다소 오래된) 호스트를 대상으로 합니다.
  • 결점이 있는 것을 깨뜨리지 마세요.

이것은 우선 순위 리스트가 아닐 수 있습니다(바람직하게는).프로젝트에는 큰 차이가 있습니다.그러나 프로젝트의 우선순위가 어떻게 설정되든 레거시 코드 기반만 있으면 부담이 됩니다.워드프레스는 하나의 예에 불과합니다.


[1] Word Press: 초기 프로젝트 스케줄 마일스톤 참조 (2000~2005년 경)

@tom answer를 보완하여.

매직 쿼트

전체 엔트리를 자동으로 해석하고 매직인테이트를 추가하는 것은 버그를 발생시키고 쓸모없는 것입니다.

  • 매직 따옴표를 사용하여 입력을 보호할 수 없기 때문에 쓸모가 없습니다(예: SQL 주입용 멀티바이트 인코딩 버그가 있습니다).따라서 데이터를 데이터베이스에 저장하기 전에 실제 필터를 적용해야 합니다.
  • 버그 생성:데이터베이스에 저장하기 전에 데이터를 정말로 이스케이프해야 하는 경우, 데이터가 아직 이스케이프되지 않았는지 확인해야 합니다(또한 이 설정이 존재하며 호스팅 환경에 의해 적용될 수 있기 때문에 이 설정이 설정되었는지 여부를 확인해야 합니다).
  • 버그 생성:사용자가 보내는 모든 데이터가 데이터베이스 스토리지 전용인 것은 아닙니다.이를 이스케이프하면 콘텐츠가 파손되거나 json 콘텐츠에 대해 생각할 수 있으며 위험한 magic_quote_runtime으로 콘텐츠를 파일화할 수도 있습니다.
  • 버그 생성:모든 데이터베이스 저장소가 동일한 방식으로 인용문을 이스케이프하지 않습니다.

그럼? 왜 CMS에서 이런 기능을 볼 수 있을까요?

  • 있는 것을 add_magic_quotes_GET_POST_POST_GET_POST_GET_GET_POST_GET_POST_GET_GET_POST_GET_GET_POST_GET_POST_GET그러나 실제로는 이 함수가 데이터베이스 전용 함수가 아닌 addslash만 사용하고 있기 때문에 매우 좋지 않습니다.
  • 호스팅 프로바이더가 자동 매직 견적을 강제하는 것은 CMS 디벨로퍼에게는 악몽입니다.이를 감지하고 실행을 거부하거나 콘텐츠가 마법처럼 추가되거나 추가되지 않은 사실을 관리해야 합니다.모든 사용자를 같은 상태로 만들려면 적어도 모든 사용자가 같은(불량) 상태가 되도록 이 함수로 비주소 콘텐츠를 실행합니다.
  • 에서 볼 수 로는 세이브 stripslahes_deepwp_insert_post가 필요합니다.add_magic_quotes add_magic_quotes _ 、 wp _ insert _ post 에에DB 。 filters에서 를 사용하여 를 sanitize 할 수 sanitize filters는 savets에 슬래시가 되어 있는 을 상정하고 있거나, 가 왜 하는 사람이 일 수 있습니다

registers_interals

워드프레스에서 레지스트리 패턴을 구현하는 방법인 것 같습니다...그들은 코드를 이해하기 쉽게 만들고 쿼리나 게시물과 같은 중요한 개체에 쉽게 액세스할 수 있는 방법을 원했습니다.그리고 객체 지향 레지스트리 클래스는 단순한 PHP 방식이 아닙니다.$_GLOBALS이치노

레지스트리를 가지는 것은 어플리케이션에서 완전히 유효한 것입니다.register_global은 일부 사용자의 입력이 유효한 보안 입력을 덮어쓰도록 허용하는 경우에만 위험합니다.그리고 이한 입력이 " " " 에서 합니다.$_GLOBALS다른 곳(또는 와 함께)global키워드를 지정합니다.

, 즉 '의 고리'입니다. 루프 온$query->query_vars가 를 할 수 해야 합니다.wp_parse_args을 사용하다 이 은 '고치다'입니다.$_GLOBALS" " " 러체에에체에에 。

$GLOBALS['query_string'] = $this->query_string;
$GLOBALS['posts'] = & $wp_query->posts;
$GLOBALS['post'] = (isset($wp_query->post)) ? $wp_query->post : null;
$GLOBALS['request'] = $wp_query->request;

따라서 적어도 이러한 글로벌은 사용자 입력으로 덮어쓸 수 없으며 안전합니다.

그래서 이 기능들은 좋지 않습니다.하지만 그들이 무엇을 하고 나쁜 영향을 막기 위해 무엇을 해야 하는지 이해한다면 여러분은 그것들을 사용할 수 있습니다.또한 매우 광범위한 환경에서 사용할 수 있는 개발자를 위한 단순한 프레임워크를 구현하려면 이러한 프레임워크를 사용해야 할 수도 있습니다.

단, 잘못된 방법으로 $_GLOBALS를 사용하거나 잘못된 Wordpress 플러그인을 찾을 수 있습니다.add_magic_quotes to data pulled from db드드워워Zend Framework CMS 。

매직 쿼트

다음 텍스트는 PHP.net 에서 가져온 것입니다.

http://www.php.net/manual/en/security.magicquotes.why.php

매직 따옴표는 더 이상 PHP에서 지원되지 않기 때문에 사용할 필요가 없습니다.그러나, 이러한 코드는 존재해, 소수의 초보자도 모르는 사이에 보다 좋은(더 안전한) 코드를 작성할 수 있도록 도와주었습니다.그러나 이 동작에 의존하는 코드를 다룰 때는 매직인테이트를 켜는 대신 코드를 업데이트하는 것이 좋습니다.그렇다면 이 기능은 왜 존재했을까요?SQL 주입을 방지하기 위해 단순합니다.오늘날 개발자들은 보안에 대해 더 잘 알고 있으며, 결국 마법의 인용과 같은 기능에 의존하지 않고 데이터베이스 고유의 이스케이프 메커니즘 및/또는 준비된 스테이트먼트를 사용하게 됩니다.

addslashes() vs mysql_real_sysql_string()

「 」를 사용하는 mysql_real_escape_string()는 " 함수되기 전에 을 이스케이프하기 입니다.mysql은 "MySQL"입니다.addslashes()는 「PHP 기능」입니다.조금 이상하게 들리겠지만, 이 두 가지 사이에는 한 가지 중요한 차이가 있는데, 이는 싱글 바이트와 멀티 바이트 문자를 사용하는 것과 관련이 있습니다.addslashs 함수에 의해 보호되는 데이터베이스를 주입할 수 있지만 mysql_real_escape_string에 의해 보호되는 데이터베이스를 주입하는 것은 훨씬 더 어렵습니다.자세한 내용은 이쪽에서 확인하실 수 있습니다.

글로벌 등록

「 」를 하지 register_globals누구나 할 수 있게 되기 에서는 $되지 않은할 수 .

<?php

if (isAuthenticated()) { $access = true; }

if ($access == true) {
  include(controlpanel.php);
}

?>

위의 코드는 sh#! 로드의 문제를 발생시키지만, 페이지 상단에 다음 항목을 추가하여 변수를 먼저 초기화하면 됩니다.

$access = false;

register_globals가 켜져 있어도 문제 없습니다.

따라서 Wordpress 팀이 모든 변수(아마도 가지고 있는 변수)를 초기화했다면 글로벌 사용에 대해 걱정할 필요가 없습니다.

결론

이 3가지 기능 중 어느 것을 사용하는 것은 확실히 나쁜 습관입니다.저라면 절대 하지 않습니다.최신 버전의 Wordpress를 사용하는 것이 확실합니까?누군가가 말한 것처럼, 만약 당신이 최신 버전을 사용하고 있다면 그것은 게으름 때문이거나 더 나쁘기 때문이다.Wordpress는 보안이 그다지 필요 없는 블로그 이외에는 사용하지 않습니다.

워드프레스.단 한 가지 질문에 대답하기 위해 많은 밤을 꼬박 새웠습니다. "왜??"

나는 그것의 소스코드에 직면했기 때문에 그것이 싫다.끔찍하다.그리고 내 게시물(그리고 평판도)은 무시될 것이지만 사실이야.

코어가 없어요.핵심 대신 코드 쓰레기가 있다.php3를 상기시킵니다.관련이 없는 비논리적인 함수의 거대한 무더기가 그것에서 사용된다."복사하여 붙여넣기" - 워드프레스에 사용되는 유일한 설계 패턴입니다.

네, 는 준비된 스테이트먼트의 사용을 에뮬레이트하고 있습니다.그런데 왜 PDO나 mysqli를 사용하지 않는 걸까요?그들은 거의 모든 PDO 기능을 복사해 놓았지만 대신 사용하지 않았다.mysql 대신 mysqli를 사용하면 더 적은 노력을 들일 수 있습니다.

myql_real_escape_string 을 합니다. 아직 게 요.protect_string_strongly,protect_string_weakly. 기능은 하나뿐만이 아닙니다.do_not_protect_string_i_believe_my_users.

전역 변수 - 워드프레스의 철학입니다."이 var를 변경하는 방법을 모르면 글로벌 var로 표시하여 모두가 만족할 것입니다." 워드프레스 개발자들이 hellpress를 개발했을 때 생각한 바를 다음과 같습니다.

새로운 버전마다 새로운 디자인이 많이 추가되고 새로운 기본 테마가 추가되며 관리 영역의 배경색이 #ccc에서 #cdcd로 변경되며 관리 영역의 드롭다운 메뉴가 아코디언 대신 사용됩니다.그리고 그것은 멋집니다.하지만 그들은 코드를 개선하지 않는다.

WP의 "core" 코멘트를 읽었습니까?안 그래? 내가 했어그들은 "대박"이다."무엇 때문에 이 함수가 호출되는가?만약을 위해 남겨두자" 또는 "새로운 버전에서는 이것을 하드코드하지 마세요" 등입니다.

"왜?"라는 질문에 대한 유일한 대답은 "왜냐하면 효과가 있기 때문이다.그리고 만약 효과가 있다면 만지지 마세요!!!"

wordpress.org은 세계에서 가장 많이 방문하는 사이트 중 하나입니다. 왜일까요?왜냐하면 아무도 워드프레스의 논리를 이해하지 못하기 때문이다.누구나 포럼에서 뭔가를 물어보거나 고문서를 읽어야 한다.

제 의견을 이해해 주셨으면 합니다.

위의 PHP 문서를 참조하는 것보다 더 나은 이유는 없습니다.

주의사항:

이 기능은 PHP 5.3.0에서 폐지되었습니다.이 기능에 의존하는 것은 매우 권장되지 않습니다.


그런데 왜 워드프레스는 여전히 매직인테크를 사용하는 걸까요?

워드프레스 최소 요구사항PHP 4.3을 사용합니다.네, 이것은 완전히 하위 호환성이 있는 이유입니다.

다른 기능은요?

솔직히 잘 모르겠어요.슈퍼글로벌에 의존하는 것은 매우 나쁜 생각이다.이것은 워드프레스 개발팀의 게으름일 뿐이다.아마도 그들은 더 중요한 문제를 가지고 있을 것이다.

한 가지 이유가 있습니다.

Wordpress가 대부분의 웹 호스팅 공급자와 호환되는지 확인합니다.

이곳은 그런 질문을 하기에는 부적절한 장소이다.
제3자에게 다른 사람이 다른 곳에 있었던 이유를 묻는 것은 항상 나쁜 생각이다.

그런 현상금을 내걸고 공인 워드프레스 개발자를 여기로 유인하지 않으면 답을 얻을 수 없는 게 분명해.

하지만 당신의 질문은 너무 광범위합니다.그러나 추상적인 부분에 대해서는 다음과 같이 답변할 수 있습니다.

더 경험이 많은 프로그래머에게 보안상의 문제가 있는지, 아니면 루머나 잘못된 설득으로 인해 사용이 너무 흐려지는 경우가 있는지 알고 싶습니다.

손 씻기는 정말 질병을 예방할 수 있을까요?
을을 안안 떻떻 꼭꼭 꼭꼭 꼭??

대부분의 시간 - 아니다.
반적인습습네네네네 - 네네 。

이러한 특징들은 (비록, 우리의 불운한 언어의 다른 특징들로서, 루머에 너무 흐려져 있지만) 모든 사람들이 기본적인 본능으로 따라야 할 위생일 뿐이다.

대부분...

  • addslash는 인코딩이 utf-8 또는 싱글바이트인 한 아무런 해를 끼치지 않습니다.
  • register globals는 모든 변수를 초기화해도 아무런 해가 되지 않습니다.
  • SQL에 대한 모든 변수와 슬래시를 다른 용도로 삭제하기만 하면 매직 쿼트는 아무런 해를 끼치지 않습니다.

...이러한 상황에서의 어떠한 예외도 당신을 아프게 할 가능성이 높습니다.

mysql_real_escape_string()과 addslash의 주요 차이점 중 하나는 mysql_real_escape_string()이 문자 집합과 함께 작동하므로 문자 집합을 기반으로 데이터를 올바르게 이스케이프하는 방법을 알 수 있습니다.

일반적으로는 요청 클래스를 사용하여 모든 작업을 그곳에서 수행하는 것이 가장 좋은 방법이라고 생각합니다.이와 같이 GET, POST, COOKIE, SERVER 등을 취급하는 곳은 1곳뿐입니다.그 때문에, 랜덤한 기능의 다수는 다른 작업을 실행하는 것에 비해, 관리가 훨씬 쉬워집니다.그건 그냥 재앙의 비법일 뿐이야.

언급URL : https://stackoverflow.com/questions/9404505/why-does-wordpress-still-use-addslashes-register-globals-and-magic-quotes

반응형