32. PHP Form 유효성 검사 & input 데이터 가공 처리
PHP를 사용하여 양식 데이터의 유효성을 검사하는 방법
PHP 폼을 처리할 때에는 해커로부터 정보를 보호하기 위해 보안을 생각해야 합니다.
1. 폼 양식
위 폼에 대한 유효성 검사 규칙을 다음과 같습니다.
필드 | 검토 룰 |
이름 | 오직 문자나 공백만 포함되어야 한다. |
이메일 | @와 .과 함계 유효한 이메일 주소가 포함되어야 한다. |
웹 사이트 | 웹 사이트가 있을 경우 유효한 URL을 포함해야 한다. |
설명 | 여러줄 입력이 가능해야 한다. |
성별 | 한가지 성별만 선택해야 한다. |
2. 기본적인 폼에 대한 HTML 코드
1) 텍스트 필드
이름, 이메일, 웹 사이트 필드는 input 요소이며 설명 필드는 textarea입니다.
Name: <input type="text" name="name">
E-mail: <input type="text" name="email">
Website: <input type="text" name="website">
Comment: <textarea name="comment" rows="5" cols="40"></textarea>
2) 라디오 버튼
Gender:
<input type="radio" name="gender" value="female">Female
<input type="radio" name="gender" value="male">Male
3. 양식 요소
폼에 대한 HTML 코드는 아래와 같으며 form이 제출될 때 데이터는 POST 방식으로 전송합니다.
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
$_SERVER ["PHP_SELF"]란?
슈퍼 전역 변수로 현재 실행 중인 스크립트의 파일 이름을 반환합니다.
즉, 다른 페이지로 이동하는 대신에 현재 페이지로 폼 데이터를 전송합니다.
htmlspecialchars() 함수란?
특수문자를 HTML entities로 변환합니다.
< 과 > 같은 HTML 문자를 < 와 > 로 변환하는 것을 말합니다.
이렇게 특수문자로 HTML 엔티티로 변환함으로써 XSS(Cross Site Script) 공격을 막을 수 있습니다.
4. 양식에서 보안
$_SERVER ["PHP_SELF"] 변수는 실행 중인 스크립트의 파일 이름을 반환한다고 가정하고, 아무런 대처 없이 이를 사용할 경우 악의적인 해커가 XSS 공격을 할 수 있습니다.
XSS(Cross Site Scripting)
악의적인 사용자가 공격하려는 사이트에 스크립트를 넣는 기법이며 공격에 성공하면 사이트에 접속한 사용자는 삽입된 코드를 실행하게 되며 의도치 않은 행동을 하게 하거나 쿠키, 세션 토큰 등의 민감한 정보를 탈취할 수 있다.
test_form.php라는 페이지에 아래와 같은 폼이 있다고 가정합니다.
<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
<form method="post" action="test_form.php">
사용자가 www.example.com/test_form.php"처럼 주소 줄에 정상적인 URL을 입력하면 위와 같이 코드가 해석됩니다.
http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E
<form method="post" action="test_form.php"/><script>alert('hacked')</script>
사용자가 입력한 URL은 위의 코드처럼 해석이 됩니다.
페이지가 로드되면 자바스크립트 코드가 실행되어 사용자는 alert을 보게 됩니다.
이런 식으로 해커는 사용자가 의도하지 않은 행동을 수행하도록 할 수 있습니다.
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
이를 방지하기 위해서는 htmlspecialchars() 함수를 사용하면 됩니다.
<form method="post" action="test_form.php/"><script>alert('hacked')</script>">
htmlspecialchars() 함수는 특수문자를 HTML entities로 변환하기 때문에 이전과는 달리 alert가 실행되지 않습니다.
5. 폼 데이터의 유효성 검사
폼 데이터의 유효성을 검사에는 3가지 함수를 사용합니다.
trim() 함수를 사용해 사용자가 입력한 데이터에서 불필요한 문자(추가 공백, 탭 등)들을 제거합니다.
stripslashes() 함수를 사용해 백 슬래시(\)를 제거합니다.
htmlspecialchars() 함수를 사용해 특수문자를 HTML entities로 변환합니다.
<?php
// define variables and set to empty values
$name = $email = $gender = $comment = $website = "";
if ($_SERVER["REQUEST_METHOD"] == "POST")
{
$name = test_input($_POST["name"]);
$email = test_input($_POST["email"]);
$website = test_input($_POST["website"]);
$comment = test_input($_POST["comment"]);
$gender = test_input($_POST["gender"]);
}
function test_input($data)
{
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
?>