> 백엔드 개발 > PHP 튜토리얼 > 일반적인 PHP 보안 문제 및 이를 방지하는 방법

일반적인 PHP 보안 문제 및 이를 방지하는 방법

Patricia Arquette
풀어 주다: 2024-12-30 19:34:10
원래의
134명이 탐색했습니다.

Common PHP Security Issues and How to Prevent Them

일반적인 PHP 보안 문제 및 예방 방법

보안은 웹 개발에서 가장 중요한 측면 중 하나입니다. 가장 널리 사용되는 서버 측 프로그래밍 언어 중 하나인 PHP는 제대로 보호되지 않으면 공격 대상이 되는 경우가 많습니다. 개발자는 일반적인 보안 취약성을 인식하고 애플리케이션을 보호하는 데 필요한 조치를 구현해야 합니다.

이 기사에서는 가장 일반적인 PHP 보안 문제와 이를 완화하는 방법을 살펴보겠습니다.


1. SQL 인젝션

문제:
SQL 주입은 공격자가 사용자 입력을 통해 악성 SQL 코드를 주입하여 SQL 쿼리를 조작할 수 있을 때 발생합니다. 적절한 유효성 검사 또는 삭제 없이 사용자 입력이 SQL 쿼리에 직접 포함되면 공격자가 임의의 SQL 명령을 실행하여 데이터베이스를 손상시킬 수 있습니다.

예방 방법:

  • Prepared 문 및 매개변수화된 쿼리 사용: 준비된 문과 함께 PDO(PHP Data Objects) 또는 MySQLi를 사용하면 SQL 쿼리를 데이터에서 분리하여 SQL 삽입을 방지할 수 있습니다.
  • PDO의 예:
  $stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email');
  $stmt->execute(['email' => $userEmail]);
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

:email을 사용하면 자리 표시자로 쿼리가 준비되고 실제 값이 별도로 바인딩되므로 사용자 입력이 쿼리에 직접 삽입되지 않습니다.

  • 입력 유효성 검사: 사용자 입력을 SQL 쿼리에 사용하기 전에 항상 유효성을 검사하고 삭제합니다.
  • 최소 권한: 데이터베이스 사용자에게 작업을 수행하는 데 필요한 최소한의 권한이 있는지 확인하세요.

2. XSS(교차 사이트 스크립팅)

문제:
XSS는 공격자가 다른 사용자가 보는 웹 페이지에 악성 스크립트(일반적으로 JavaScript)를 삽입할 때 발생합니다. 이 스크립트는 세션 쿠키를 훔치거나, 사용자를 악성 사이트로 리디렉션하거나, 사용자를 대신하여 승인되지 않은 작업을 실행하는 데 사용될 수 있습니다.

예방 방법:

  • 이스케이프 출력: 브라우저에 표시되는 모든 사용자 생성 콘텐츠가 올바르게 이스케이프되었는지 확인하세요. 특수 문자를 HTML 엔터티로 변환하려면 htmlspecialchars()를 사용하세요.
  echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

이렇게 하면 사용자 입력의 HTML 또는 JavaScript 코드가 브라우저에서 실행되지 않습니다.

  • 콘텐츠 보안 정책(CSP): CSP를 구현하여 웹사이트에 로드할 수 있는 콘텐츠 유형을 제한하고 XSS 공격을 완화합니다.

  • 입력 유효성 검사: 특히 HTML 출력용 데이터를 받을 때 사용자 입력을 항상 삭제합니다.


3. 사이트 간 요청 위조(CSRF)

문제:
CSRF는 악의적인 사용자가 다른 사용자를 속여 동의 없이 웹 애플리케이션에서 작업(비밀번호 변경, 구매 등)을 수행하도록 하는 공격입니다. 이는 일반적으로 공격자가 피해자의 인증된 세션을 사용하여 무단 요청을 할 때 발생합니다.

