여러분이 사용하고 계신 브라우저는 HTML5를 지원하지 않기 때문에 몇몇 요소가 제대로 보이도록 JScript를 사용하고 있습니다. 하지만 여러분의 브라우저 설정에서 스크립트 기능이 꺼져있으므로, 현재 페이지를 제대로 확인하시려면 스크립트 기능을 켜주셔야 합니다. PHP - 기초 - 양식 유효성 검사
PHP – 기초 – 양식 유효성 검사
2년전 작성
8개월전 수정

Form Validation

보안을 염두에두고 PHP 양식을 처리하는 방법을 보여준다.

양식 데이터의 적절한 유효성 검사는 해커 및 스패머로부터 양식을 보호하는 데 중요하다.

PHP로 양식 데이터 유효성 검사

스크립트를 시작할 때 양식이 $_SERVER[“REQUEST_METHOD”]를 사용하여 제출되었는지 확인한다.
REQUEST_METHOD이 POST이면 양식이 제출되었으며 유효성을 검사해야한다.
제출되지 않은 경우 유효성 검사를 건너뛰고 빈 양식을 표시한다.

PHP
<?php
$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;
}
?>

사용자가 데이터를 입력하지 않아도 스크립트가 정상적으로 작동한다.

양식 요소

양식이 제출되면 양식 데이터는 method=”post”와 함께 전송된다.
[qnasvg] [qna q=”$_SERVER [’PHP_SELF’] 변수는 무엇일까?” a=”$_SERVER[’PHP_SELF’]은 현재 실행 중인 스크립트의 파일 이름을 반환하는 수퍼 전역 변수다. 따라서 $_SERVER[’PHP_SELF’]은 다른 페이지로 이동하는 대신 제출된 양식 데이터를 페이지 자체로 보낸다. 이렇게 하면 사용자가 양식과 동일한 페이지에 오류 메시지를 받게된다.”] [qna q=”htmlspecialchars() 함수는 무엇일까?” a=”htmlspecialchars() 함수는 특수 문자를 HTML 엔티티로 변환한다. 즉, < 및 >와 같은 HTML 문자를 < 그리고 >. 이렇게 하면 공격자가 양식에 HTML 또는 Javascript 코드(교차 사이트 스크립팅 공격)를 삽입하여 코드를 악용하는 것을 방지할 수 있다.”]

HTML
"> Name:

E-mail:

Website:

Comment:

Gender: Female Male Other

PHP
<?php
echo "

Your Input:

"; echo $name; echo "
"; echo $email; echo "
"; echo $website; echo "
"; echo $comment; echo "
"; echo $gender; ?>

양식 보안에 대한 큰 참고 사항

$_SERVER[“PHP_SELF”] 변수는 해커가 사용할 수 있다.

PHP_SELF가 페이지에서 사용되는 경우 사용자는 슬래시(/)를 입력한 다음 실행할 XSS(교차 사이트 스크립팅) 명령을 입력할 수 있다.

XSS(교차 사이트 스크립팅)는 일반적으로 웹 응용 프로그램에서 발견되는 컴퓨터 보안 취약점의 한 유형이다.
XSS를 사용하면 공격자가 클라이언트 쪽 스크립트를 다른 사용자가 보는 웹 페이지에 삽입할 수 있다.

예를 들어, “test_form.php”라는 페이지에 다음 양식이 있다고 가정해보자.

HTML
<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">

이제 사용자가 “http://www.example.com/test_form.php”과 같은 주소 표시 줄에 일반 URL을 입력하면 위의 코드가 다음과 같이 변환된다.

HTML

이제부터는 사용자가 주소 표시줄에 다음 URL을 입력하는 것을 확인해보자.
http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert(‘hacked’)%3C/script%3E

HTML
<form method="post" action="test_form.php/"><script>alert('hacked')</script>

이 코드는 스크립트 태그와 경고 명령을 추가한다.
페이지가로드되면 JavaScript 코드가 실행된다 (사용자에게 경고 상자가 표시됨).
PHP_SELF 변수가 어떻게 악용 될 수 있는지에 대한 간단하고 무해한 예일뿐이다.

모든 자바 스크립트 코드를 <script> 태그 안에 추가 할 수 있다.
해커는 사용자를 다른 서버의 파일로 리디렉션할 수 있으며, 이 파일에는 전역 변수를 변경하거나 양식을 다른 주소로 제출하여 사용자 데이터를 저장할 수 있는 악성 코드가 포함될 수 있다.

익스플로잇을 피하는 방법

$_SERVER[“PHP_SELF”] 익스플로잇은 htmlspecialchars() 함수를 사용하여 피할 수 있다.

HTML
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">

htmlspecialchars() 함수는 특수 문자를 HTML 엔티티로 변환한다.
이제 사용자가 PHP_SELF 변수를 악용하려고하면 다음과 같은 결과가 출력된다.

HTML
<form method="post" action="test_form.php/"><script>alert('hacked')</script>">

익스플로잇 시도가 실패하고 아무런 문제가 없게된다.

참고

Mingg`s Diary
밍구
공부 목적 블로그