인터넷이 발전함에 따라 PHP 기반 웹사이트는 여전히 많은 수의 애플리케이션 시나리오를 차지하고 있습니다. PHP의 유연성과 인기로 인해 안전하지 않은 작성 방법은 공격자에 의해 쉽게 악용될 수 있습니다. 본 글에서는 여러 가지 일반적인 취약점에 대한 활용 방법과 방어 아이디어를 실용적인 관점에서 소개하고, 쉬운 이해와 복구를 위해 샘플 코드를 그대로 담고 있습니다(코드 블록은 최대한 그대로 유지하고, 헷갈리는 HTML 구조만 정리합니다). 사이트 홍보나 내부 링크 관련 정보가 기사에서 삭제되었습니다.
설명: 공격자는 악성 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 유형을 위조하여 악성 스크립트를 업로드할 수 있습니다.
보호 제안:
보안은 한 번의 작업으로 달성될 수 없습니다. 개발, 운영 및 유지 관리 중에는 다음 관행을 채택하는 것이 좋습니다.
이 문서에서는 몇 가지 일반적인 PHP 보안 문제와 해당 보호 아이디어를 보여줍니다. 개발자는 요구 사항, 설계, 구현, 운영 및 유지 관리의 모든 측면에 보안 인식을 통합할 수 있기를 바랍니다. 예제의 각 취약점 유형에 대해 실제 환경은 더 복잡할 수 있습니다. 목표 복구를 위해 코드 감사, 자동 스캐닝 및 침투 테스트 결과를 결합하는 것이 좋습니다.