현재 위치: > 최신 기사 목록> 공통 오류 및 디버깅 기술을 직렬화 및 비 제외 사용하십시오

공통 오류 및 디버깅 기술을 직렬화 및 비 제외 사용하십시오

gitbox 2025-05-27

PHP에서 Serialize ()Unserialize () 기능은 데이터 지속성 및 데이터 교환을 처리하는 데 중요한 도구입니다. 이 두 기능은 복잡한 데이터 구조를 문자열 형식 (직렬화)으로 변환하거나 문자열 형식을 원래 데이터 구조 (Deserialization)로 다시 변환 할 수 있습니다. 그러나 사용하기가 간단해 보이지만 사용하면 여전히 일반적인 실수가 발생하기 쉽습니다. 이 기사는 Serialize ()Unserialize () 함수를 올바르게 사용하고 몇 가지 일반적인 오류와 디버깅 기술을 분석하는 방법을 소개합니다.

1. Serialize ()unserialize () 의 기본 사용

Serialize () 함수

Serialize () 함수는 PHP 데이터 구조 (예 : 배열, 객체 등)를 문자열 형식으로 변환하는 데 사용됩니다. 이 문자열은 파일, 데이터베이스에 저장하거나 다른 시스템으로 전송할 수 있습니다. 기본 구문은 다음과 같습니다.

 <?php
$data = array('name' => 'Alice', 'age' => 25);
$serializedData = serialize($data);
echo $serializedData;
?>

출력 결과는 다음과 유사합니다.

 a:2:{s:4:"name";s:5:"Alice";s:3:"age";i:25;}

unsserialize () 함수

Unserialize () 함수는 직렬화 된 문자열을 원래 PHP 데이터 유형으로 복원하는 데 사용됩니다. 기본 구문은 다음과 같습니다.

 <?php
$serializedData = 'a:2:{s:4:"name";s:5:"Alice";s:3:"age";i:25;}';
$data = unserialize($serializedData);
print_r($data);
?>

출력 결과는 다음과 같습니다.

 Array
(
    [name] => Alice
    [age] => 25
)

2. 일반적인 오류 및 디버깅 기술

Serialize ()unserialize () 함수는 매우 강력하지만 사용 중에 일부 오류가 발생하기 쉽습니다. 다음은 몇 가지 FAQ 및 디버깅 팁입니다.

오류 1 : 사막화 중 데이터 형식 오류

unsserialize () 함수가 직렬화 된 문자열을 올바르게 구문 분석 할 수 없을 때 거짓이 반환됩니다. 가장 일반적인 이유는 직렬화 된 문자열이 잘못된 형식이기 때문입니다. 예를 들어:

 $invalidSerializedData = 'a:2:{s:4:"name";s:5:"Alice";';
$data = unserialize($invalidSerializedData);
if ($data === false) {
    echo "사제화가 실패했습니다!";
}

디버깅 팁 : var_dump () 또는 print_r ()을 사용하여 직렬화 된 문자열을 인쇄하여 손상되지 않고 직렬화 형식을 준수해야합니다.

오류 2 : 물체의 사막화가 실패했습니다

직렬화 된 데이터에 PHP 객체가 포함되어 있고 객체의 해당 클래스 파일이 존재하지 않거나 사막화 중에로드되지 않으면 unserialize () 가 실패합니다. 클래스 객체를 직렬화하여 데이터베이스에 저장한다고 가정하십시오. 필사적으로 해제하려고하면 클래스가 올바르게 포함되지 않으면 코드가 오류를보고합니다.

 class User {
    public $name;
    public $age;
}

$serializedObject = serialize(new User());
$serializedObject = base64_encode($serializedObject);  // 데이터가 저장되었다고 가정합니다

// 그런 다음 데이터베이스에서 검색하고 사형화하십시오
$serializedDataFromDB = base64_decode($serializedObject);
$user = unserialize($serializedDataFromDB);  // 만약에 User 클래스는 정의되지 않습니다,오류를보고합니다

디버깅 팁 : 클래스 정의가 현재 스크립트에 이미 포함되어 있는지 확인하거나 SPL_Autoload_register ()를 사용하여 클래스를 자동으로로드하십시오.

오류 3 : unsserialize ()를 사용할 때 보안 문제

Unserialize ()를 사용하면 들어오는 데이터가 변조되어 잠재적 인 보안 취약점을 초래할 수 있습니다. 예를 들어, 사용자가 입력 한 데이터가 확인되지 않았거나 소스를 알 수없는 경우 악의적 인 사용자는 사막화 공격을 통해 임의의 코드를 실행할 수 있습니다.

솔루션 : 신뢰할 수없는 데이터를 제조하지 않거나 unserialize () 의 두 번째 매개 변수를 사용하여 사막화 할 수있는 클래스를 제한하십시오. 예를 들어:

 $user = unserialize($data, ["allowed_classes" => ["User"]]);

이런 식으로, 사용자 클래스의 객체 만 사막화 될 수 있으며 잠재적 인 보안 위험을 피하기 위해 다른 클래스의 객체는 무시됩니다.

오류 4 : 직렬화 된 데이터에는 리소스 유형이 포함됩니다

파일 핸들, 데이터베이스 연결 및 기타 리소스 유형과 같은 일부 PHP 데이터 유형은 직렬화 할 수 없습니다. 이러한 유형의 데이터를 직렬화하려고하면 오류 또는 데이터 손실이 발생합니다.

 $fileHandle = fopen('file.txt', 'r');
$serializedFile = serialize($fileHandle);  // 리소스 직렬화 할 수 없습니다

디버그 팁 : 직렬화 된 데이터에 리소스 유형을 포함시키지 마십시오. 파일 경로 또는 데이터베이스 연결 정보가 필요한 경우 자원을 직접 직렬화하는 대신 일반 문자열로 저장할 수 있습니다.

3. 결론

Serialize ()Unserialize () 는 PHP에서 매우 유용한 도구이지만, 특히 복잡한 데이터 및 객체를 처리 할 때는주의해야합니다. 이러한 일반적인 실수 및 디버깅 팁을 이해하면 일반적인 함정을 피하고 데이터를 직렬화하고 제대로 제기 할 수 있는지 확인할 수 있습니다.

개발 중 직렬화 관련 오류가 발생하면 데이터 형식, 클래스로드 및 사막화 보안을 확인하십시오. 이 팁을 사용하면 두 기능을보다 효율적으로 사용하여 잠재적 위험과 오류를 줄일 수 있습니다.