위 내용은 파일이 업로드된 후 전역 배열에 있는 현재 업로드된 파일에 대한 모든 정보입니다. 하지만 이 정보가 안전하다고 보장할 수 있나요? 이름이나 기타 정보가 변조된 경우 어떻게 되나요? 우리는 항상 고객의 정보에 주의해야 합니다!
특정 http 요청의 일부 파일 업로드를 더 잘 이해하려면 클라이언트가 보낸 http 요청에 어떤 특정 정보가 포함되어 있는지 확인해야 합니다. 앞서 올렸던 첨부파일은 이 블로그의 로고이기 때문에 저희가 위의 실험을 하기에는 적합하지 않습니다. 그래서 구체적으로 다음 내용이 포함된 test.text 텍스트 파일을 다시 업로드했습니다.
위 요청 형식에는 주의해야 할 몇 가지 필드가 있습니다. 즉, 이름, filename 및 Content-Type은 각각 업로드 파일 상자의 필드 이름(첨부 파일), 사용자가 로컬 하드 디스크에서 업로드한 파일 이름(test.txt) 및 업로드된 파일 형식(text/)을 나타냅니다. 일반(텍스트 파일을 나타냄) 그러면 아래에 업로드된 파일의 특정 내용인 빈 줄이 표시됩니다.
2. 보안 강화 파일 업로드 시 보안을 강화하기 위해서는 $_FILES 전역 배열에서 tmp_name과 크기를 확인해야 합니다. tmp_name이 가리키는 파일이 실제로 /etc/passwd와 같은 것을 가리키는 대신 사용자가 클라이언트에 업로드한 파일인지 확인하려면 PHP에서 is_uploaded_file() 함수를 사용하여 판단할 수 있습니다. 🎜>
if (is_uploaded_file($filename)) { /* 업로드된 파일입니다. */ }
어떤 경우에는 사용자가 파일을 업로드한 후 성공적으로 업로드된 파일의 내용이 사용자에게 표시될 수 있으므로 위 코드를 확인하는 것이 특히 중요합니다.
또 확인해야 할 사항은 업로드된 파일의 MIME 유형입니다. 이는 위에서 언급한 upload.php의 출력 배열 유형 필드입니다. 첫 번째 예시에서 업로드한 것은 이미지이므로 $_FILES['attachment']['type'] 값은 'image/jpeg' 입니다. 서버 측에서 image/png, image/jpeg, image/gif, image/x-png 및 image/p-jpeg와 같은 MIME 유형 이미지만 허용하려는 경우 다음과 유사한 코드를 사용하여 확인할 수 있습니다. (예제를 제시하세요. 오류 보고 등과 같은 특정 코드는 시스템의 메커니즘을 따라야 합니다.):
'이미지/PNG', '이미지/X-PNG', '이미지/GIF ', '이미지/JPEG' ~ Allow_mimes)) { DIE ('죄송합니다. 업로드한 파일 형식이 정확하지 않습니다. 사진 파일만 허용됩니다.'); 보시다시피, 파일의 MIME 유형이 서버 측 요구 사항을 충족하는지 확인했습니다. 그러나 이러한 마임형 악성 사용자는 위장할 수 있기 때문에 악의적인 사용자가 다른 유해 파일을 업로드하는 것을 방지하는 것만으로는 충분하지 않습니다. 예를 들어, 사용자는 jpg 사진을 만들고 사진의 메타데이터에 악성 PHP 코드를 작성한 다음 접미사가 php.ini인 파일로 저장했습니다. 이 악성 파일이 업로드되면 서버 측 MIME 유형 검사를 성공적으로 통과하고 이미지로 간주되며 내부의 위험한 PHP 코드가 실행됩니다. 특정 이미지 메타데이터는 다음과 유사합니다.
이미지 메타데이터의 Comment 필드에 PHP 코드가 추가된 것을 확인할 수 있습니다. 따라서 유사한 위험한 상황이 발생하지 않도록 하기 위해서는 업로드된 파일의 확장자에 대해 필요한 점검이 이루어져야 함은 자명하다. 다음 코드는 Mime 유형 확인을 위한 이전 코드를 향상시킵니다.
if(!array_key_exists($ image['type'], $allow_mimes )) { die('죄송합니다. 파일 형식이 정확하지 않습니다. 이미지 파일만 허용합니다.'); | '이름'], '.'));
🎜> // 업로드된 파일을 계속 처리합니다
위의 코드를 통해 우리는 메타가 업로드된 이미지의 파일에 PHP 코드가 포함되어 있는 경우, 이미지 파일 이름은 접미사 File이라는 이름의 image format으로 바뀌므로 그 안의 PHP 코드는 실행되지 않습니다. 위 코드는 일반 업로드 이미지에 부정적인 영향을 미치지 않습니다.
보안을 강화하기 위해 위 단계를 수행한 후 업로드된 파일을 지정된 디렉터리에 저장하려는 경우 PHP의 기본 함수 move_uploaded_file을 사용하여 이를 달성할 수 있습니다.