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
E-mail 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 문자를  &lt; 과 &gt; 로 바꾸는 것을 의미한다. 이로써 악용으로 폼으로 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/&quot;&gt;&lt;script&gt;alert('hacked')&lt;/script&gt;">

악용의 시도는 실패하며, 어떤 해도 입지 않게 된다 !


PHP로 폼 데이터의 유효성검사

우리가 가장 먼저 해야 할 것은 모든 변수를  PHP's htmlspecialchars() 함수를 통해서 전달 하는 것입니다.

htmlspecialchars() 함수를 사용할 경우; 사용자가 다음과 같은 텍스트 필드를 전송하려 한다면:

<script>location.href('http://www.hacked.com')</script>

다음과 같이 HTML을 벋어난 코드로 저장되기 때문에, 실행되지 않을 것입니다.:

&lt;script&gt;location.href('http://www.hacked.com')&lt;/script&gt;

이제 코드는 페이지나 이메일 안에서 표시되는 것이 안전하게 됩니다. 

사용자가 폼을 제출항 때 두 가지 더 할 일이 있다. :

  1. 사용자가 입력한 데이타에서 불필요한 문자(extra space, tab, newline) 들을 제거한다(PHP trim() 함수). 
  2. 사용자가 입력한 데이타에서 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 필드 만들기와 필요시 오류 메시지를 만드는 것입니다.