현재 위치: > 최신 기사 목록> 일반적인 PHP 보안 취약점 및 보호: 삽입, 파일 포함 및 업로드에 대한 실용 가이드

일반적인 PHP 보안 취약점 및 보호: 삽입, 파일 포함 및 업로드에 대한 실용 가이드

M66 2025-10-28

소개

인터넷이 발전함에 따라 PHP 기반 웹사이트는 여전히 많은 수의 애플리케이션 시나리오를 차지하고 있습니다. PHP의 유연성과 인기로 인해 안전하지 않은 작성 방법은 공격자에 의해 쉽게 악용될 수 있습니다. 본 글에서는 여러 가지 일반적인 취약점에 대한 활용 방법과 방어 아이디어를 실용적인 관점에서 소개하고, 쉬운 이해와 복구를 위해 샘플 코드를 그대로 담고 있습니다(코드 블록은 최대한 그대로 유지하고, 헷갈리는 HTML 구조만 정리합니다). 사이트 홍보나 내부 링크 관련 정보가 기사에서 삭제되었습니다.

SQL 주입 예시 및 보호

설명: 공격자는 악성 SQL 조각을 입력에 삽입하고 원본 쿼리 논리를 변경하여 확인을 우회하거나 데이터를 훔치거나 변조합니다.

 <?php
$id = $_GET['id'];

// 접합 SQL 쿼리문
$sql = "SELECT * FROM users WHERE id = " . $id;

// 쿼리 실행
$result = mysqli_query($conn, $sql);

// 쿼리 결과 처리
// ...
?>

문제: 사용자 입력을 직접 연결하면 명령문이 변조될 수 있습니다. 예를 들어 id=1 OR 1=1을 전달하면 조건이 항상 true가 되어 민감한 데이터 유출이나 인증 우회가 발생할 수 있습니다.

보호 제안: 매개변수화된 쿼리(전처리된 문) 또는 ORM을 사용하여 사용자 입력을 직접 연결하는 것을 방지합니다. 입력에 대한 유형 확인을 수행합니다(예: ID가 정수인지 확인). 내부 세부 정보 유출을 방지하려면 오류 메시지를 적절하게 처리하세요.

파일에는 취약점 예제와 보호 기능이 포함되어 있습니다.

설명: 파일이 포함된 경로가 엄격하게 제어되지 않는 경우 공격자는 모든 파일, 심지어 원격 파일(구성이 허용하는 경우)을 포함하도록 특별히 제작된 경로를 전달하여 민감한 파일 공개 또는 원격 코드 실행으로 이어질 수 있습니다.

 <?php
$page = $_GET['page'];

// 접합文件路径并包含文件
include("pages/" . $page . ".php");

?>

문제: 페이지 매개변수에 제한이 없습니다. 공격자는 page=../config 와 같은 경로를 통해 상위 디렉터리의 민감한 구성에 접근하거나 파일이 업로드된 후 스크립트를 사용하여 실행할 수 있습니다.

보호 제안: 사용자의 경로를 직접 포함하지 마세요. 화이트리스트 메커니즘을 사용하여 포함할 수 있는 파일 이름을 제한합니다. 기본 디렉터리를 사용하고 포함하기 전에 절대 경로에 대한 경로를 확인하고 허용 범위 내에 있는지 확인합니다. 원격 포함을 허용하는 PHP 구성 옵션(예:allow_url_include)을 끄십시오.

파일 업로드 취약점 예시 및 보호

설명: 파일 업로드 기능이 파일 확장자나 이름만 확인할 경우, 공격자가 위장한 실행 스크립트를 업로드하여 서버에서 실행함으로써 더 높은 권한을 얻을 수 있습니다.

 <?php
$targetDir = "uploads/";
$targetFile = $targetDir . basename($_FILES["fileToUpload"]["name"]);

// 파일 형식 확인
$fileType = strtolower(pathinfo($targetFile, PATHINFO_EXTENSION));
if ($fileType != "jpg" && $fileType != "png" && $fileType != "jpeg" && $fileType != "gif") {
    exit("이미지 파일만 업로드하도록 허용!");
}

// 파일 업로드
if(move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $targetFile)) {
    echo "파일이 성공적으로 업로드되었습니다.!";
} else {
    echo "파일 업로드 실패!";
}

?>

문제: 파일 확장자만으로는 판단하는 것이 신뢰할 수 없습니다. 공격자는 확장자를 변경하거나 MIME 유형을 위조하여 악성 스크립트를 업로드할 수 있습니다.

보호 제안:

  • 확장명이나 프런트엔드 MIME 유형 판단뿐만 아니라 파일에서 콘텐츠 감지(예: 이미지 처리 라이브러리를 사용하여 실제 이미지 헤더 정보 확인)를 수행합니다.
  • 업로드된 파일에 대해 임의의 파일 이름을 생성하고 웹에서 직접 접근할 수 없는 디렉터리에 저장합니다(또는 이 디렉터리에서 스크립트 실행을 금지하도록 서버를 구성합니다).
  • 파일 크기와 속도를 제한하고 사용자 권한을 확인하십시오.
  • 공개적으로 액세스할 수 있어야 하는 디렉토리에서는 서버 구성이 PHP와 같은 실행 가능 유형의 구문 분석을 금지하는지 확인하십시오(예: 웹 서버 구성 또는 .htaccess 배치를 통해).

안전한 개발 및 운영을 위한 일반 권장사항

보안은 한 번의 작업으로 달성될 수 없습니다. 개발, 운영 및 유지 관리 중에는 다음 관행을 채택하는 것이 좋습니다.

  • 입력은 항상 신뢰할 수 없습니다. 모든 외부 입력은 확인 및 필터링되며 화이트리스트 원칙에 따라 처리됩니다.
  • 최소 권한의 원칙: 데이터베이스 계정에 대해 권한이 제한된 계정을 사용해 보십시오. 파일 시스템 권한은 실행에 필요한 최소 권한으로 제한되어야 합니다.
  • 최신 라이브러리 및 프레임워크 사용: 성숙한 프레임워크나 라이브러리를 사용하여 데이터베이스, 인증 및 파일 작업을 처리하고 일반적인 기능을 직접 구현하지 마십시오.
  • 코드 감사 및 자동화된 스캐닝: 정기적인 코드 감사를 수행하고, 정적 분석 및 동적 스캐닝 도구를 도입하고, 발견된 문제를 즉시 복구합니다.
  • 로그 및 경고: 비정상적인 동작 발생 시 즉시 감지하고 대응할 수 있습니다. 로그에는 민감한 자격 증명이 포함되어서는 안 됩니다.

결론

이 문서에서는 몇 가지 일반적인 PHP 보안 문제와 해당 보호 아이디어를 보여줍니다. 개발자는 요구 사항, 설계, 구현, 운영 및 유지 관리의 모든 측면에 보안 인식을 통합할 수 있기를 바랍니다. 예제의 각 취약점 유형에 대해 실제 환경은 더 복잡할 수 있습니다. 목표 복구를 위해 코드 감사, 자동 스캐닝 및 침투 테스트 결과를 결합하는 것이 좋습니다.