Computer >> 컴퓨터 >  >> 프로그래밍 >> PHP

PHP에서 사용자 입력을 안전하게 정제하는 방법


PHP에서 사용자 입력값을 정제(Sanitize)하는 것은 웹 애플리케이션 보안의 기본이 되는 중요한 개념입니다. 입력값 정제란 사용자가 제출한 데이터에 포함된 허가되지 않은 문자나 특수문자를 이스케이프 처리하여 SQL 인젝션·XSS 같은 공격을 사전에 차단하는 작업을 의미합니다. 아래에서는 PHP에서 입력값을 안전하고 보안성 있게 처리하기 위한 대표적인 세 가지 방법을 소개합니다.

1. mysqli의 real_escape_string() 함수 활용

MySQLi로 데이터베이스에 접속해 쿼리를 실행할 때는 real_escape_string() 함수를 사용하는 것이 좋습니다. 이 함수는 SQL 문을 깨뜨리거나 오작동을 일으킬 수 있는 특수문자를 자동으로 이스케이프 처리해 주기 때문에, POST·GET으로 넘어온 값을 쿼리에 넣기 전에 반드시 적용하는 것이 안전합니다.

예제

<?php
   $conn = new mysqli("localhost", "root", "", "testdb");
   $street = $conn->real_escape_string($_POST['street']);
?>

2. htmlentities()와 html_entity_decode() 활용

데이터베이스에 데이터를 저장할 때는 htmlentities()로 HTML 특수문자를 엔티티 형태로 변환하고, 브라우저에 출력할 때는 html_entity_decode()로 원래대로 되돌리는 방식도 효과적입니다. 이렇게 하면 저장된 값이 HTML이나 JavaScript 코드로 잘못 해석되는 것을 막을 수 있습니다.

예제

<?php
   $data['message'] = htmlentities($message); // 데이터베이스 저장 시점
   echo html_entity_decode($data['message']); // 브라우저 출력 시점
?>

3. 명령 프롬프트 입력 정제 – escapeshellarg()

system()이나 exec()처럼 PHP에서 셸 명령을 실행할 때는 escapeshellarg() 함수로 인자를 반드시 감싸야 합니다. 이 함수는 문자열을 작은따옴표로 묶고 내부의 따옴표를 이스케이프 처리하여, 의도하지 않은 추가 명령 실행(커맨드 인젝션)을 방지합니다.

예제

<?php system('ls '.escapeshellarg($data['dir']));?>

추가 팁: 실무에서는 위 방법들과 함께 Prepared Statement(프리페어드 스테이트먼트)를 사용하는 것이 가장 권장됩니다. prepare()와 bind_param()으로 SQL 구조와 데이터를 분리하면 SQL 인젝션을 근본적으로 차단할 수 있습니다. 상황에 맞게 여러 방법을 조합하면 더욱 견고하고 안전한 애플리케이션을 완성할 수 있습니다.