PHP Form Validation
This and the next chapters show how to use PHP to validate form data.
PHP Form Validation
PHP 폼을 처리한 때는 보안을 생각하십이오!
이 페이지는 보안을 염두에 두고 PHP form을 처리하는 방법을 알려준다. 폼 자료의 적절한 검증은 해커와 스팸어들로부터의 폼을 보호하기 위해서 중요하다 !
이 장에서 우리가 작업할 HTML form 은 다양한 입력 필드를 가진다: 필수와 선택 텍스트 필드, 라디오 버튼, 그리고 제출 버튼:
위의 폼에 대한 유효성 검사 규칙은 다음과 같다.:
Field | Validation Rules |
---|---|
Name | Required. + Must only contain letters and whitespace |
Required. + Must contain a valid email address (with @ and .) | |
Website | Optional. If present, it must contain a valid URL |
Comment | Optional. Multi-line input field (textarea) |
Gender | Required. Must select one |
첫 번째로 폼에 대한 평이한 HTML 코드를 살펴본다.:
Text Fields
이름, email, 과 웹사이트 필드들은 텍스트 input 요소이며, comment 필드는 textarea 이다. HTML 코드는 다음과 같습니다:
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>
Radio Buttons
성별 필드는 radio buttons 으로서 HTML 코드는 다음과 같습니다.:
Gender:
<input type="radio" name="gender" value="female">Female
<input type="radio" name="gender" value="male">Male
The Form Element
폼에 대한 HTML 코드는 다음과 같습니다.:
<form method="post" action="<?php echo
htmlspecialchars($_SERVER["PHP_SELF"]);?>">
form 이 제출될 때, 폼 데이타는 method="post" 로 보내집니다.
$_SERVER["PHP_SELF"] 변수는 무엇인가 ?
$_SERVER["PHP_SELF"] 는 슈퍼전역변수로 현재 실행 중인 스크립트의 파일 이름을 반환합니다.
따라서, $_SERVER["PHP_SELF"] 는 다른 페이지로 이동하는 대신에, 페이지 자신에 제출한 폼 데이타를 전송합니다. 이러한 방식으로, 사용자는 폼과 같은 페이지에 에러 메시지를 갖게된다.
htmlspecialchars() 함수는 무엇인가?
htmlspecialchars() 함수는 특수문자를 HTML entities로 변환한다. 이는 < 과 > 같은 HTML 문자를 < 과 > 로 바꾸는 것을 의미한다. 이로써 악용으로 폼으로 HTML 이나 Javascript 코드를 (Cross-site Scripting attacks) 주입하는 공격자를 방지할 수 있다.
Big Note on PHP Form Security
$_SERVER["PHP_SELF"] 변수는 해커들에 의해서 이용될 수 있다!
PHP_SELF 가 당신의 페이지에서 사용되는 경우, 사용자는 slash (/) 를, 그리고 실행한 일종의 Cross Site Scripting (XSS) 명령을 입력할 수 있다.
Cross-site scripting (XSS) 은 웹 응용프로그램에서 일반적으로 만나는
컴퓨터 보안 취약성의 한 유형이다. XSS 는 다 른
사용자들에 보여지도록 공 격자들이 웹페이지에 클라이언트-측 스크립트를 주입하는 것을
가능하게 해준다.
"test_form.php" 라는 페이지에 다음과 같은 폼이 있다고 가정하자 :
<form method="post" action="<?php echo
$_SERVER["PHP_SELF"];?>">
이제, 사용자가 "http://www.example.com/test_form.php" 처럼 주소 줄에 정상적인 URL을 입력하며, 위의 코드는 다음과 같이 해석됩니다.:
<form method="post" action="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>
이 코드는 스크립트 태그와 alert 명령을 추가 합니다. 그리고 페이지가 로드되면 JavaScript 코드가 실행됩니다(사용자는 alert box를 보게됩니다.). 이는 PHP_SELF 변수가 악용될 수 있는 간단한 그리고 무해한 예입니다.
<script> 태그 안에 어떤 JavaScript 코드도 추가될 수 있음을 인식하시오 ! 예를 들면, 해커가 다른 서버에 있는 파일로 사용자를 리디렉션 할 수 있으며, 그 파일은 전역변수를 바꾸거나 사용자 데이타를 저장하기 위해서 폼이 다른 주소로 제출 되게 할 수 있다.
$_SERVER["PHP_SELF"] 악용을 방지하는 방법?
$_SERVER["PHP_SELF"] 의 악용은 htmlspecialchars() 함수를 사용하여 방지 할 수 있다..
form 코드는 다음과 같아야 한다:
<form method="post" action="<?php echo
htmlspecialchars($_SERVER["PHP_SELF"]);?>">
htmlspecialchars() 함수는 특수 문자를 HTML entities로 변환한다. 그러면, 사용자가 PHP_SELF 변수를 악용하려 할 경우, 다음과 같은 결과가 유도 된다.:
<form method="post"
action="test_form.php/"><script>alert('hacked')</script>">
악용의 시도는 실패하며, 어떤 해도 입지 않게 된다 !
PHP로 폼 데이터의 유효성검사
우리가 가장 먼저 해야 할 것은 모든 변수를 PHP's htmlspecialchars() 함수를 통해서 전달 하는 것입니다.
htmlspecialchars() 함수를 사용할 경우; 사용자가 다음과 같은 텍스트 필드를 전송하려 한다면:
<script>location.href('http://www.hacked.com')</script>
다음과 같이 HTML을 벋어난 코드로 저장되기 때문에, 실행되지 않을 것입니다.:
<script>location.href('http://www.hacked.com')</script>
이제 코드는 페이지나 이메일 안에서 표시되는 것이 안전하게 됩니다.
사용자가 폼을 제출항 때 두 가지 더 할 일이 있다. :
- 사용자가 입력한 데이타에서 불필요한 문자(extra space, tab, newline) 들을 제거한다(PHP trim() 함수).
- 사용자가 입력한 데이타에서 backslashes (\) 를 제거한다(PHP stripslashes() 함수).
다음 단계는 우리를 위한 모든 검사를 수행하는 함수를 만드는 것이다 (이는 동일한 코드를 또 다시 작성하는 것 보다 훨씬 편리하다).
우리는 그 함수를 test_input()이라 부른다.
이제, test_input() 함수로 각각의 $_POST 변수를 확인할 수 있으며, 스크립트는 다음과 같다.:
Example
<?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;
}
?>
Run example »
스크립트 시작 부분에 폼이 $_SERVER["REQUEST_METHOD"]를 사용하여 제출 되었는지 여부를 확인함을 주목하시오. REQUEST_METHOD 가 POST 이면, 폼은 제출되고, 유효성 검사가 이루어져야한다. 제출되지 않았다면, 유효성 검사는 생락하고 빈 폼만 표시된다.
그러나, 위의 예에서 모든 input 필드는 선택사항입니다. 스크립트는 사용자가 어떤 데이터도 입력하지 않아도 잘 작동된다.
다음 단계는 필수 input 필드 만들기와 필요시 오류 메시지를 만드는 것입니다.