예방 방법:

  • CSRF 토큰 사용: 데이터를 수정하는 각 요청에 대해 고유한 무작위 토큰을 생성합니다. 이 토큰은 합법적인지 확인하기 위해 요청이 이루어질 때 유효성을 검사해야 합니다.
  $stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email');
  $stmt->execute(['email' => $userEmail]);
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
  • Same-Site 쿠키: SameSite 쿠키 속성을 사용하여 교차 사이트 요청에서 쿠키가 전송되는 방식을 제한합니다.
  echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

4. 안전하지 않은 파일 업로드

문제:
사용자가 적절한 유효성 검사 없이 파일을 업로드하도록 허용하면 심각한 취약점이 발생할 수 있습니다. 공격자는 서버에서 실행될 수 있는 PHP 스크립트와 같은 악성 파일을 업로드할 수 있습니다.

예방 방법:

  • 파일 확장자 및 MIME 유형 확인: 항상 확장자와 MIME 유형을 확인하여 파일 유형을 확인하세요. 사용자가 제공한 데이터에만 의존하지 마십시오.
  // Generate CSRF token
  $_SESSION['csrf_token'] = bin2hex(random_bytes(32));

  // Include token in form
  echo '<input type="hidden" name="csrf_token" value="' . $_SESSION['csrf_token'] . '">';

  // Validate token on form submission
  if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {
      die('CSRF token validation failed.');
  }
로그인 후 복사
로그인 후 복사
  • 파일 크기 제한: 업로드에 대한 최대 파일 크기 제한을 설정하여 대용량 파일을 통한 DoS(서비스 거부) 공격을 방지합니다.

  • 업로드된 파일 이름 바꾸기: 원본 파일 이름을 사용하지 마세요. 사용자가 기존 파일을 추측하거나 덮어쓰지 못하도록 업로드된 파일의 이름을 고유한 이름으로 변경하세요.

  • 웹 루트 외부에 파일 저장: 업로드된 파일을 웹을 통해 접근할 수 없는 디렉토리(예: public_html 또는 www 폴더 외부)에 저장합니다.

  • 실행 파일 허용 안 함: .php, .exe 또는 기타 실행 파일 형식의 업로드를 절대 허용하지 마세요. 파일 형식을 검증하더라도 잠재적으로 코드를 실행할 수 있는 파일은 처리하지 않는 것이 좋습니다.


5. 부족한 세션 관리

문제:
잘못된 세션 관리 방식으로 인해 애플리케이션이 세션 하이재킹이나 세션 고정과 같은 공격에 취약해질 수 있습니다. 예를 들어 공격자는 세션 식별자가 적절하게 보호되지 않으면 이를 도용하거나 예측할 수 있습니다.

예방 방법:

  • 보안 쿠키 사용: 세션 쿠키에 HttpOnly, Secure 및 SameSite 플래그가 설정되어 있는지 확인하세요.
  $stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email');
  $stmt->execute(['email' => $userEmail]);
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
  • 세션 ID 재생성: 사용자가 로그인하거나 민감한 작업을 수행할 때마다 세션 ID를 재생성하여 세션 고정을 방지합니다.
  echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
  • 세션 만료: 세션이 무기한 열려 있지 않도록 적절한 세션 만료 시간을 설정하고 세션 시간 초과를 구현합니다.

6. 명령 주입

문제:
명령 주입은 공격자가 PHP의 exec(), shell_exec(), system() 또는 유사한 함수에 의해 실행되는 시스템 명령에 악성 명령을 주입할 때 발생합니다. 이로 인해 공격자가 서버에서 임의의 명령을 실행할 수 있습니다.

