현재 위치: > 최신 기사 목록> 파일 업로드와 함께 PHP 직렬화를 사용할 때 모범 사례

파일 업로드와 함께 PHP 직렬화를 사용할 때 모범 사례

gitbox 2025-05-19

PHP 개발에서 Serialize () 함수는 종종 데이터 구조 (예 : 배열 또는 객체)를 스트링으로 쉽게 저장하거나 전송하기 위해 문자열로 변환하는 데 사용됩니다. 그러나 파일 업로드와 함께 사용하면 부적절한 치료를 사용하면 특히 데이터를 제조 할 때 보안 취약점으로 이어질 수 있습니다. 이 기사에서는 파일 업로드 시나리오에서 Serialize () 함수를 안전하게 사용하는 방법에 대해 논의하고 모범 사례를 따릅니다.

1. Serialize ()unsserialize () 작동 방식을 이해하십시오

PHP의 Serialize () 함수는 PHP 값 (예 : 배열, 객체 등)을 저장 또는 전송할 수있는 문자열 형식으로 변환합니다. 예를 들어:

 $data = ['username' => 'admin', 'password' => '12345'];
$serialized_data = serialize($data);
echo $serialized_data;

출력은 다음과 같습니다.

 a:2:{s:8:"username";s:5:"admin";s:8:"password";s:5:"12345";}

비교적, unsserialize ()는 serialize () 에서 문자열 출력을 PHP 값으로 변환하는 데 사용됩니다. 파일 업로드 과정에서 일반적으로 파일 데이터를 Serialize () 를 통해 파일별로 업로드 한 정보 저장과 같은 특정 형식의 파일에 파일 데이터를 저장합니다.

2. 파일 업로드의 기본 프로세스

사용자가 Serialize () 를 통해 파일을 업로드하고 관련 정보를 저장할 수있는 파일 업로드 기능이 있다고 가정합니다. 간단한 파일 업로드 코드는 다음과 같습니다.

 if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['file'])) {
    $file = $_FILES['file'];
    $file_data = [
        'filename' => $file['name'],
        'filetype' => $file['type'],
        'filesize' => $file['size'],
        'filetmp' => $file['tmp_name']
    ];

    // 사용 serialize() 파일 정보를 저장하십시오
    $serialized_data = serialize($file_data);
    file_put_contents('uploads/file_info.txt', $serialized_data);
}

3. 사막화 중 위험

사제화 (즉, unserialize () )는 특히 공격자가 사막화 된 데이터를 조작 할 수있는 경우, 악의적 인 코드 또는 데이터 무결성을 손상시킬 수있는 경우에도 위험을 초래할 수 있습니다. 예를 들어, 공격자는 악의적 인 PHP 객체 또는 코드를 포함하는 신중하게 구성된 직렬화 된 데이터를 업로드 할 수 있습니다.

4. 사산화 공격을 방지하기위한 보안 조치

사막화의 보안을 보장하기 위해 몇 가지 모범 사례가 있습니다.

4.1 Serialize ()를 사용할 때 민감한 정보 저장을 피하십시오.

민감한 정보 (예 : 암호, API 키 등)를 직렬화하지 말고 Serialize () 를 통해 저장하십시오. 이 정보는 항상 암호화 된 양식으로 저장해야합니다.

4.2 파일 유형 및 크기를 확인하십시오

파일을 업로드 할 때는 악성 파일 업로드를 피하기 위해 파일 유형과 파일 크기를 확인하십시오. $ _files [ 'file'] [ 'type']$ _files [ 'file'] [ 'size']를 사용하여 파일 유형 및 크기를 결정할 수 있습니다.

 if ($file['size'] > 5000000) {
    echo "너무 큰 파일";
    exit;
}

$allowed_types = ['image/jpeg', 'image/png'];
if (!in_array($file['type'], $allowed_types)) {
    echo "지원되지 않는 파일 유형";
    exit;
}

4.3 unsserialize ()를 사용할 때 허용 클래스 제한

PHP를 사용하면 사형화시 객체를 만들 수 있습니다. 클래스 사용이 제한되지 않으면 공격자는 악의적 인 객체를 전달하여 위험한 코드 실행을 유발할 수 있습니다. allend_classes 매개 변수를 설정하여 악의적 인 클래스의 사막화를 방지 할 수 있습니다.

 $data = file_get_contents('uploads/file_info.txt');
$file_data = unserialize($data, ["allowed_classes" => false]);  // 객체 생성을 비활성화합니다

이러한 움직임은 공격자가 사막화 취약점을 사용하여 악성 코드를 실행하는 것을 효과적으로 방지 할 수 있습니다.

4.4 해시 검증 사용

업로드 된 데이터의 무결성을 보장하려면 해시 값 (예 : MD5, SHA256)을 사용하여 업로드 된 파일 데이터를 확인할 수 있습니다. 파일이 업로드되면 해시가 생성되어 실제 파일의 해시와 비교하여 변조를 피합니다.

 $uploaded_hash = hash_file('sha256', $file['tmp_name']);
$stored_hash = file_get_contents('uploads/file_hash.txt');
if ($uploaded_hash !== $stored_hash) {
    echo "파일 내용이 변조되었습니다";
    exit;
}

4.5 파일 업로드 취약점 방지

파일 업로드 자체는 또한 공격 입구가 될 수 있습니다. 악성 파일 업로드를 방지하려면 파일 유형 및 크기를 확인하는 것 외에도 사용자가 실행 파일을 업로드하지 못하도록 측정을 수행해야합니다. 예를 들어 .php.exe 와 같은 파일 유형을 업로드하거나 업로드 된 파일을 실행되지 않은 디렉토리에 저장합니다.

 $disallowed_extensions = ['php', 'exe'];
$file_extension = pathinfo($file['name'], PATHINFO_EXTENSION);
if (in_array(strtolower($file_extension), $disallowed_extensions)) {
    echo "이 파일 유형은 금지되어 있습니다";
    exit;
}

4.6 보안 저장 방법을 사용하십시오

파일과 데이터를 안전한 장소에 저장하고 업로드 된 파일을 올바르게 격리하고 보호해야합니다. 전체 파일 데이터의 직렬화 결과를 저장하는 대신 데이터베이스를 사용하여 업로드 된 파일 (예 : 파일 경로, 해시 등)의 메타 데이터를 저장할 수 있습니다.

5. 요약

Serialize () 함수를 파일 업로드 함수와 결합 할 때는 보안 문제에주의를 기울여야합니다. 사막화 공격, 파일 유형 및 크기 검증, 파일 저장 방법 등과 같은 요인은 개발 프로세스 중에 엄격한 설계 및 보호가 필요합니다. 모범 사례를 사용하면 파일 업로드의 보안을 보장하여 악의적 인 사용자가 취약점을 악용하지 못하게 할 수 있습니다.


위는 PHP에서 Serialize () 함수를 안전하게 사용하고 파일 업로드와 결합하는 방법에 대한 모범 사례입니다. 질문이 있으시면 언제든지 물어보십시오!