Command Palette

Search for a command to run...

PHP 온라인 직렬화 해제: PHP 서버 없이 직렬화된 데이터를 읽습니다

PHP 온라인 직렬화 해제: PHP 서버 없이 직렬화된 데이터를 읽습니다

T
Toolz Team
|Jul 10, 2026|13 최소 읽기

코딩 모음의 일부

형식에는 구현 외부의 사양이 없습니다; 그만큼 위한 PHP 매뉴얼 unserialize() 는 참조이며, 신뢰할 수 없는 입력을 전달하는 것은 안전하지 않다는 것이 명백합니다.

처음으로 직렬화된 PHP 데이터에 오후 비용이 들었을 때 WP Adminify 지원 티켓이었습니다. user's 대시보드 위젯 설정이 엉망이 되었고 "settings" 그들은 에 살았습니다 wp_options 선 잡음처럼 보이는 단일 직렬화된 문자열로 테이블: a:4:{s:8:"_builtin";b:1;.... 읽을 수도 없었고, 무엇이 잘못되었는지 한 눈에 알 수도 없었고, 단지 전체 PHP 환경을 구축하고 싶지도 않았습니다 print_r 한 행. 그 오후는 내가 멀리 하나의 브라우저 탭입니다 디코더를 갖는 것에 대해 걱정하는 이유입니다.

WordPress,WooCommerce, Laravel 또는 모든 레거시 PHP 코드베이스에서 작업하는 경우 원하는지 여부에 관계없이 직렬화 된 데이터를 만났습니다. 옵션 테이블,세션 파일,캐시 저장소 및 게시물 메타에 표시됩니다. 그리고 무언가가 깨지면 빨리 읽을 수 있다는 것이 5 분 수정과 오후의 차이입니다.

이 가이드에서는 직렬화된 형식이 실제로 무엇인지, 이를 사용하여 디코딩하는 방법을 다룹니다 직렬화 해제 Toolz.dev의 도구, 그리고 - 중요한 것은 - 영어가 아닌 데이터의 출력을 신뢰하기 전에 알아야 할 실제 제한 사항 중 하나입니다.

TL;DR: PHP serialize() 다음과 같이 입력된 문자열에 값을 압축합니다 a:2:{s:4:"name";s:5:"Alice";...} 각 조각이 유형과 길이를 전달하는 곳. The 역직렬화 도구 브라우저에서 이를 구문 분석하여 트리로 표시합니다 print_r, var_dump또는 JSON - PHP 서버가없고 데이터 업로드가 없습니다. 큰주의 사항 나는 나 자신을 검증했다: 그것은 바이트가 아닌 UTF-16 코드 단위로 문자열 길이를 계산하므로 악센트,이모티콘 또는 CJK 문자가 포함 된 직렬화 된 데이터는 잘못 구문 분석하거나 실패 할 수 있습니다. ASCII 데이터의 경우 신뢰할 수있는 데이터를 읽습니다; 그것은 객체 참조를 해결하거나 제자리에서 편집 할 수 없습니다.

PHP 직렬화란, 정말?

직렬화는 배열, 개체, 문자열, 정수 등 PHP 값을 데이터베이스 열이나 파일에 저장했다가 나중에 다시 작성할 수 있는 플랫 문자열로 바꿉니다 unserialize(). 두 가지 기능이 작업을 수행합니다: serialize() 값을 문자열로 변환합니다 unserialize() 다시 변환합니다.

코드를 알고 나면 포맷을 읽을 수 있게 만드는 것은 모든 값이 그 타입과 크기를 알려준다는 것입니다. 여기 전체 어휘가 있습니다:

s:5:"hello"              // string:  s:length:"value"
i:42                     // integer: i:value
d:3.14                   // double:  d:value
b:1                      // boolean true (b:0 is false)
N;                       // null
a:2:{...}                // array:   a:count:{key;value;...}
O:8:"ClassName":1:{...}  // object:  O:namelen:"Class":propcount:{...}

따라서 직렬화된 연관 배열은 다음과 같습니다:

a:3:{s:4:"name";s:10:"John Smith";s:5:"email";s:16:"[email protected]";s:4:"role";s:5:"admin";}

이것은 바로 이 PHP 배열입니다. 꽉 채워져 있습니다:

array(
    'name'  => 'John Smith',
    'email' => '[email protected]',
    'role'  => 'admin'
)

지원 호출에 오후 2 시에 사람이 읽을 수 없을 정도로 가까운 기계용 컴팩트. 이것이 도구가 해결하는 전체 문제입니다.

어떻게 Toolz.dev Unserialize tool 이 그것을 디코딩합니까?