예방 방법:

  • 셸 함수 사용 방지: 사용자 입력에 exec(), shell_exec(), system() 또는 passthru()와 같은 함수를 사용하지 마세요. 이러한 기능을 사용해야 하는 경우 입력의 적절한 유효성 검사 및 삭제를 확인하세요.

  • Escapeshellcmd() 및 Escapeshellarg() 사용: 셸 명령을 실행해야 하는 경우 escapeshellcmd() 및 escapeshellarg()를 사용하여 명령줄에 전달하기 전에 사용자 입력을 삭제하세요.

  // Generate CSRF token
  $_SESSION['csrf_token'] = bin2hex(random_bytes(32));

  // Include token in form
  echo '<input type="hidden" name="csrf_token" value="' . $_SESSION['csrf_token'] . '">';

  // Validate token on form submission
  if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {
      die('CSRF token validation failed.');
  }
로그인 후 복사
로그인 후 복사

7. 부적절한 오류 처리

문제:
민감한 오류 메시지를 노출하면 애플리케이션 구조에 대한 정보가 노출될 수 있으며, 이는 공격자가 악용할 수 있습니다. 이는 사용자에게 자세한 오류 메시지가 표시될 때 자주 발생합니다.

예방 방법:

  • 프로덕션 오류 표시 비활성화: 프로덕션에서 사용자에게 자세한 오류 메시지를 표시하지 않습니다. 대신 오류를 파일에 기록하고 일반 오류 메시지를 사용자에게 표시하십시오.
  setcookie('session', $sessionId, ['samesite' => 'Strict']);
로그인 후 복사
  • 오류 기록: 적절한 로깅 메커니즘(예: error_log())을 사용하여 오류 정보를 최종 사용자에게 공개하지 않고 안전하게 캡처합니다.
  $allowedTypes = ['image/jpeg', 'image/png'];
  if (in_array($_FILES['file']['type'], $allowedTypes)) {
      // Proceed with file upload
  }
로그인 후 복사

8. 사이트 간 WebSocket 하이재킹

문제:
PHP 애플리케이션에서 WebSocket을 사용하는 경우 안전하지 않은 WebSocket 연결을 하이재킹하여 사용자를 사칭하고 악성 데이터를 보낼 수 있습니다.

예방 방법:

  • WebSocket 연결에 HTTPS 사용: 데이터를 암호화하려면 ws://가 아닌 wss://(WebSocket Secure)를 통해 WebSocket 연결이 설정되어 있는지 확인하세요.

  • 오리진 헤더 유효성 검사: 요청이 허용된 도메인에서 오는지 확인하기 위해 오리진 헤더의 유효성을 검사합니다.

  $stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email');
  $stmt->execute(['email' => $userEmail]);
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

9. 취약한 비밀번호 저장

문제:
사용자 비밀번호를 일반 텍스트로 저장하거나 약한 해싱 알고리즘을 사용하면 데이터베이스가 손상된 경우 심각한 보안 문제가 발생할 수 있습니다.

예방 방법:

  • 강력한 해싱 알고리즘 사용: PHP에 내장된password_hash() 및password_verify()함수를 사용하여 비밀번호를 안전하게 해시하고 확인하세요.
  echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
  • 솔팅: 항상 솔트(password_hash()에서 자동으로 수행됨)를 사용하여 두 사용자가 동일한 비밀번호를 사용하더라도 해시가 서로 달라지도록 합니다.

결론

PHP 보안은 애플리케이션과 사용자 모두를 보호하는 데 매우 중요합니다. SQL 주입, XSS, CSRF, 파일 업로드 문제, 세션 관리 결함과 같은 일반적인 취약점을 이해하고 완화함으로써 PHP 애플리케이션의 보안 상태를 크게 향상할 수 있습니다.

준비된 문 사용, 입력 유효성 검사, HTTPS 사용, 세션 및 비밀번호 안전하게 처리 등의 모범 사례를 채택하면 가장 일반적인 공격을 방지하는 데 도움이 됩니다. 항상 최신 보안 관행을 확인하고 애플리케이션에 잠재적인 취약점이 있는지 정기적으로 감사하세요.

위 내용은 일반적인 PHP 보안 문제 및 이를 방지하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