PHP에서 직렬화 및 비 제외 기능은 일반적으로 PHP 변수를 문자열로 변환하고 저장 또는 전송에 사용됩니다. 둘 다 개발 프로세스에서 매우 유용하지만 찾기 어려운 오류도 소개 할 수도 있습니다. 이러한 오류를 디버깅 할 때 문제를 찾는 데 도움이되는 몇 가지 팁이 필요합니다. 이 기사에서는 몇 가지 일반적인 오류와 해당 솔루션을 소개하고 이러한 기능을 효과적으로 디버깅하는 방법을 안내합니다.
Serialize 함수는 PHP 변수를 문자열로 변환하며, 이는 비 시절 함수를 통해 원래 PHP 변수로 복원 할 수 있습니다. Serialize 이후의 데이터가 잘못된 경우, 비 서식은 원래 데이터를 올바르게 복구하지 않으며 경고를 던질 수도 있습니다.
$myData = array('name' => 'John', 'age' => 30);
$serializedData = serialize($myData);
// 직렬화 된 데이터를 수동으로 변조합니다
$serializedData = substr($serializedData, 0, 20);
$unserializedData = unserialize($serializedData);
데이터 무결성 확인 : 보관하거나 전송할 때 직렬화 된 데이터가 잘리지 않거나 손상되지 않도록하십시오.
직렬화 된 데이터 인쇄 및 기록 : var_dump 또는 echo를 사용하여 직렬화 된 데이터를 출력하여 예상 형식을 충족하는지 확인하십시오.
var_dump($serializedData);
직렬화 된 데이터가 예기치 않게 수정되면 데이터의 무결성 (예 : 해시 또는 체크섬 사용)을 확인하고 확인하여 데이터의 무결성을 보장 할 수 있습니다.
비 속기를 사용하면 예기치 않은 데이터 유형이 나타날 수 있습니다. 예를 들어, 비 시로 화 될 때 직렬화 된 객체가 올바르게로드되지 않으면 NULL 또는 잘못된 유형의 값을 반환 할 수 있습니다.
class User {
public $name;
}
$serializedData = serialize(new User());
$unserializedData = unserialize($serializedData);
var_dump($unserializedData); // 예상됩니다 User 물체,그러나 돌아올 수 있습니다 NULL
클래스가로드되었는지 확인하십시오 : 객체를 필수화하는 문제가 발생하면 먼저 해당 클래스가로드되었는지 확인하십시오.
class_exists () 및 method_exists ()를 사용하십시오 : 사형화 된 클래스가 PHP에 정의되어 있고 올바르게 인스턴스화 할 수 있는지 확인하십시오.
if (!class_exists('User')) {
echo "친절한 User 한정되지 않은";
} else {
$unserializedData = unserialize($serializedData);
var_dump($unserializedData);
}
SPL_AUTOLOAD_REGISTER ()를 사용하여 제조 된 객체의 클래스가 올바르게로드되었거나 동적으로로드되었는지 확인하십시오.
PHP 5.3 이상에서는 Unserialize () 함수의 두 번째 매개 변수를 사용하여 보안 을 향상시킬 수 있습니다.
$unserializedData = unserialize($serializedData, ["allowed_classes" => ["User"]]);
사막화 운영에는 보안 위험이 있으며 악성 직렬화 데이터는 특히 데이터가 올바르게 확인되지 않은 경우 코드 실행 취약점으로 이어질 수 있습니다. 공격자는 직렬화 된 데이터를 변조하여 악성 코드를 실행하려고 시도 할 수 있습니다.
$maliciousData = 'O:4:"User":1:{s:4:"name";s:4:"evil";}';
$unserializedData = unserialize($maliciousData);
데이터 소스 확인 : 데이터 소스를 버리기 전에 항상 데이터 소스를 확인하여 데이터가 신뢰할 수있는 소스에서 나오는지 확인하십시오.
화이트리스트 메커니즘 사용 : allend_classes 매개 변수를 설정하면 사막화 중에 특정 클래스 만 사막화 할 수 있는지 확인하십시오.
Unserialize () 의 allend_classes 매개 변수를 사용하여 특정 클래스만이 서식 할 수 있도록 제한하십시오.
사막화 공격의 위험을 줄이기 위해 PHP 객체를 직접 직렬화하는 대신 데이터 전송에 JSON 형식을 사용하는 것을 고려하십시오.
$unserializedData = unserialize($maliciousData, ["allowed_classes" => ["User"]]);
개발 중에는 기능을보다 효율적으로 직렬화 하고 비 제외 화 의 문제를 디버깅하는 데 사용할 수있는 도구와 트릭이 있습니다.
직렬화 된 데이터를 로그 파일에 로그인하면 문제가 발생하면 원본 데이터를 다시 볼 수 있습니다.
file_put_contents('serialize_log.txt', $serializedData . PHP_EOL, FILE_APPEND);
직렬화 및 사막화 관련 코드에 대한 단위 테스트를 작성하여 데이터가 올바르게 직렬화되고 사막화 될 수 있으며 예외를 포착 할 수 있습니다.
public function testSerialization() {
$data = array('name' => 'John', 'age' => 30);
$serializedData = serialize($data);
$this->assertNotEmpty($serializedData);
$unserializedData = unserialize($serializedData);
$this->assertEquals($data, $unserializedData);
}
VAR_DUMP 는 변수의 자세한 유형과 내용을 표시 할 수있는 강력한 디버깅 도구로 문제를 신속하게 식별 할 수 있습니다.
var_dump($unserializedData);
직렬화 및 비 제외 화 기능에서 오류를 디버깅 할 때는 여러 관점에서 문제를 고려해야합니다. 데이터 형식이 완료되는지 여부, 클래스가 올바르게로드되는지 여부, 데이터가 변조되는지 등의 합리적인 디버깅 도구, 엄격한 데이터 검증 및 적절한 보안 조치를 통해 이러한 공통 오류를 효과적으로 줄이고 수정할 수 있습니다.
이 기사가 PHP에서 직렬화 및 비 서식을 처리 할 때 더 편리하게되기를 바랍니다.