문자열을 붙여넣으면 브라우저의 JavaScript에서 직접 형식을 구문 분석하고 결과를 렌더링합니다. 이 글을 쓰는 동안 tool's 자체 파서에 대해 이들 각각을 테스트했기 때문에 아래 동작은 매뉴얼이 가정하는 것이 아니라 실제로 수행하는 작업입니다.

순차적 정수 키 배열은 실제 목록으로 돌아옵니다. a:2:{i:0;s:5:"apple";i:1;s:6:"banana";} 디코딩합니다 ["apple", "banana"]. 연관 배열은 키로 된 개체로 돌아옵니다. 중첩된 구조는 올바르게 중첩되고 배열 내부는 개체 내부로 배열되며 아래로 내려갑니다.

객체는 클래스 이름을 유지합니다. O:4:"User":2:{s:4:"name";s:3:"Bob";...} a로 디코딩합니다 __class__ 마커 "User" 게다가 그 속성,그래서 당신은 유형과 데이터를 모두 볼 수 있습니다. 심지어 PHP 가 클래스 이름 주위에 널 바이트 접두사로 직렬화하는 개인 및 보호 속성의 어색한 경우를 처리합니다 - 도구는 그것들을 제거하고 깨끗한 속성 이름을 보여줍니다.

전환할 수 있는 8가지 출력 형식이 있습니다: 트리 보기, print_r, var_dump, var_export, Krumo, FirePHP, dBug, 일반 JSON. 저는 탐험을 위해 Tree View에 살고 있고 다른 것에 복사하기 위해 JSON에 살고 있지만 근육 기억이 기대한다면 var_dump 출력, 바로 거기에 있습니다.

당신이 알아야 할 한 가지 제한 사항: 멀티바이트 문자열

이것은 생산 데이터에 대한 디코더를 신뢰하기 전에 누군가가 나에게 말해주기를 바라는 부분이므로 여기에 있습니다.

PHP's 직렬화된 체재는 에서 끈 길이를 측정합니다 바이트. 공구는 안으로 그것을 측정합니다 자바스크립트 문자열 길이UTF-16 코드 단위를 세는,입니다. 보통 ASCII 를 위해 저것은 동일한 수이다,그래서 영어 자료는 완벽하게 해독한다. 끈이 다중 바이트 UTF-8 특성을 포함하는 순간,그들은 발산한다.

Take the word "café." UTF-8 에서 "é"는 2 바이트이므로 PHP 는 로 직렬화합니다 s:5:"café" - 길이 다섯, 바이트를 세는. 도구는 그것을 읽습니다 5 그리고 다섯을 잡습니다 코드 단위 문자열에서 café" - 그것은 닫는 따옴표를 삼키고 그것의 장소를 잃는다. 나는 정확하게 이것을 달렸다: 독립형 s:5:"café"; 잘못된 값으로 디코딩하고 배열 내부에서 다음과 같이 디코딩합니다 a:2:{s:1:"a";s:5:"café";s:1:"b";i:1;} 완전히 실패합니다 Unknown type ':' at position 25.

실용적인 테이크 아웃: 당신이 순수한 ASCII 인 워드 프레스 옵션을 디버깅하는 경우 - 대부분의 플러그인 설정, slugs, 부울 플래그 - 당신은 괜찮습니다. 직렬화 된 데이터가 악센트 이름, 이모티콘, 또는 CJK 텍스트를 포함하는 경우, 디코드가 손상되거나 오류가 발생할 수 있으며, 그것은 도구가 아닌 실제 버그입니다 (기록에 대한 우리의 끝에 수정은보다는 UTF-8 바이트 길이로 구문 분석하는 것입니다 .length; 내 목록에 있습니다.) 누르면 서버의 WP-CLI's 직렬화 인식 명령이 신뢰할 수 있는 대체 명령입니다.

관련된 더 부드러운 주의 사항이 있습니다: the var_dump 출력은 동일한 코드 단위 수를 사용하여 문자열 길이를 보고합니다 var_dump("café")string(4) 실제 PHP가 말할 곳은 어디일까요 string(5)그리고 이모티콘은 PHP's 바이트 카운트와도 일치하지 않는 길이를 보여줍니다. 그 숫자를 "JavaScript length," not "PHP 바이트 length."로 읽습니다

왜 PHP 외부의 데이터를 직렬화 해제해야 합니까?

이유는 많지만 그 중 거의 아무것도 "for fun."

디버깅은 큰 것입니다. 버그 보고서는 user's 설정이 잘못되었다고 말합니다; 설정은 데이터베이스의 직렬화된 blob 입니다; 디코딩하기 전까지는 문제를 볼 수 없습니다. 제가 사용하는 워크플로는: SELECT option_value FROM wp_options WHERE option_name = 'widget_text';, 결과를 복사하여 에 붙여넣습니다 역직렬화 도구을,그리고 트리를 읽는다. ten seconds versus throwaway PHP 스크립트를 작성합니다.

마이그레이션은 교활한 것입니다. 직렬화된 문자열은 자체 길이를 포함하므로 데이터베이스 덤프에서 순진한 찾기 및 바꾸기 - 예를 들어 이전 도메인을 새 도메인으로 바꾸면 - 길이 접두사를 업데이트하지 않고 문자열 내용을 변경하고 영향을 받는 모든 값은 직렬화할 수 없게 됩니다. 먼저 디코딩하면 어떤 값이 도메인을 전달하는지 정확히 표시되므로 일반 검색 및 바꾸기가 무엇을 깨뜨릴지 알 수 있습니다. (바꾸기 자체에 대한 올바른 도구는 WP-CLI's 입니다 search-replace는, 직렬화를 이해하는.)

그런 다음 캐시 및 세션 검사 - PHP 앱의 Redis, Memcached 및 파일 캐시는 종종 직렬화 된 값을 보유합니다 - 그리고 보안 검토가 있으며, 안전 여부를 판단하기 전에 실제로 저장된 것을 확인해야합니다.

브라우저에서 직렬화된 데이터를 디코딩하는 것은 안전한가요?

PHP에서 하는 것보다 안전하고 그 이유를 이해할 가치가 있습니다.

PHP's 네이티브 unserialize() 보안 역사가 길다. 조작된 문자열을 Fed하면 임의의 개체를 인스턴스화하고 마법 방법을 트리거할 수 있습니다(Fed a crafted string, 임의 개체를 인스턴스화하고 마법 메서드를 트리거할 수 있습니다)__wakeup, __destruct올바른 조건에서는 객체 주입 공격이 되고 최악의 경우 원격 코드 실행이 되는 ), 그렇기 때문에 절대 호출하지 말라는 것이 스탠딩 조언입니다 unserialize() 신뢰할 수 없는 입력에 대해 전달합니다 ['allowed_classes' => false] 꼭 해야 할 때.

브라우저 도구는 결코 그 모든 것을 회피하지 않습니다 실행합니다 PHP. 문자열 형식을 읽고 구조를 표시합니다. PHP 객체가 생성되지 않고,마법 메서드가 실행되지 않으며,익스플로잇할 인터프리터가 없습니다. 데이터도 장치에 유지됩니다; 로컬로 파싱되고 서버로 전송되지 않습니다. 이는 직렬화된 blob 이 세션이거나 업로드하지 않을 다른 것일 때 중요합니다. 그래서 검사 중 신뢰할 수 없는 직렬화된 데이터인 브라우저는 진정으로 더 안전한 곳입니다.

네이티브 PHP unserialize() Toolz.dev 브라우저 도구
객체를 인스턴스화합니다 예(주사 위험) 아니요 - 구조만 읽습니다
서버에서 실행됩니다 아니요 - 브라우저에서 로컬입니다
신뢰할 수 없는 입력에서 안전합니다 오직 allowed_classes 예, 절대 실행되지 않습니다
멀티바이트 길이를 처리합니다 올바르게 (바이트) 안정적이지 않음(코드 단위)
객체 참조를 해결합니다 아니요 - 보여줍니다 [Reference]
목적 라이브 가치를 재구성합니다 검사하고 읽으십시오

그 테이블은 또한 트레이드 오프의 정직한 요약입니다: 브라우저 도구는 안전한 리더이며, 언어 기능의 드롭 인 대체가 아닙니다.

일반적인 실제 소스는 무엇입니까?

여기 계시면 아마 이 중 하나일 겁니다. WordPress lean on serialization heavy in wp_options - widget_text, sidebars_widgets, theme_mods_*는,활성 플러그인 목록,cron 일정. WooCommerce 는 제품 변형,속성 및 사용자 정의 필드를 직렬화 된 포스트 메타로 저장하므로 잘못된 가격의 제품이 직렬화 된 값으로 되돌아가는 경우가 많습니다. Laravel 은 파일 캐시 및 세션 저장에 직렬화를 사용합니다. Magento's 구성 시스템은 모든 곳에서 동일한 형식; 동일한 디코딩 접근 방식.

도구가 수행하지 않는 몇 가지 작업

두 개의 정직한 경계. 참조를 해결하지 않습니다 - PHP 는 포인터를 이전 값으로 직렬화할 수 있습니다 (r: 또는 R:), 도구는 이를 리터럴로 표시합니다 [Reference] 그들을 따라가기 보다는 마커. 그리고 그것은 편집자가 아닌 리더입니다: 이 "change 이 값을 다시 serialize" mode. 직렬화된 데이터를 수정하려면 디코딩하고 PHP 또는 JSON 에서 변경한 후 PHP 측에서 다시 직렬화하십시오. 원시 문자열을 직접 편집해야 한다면 길이 접두사도 수정해야 한다는 점을 기억하고 - 위 섹션에 따라 - 문자가 아닌 바이트를 계산하십시오.

자주 묻는 질문

PHP 직렬화는 어떤 용도로 사용되나요?

배열이나 객체 같은 복잡한 값을 데이터베이스 열이나 파일,캐시에 살 수 있는 하나의 문자열로 변환하고,나중에 다시 만들 수 있습니다. WordPress,WooCommerce, Laravel,Magento 모두 설정,세션 데이터,캐시된 값에 많이 사용합니다.

PHP 서버 없이 PHP 데이터를 직렬화 해제할 수 있나요?

예. 그만큼 역직렬화 도구 브라우저에서 JavaScript 로 직렬화된 PHP 를 구문 분석합니다. PHP 설치 없음,서버 없음,계정 없음.

브라우저에서 직렬화된 데이터를 디코딩하는 것이 안전한가요?

예, 그리고 PHP's 자신의 보다 안전 합니다 unserialize() 신뢰할 수 없는 입력에서는 도구가 문자열 구조만 읽기 때문입니다. PHP 개체를 인스턴스화하지 않으므로 기본으로 만드는 마법 방법이 공격합니다 unserialize() 위험한 일은 일어날 수 없습니다.

직렬화된 문자열이 디코딩에 실패하는 이유는 무엇입니까?

일반적인 원인은 잘린 복사본 (후행 중괄호 또는 첫 번째 문자를 놓친 경우), 찾기 및 바꾸기 후 깨진 길이 접두사 또는 실제로 PHP 직렬화되지 않은 데이터입니다.One more that catches people: 문자열에 악센트 문자, 이모티콘 또는 CJK 텍스트가 포함되어 있으면 tool's 코드 단위 길이 계산이 잘못 구문 분석할 수 있습니다. 왜냐하면 PHP는 문자열 길이를 바이트 단위로 계산하고 도구는 UTF-16 단위를 계산하기 때문입니다.

나는 그것으로 워드 프레스 wp_options 값을 디코딩 할 수 있습니까?

예 - 가장 일반적인 용도 중 하나입니다. 쿼리 the option_value을 붙여넣고, 구조를 읽습니다.옵션에 멀티바이트 텍스트가 있으면 대신 서버에 WP-CLI가 필요할 수 있다는 점만 알아두세요.

이 도구로 직렬화된 데이터를 편집할 수 있나요?

아니요,리더입니다. 값을 변경하고,디코딩하고, PHP 또는 JSON 에서 편집하고,PHP 측에서 다시 직렬화하려면 원시 문자열을 직접 편집한다는 것은 오류가 발생하기 쉬운 바이트 길이 접두사를 직접 수정한다는 의미입니다.

PHP 직렬화와 JSON 의 차이점은 무엇입니까?

직렬화는 객체 클래스 이름과 개인 속성을 포함한 PHP 특정 유형을 보존합니다. JSON 은 언어에 구애받지 않으며 문자열,숫자, 부울,null, 배열 및 객체만 알고 있습니다. 새로운 코드는 일반적으로 JSON 을 선호합니다. 왜냐하면 json_decode() 객체를 인스턴스화하지 않으므로 주입 위험을 피하고 JSON은 어디에서나 읽을 수 있습니다. 디코딩된 구조를 로 이동할 수 있습니다 JSON 포맷터 그런 식으로 작업하는 것입니다.

도구가 배열뿐만 아니라 직렬화된 객체를 처리합니까?

예. 객체는 속성과 함께 보존된 클래스 이름으로 디코딩되며,개인 또는 보호 속성 (PHP 가 널바이트 접두사로 직렬화) 은 출력에서 읽을 수 있는 이름으로 정리됩니다.

결론

직렬화 된 PHP 데이터는 WordPress,WooCommerce 또는 Laravel 을 터치하면 피할 수 없으며 주문형으로 읽을 수 있으면 실망스러운 버그 범주가 빠른 버그로 바뀝니다. The 역직렬화 도구 브라우저 탭에서 그렇게합니까,안전한, PHP 서버없이 - 당신이 그것의 하나의 실제 가장자리를 알고있는 한: 멀티 바이트 문자열은 길이 카운팅 트립 할 수 있으며,ASCII 데이터는 그것이 빛나는 곳입니다. 붙여 넣기,읽기, 수정 및 데이터가 악센트 또는 이모티콘으로 가득 차있을 때,대신 WP-CLI 에 도달.


관련 도구:

Comments

0 comments

0/2000 characters

No comments yet. Be the first to share your thoughts!