이 장에서는 클라이언트가 제출한 양식 데이터를 확인하기 위해 PHP를 사용하는 방법을 소개합니다.
PHP 양식을 다룰 때는 보안을 고려해야 합니다. 이 장에서는 해커와 스팸을 방지하기 위해 PHP 양식 데이터의 보안 처리를 시연합니다. 양식에 대한 데이터 보안 검증을 수행해야 합니다. |
이 장에 설명된 HTML 양식에는 필수 및 선택 텍스트 필드, 라디오 버튼, 제출 버튼 등의 입력 필드가 포함되어 있습니다.
위의 양식 유효성 검사 규칙은 다음과 같습니다.
필드 | 검증 규칙 |
---|---|
이름 | 해야 하다. +문자와 공백만 포함할 수 있습니다. |
이메일 | 해야 하다. + 유효한 이메일 주소여야 합니다('@' 및 '.' 포함). |
URL | 선택 과목. 있는 경우 유효한 URL을 포함해야 합니다. |
주목 | 선택 과목. 여러 줄 입력 필드(텍스트 필드) |
성별 | 해야 하다. 하나를 선택해야 합니다. |
먼저 순수 HTML 양식 코드를 살펴보겠습니다.
"이름", "이메일", "웹사이트" 필드는 텍스트 입력 요소이고, "비고" 필드는 텍스트 영역입니다. HTML 코드는 다음과 같습니다:
"이름": <input type="text" name="name">이메일: <input type="text" name="email">웹사이트: <input type="text" name="website">비고 : <textarea name="comment"row="5" cols="40"></textarea>
"성별" 필드는 라디오 버튼이며 HTML 코드는 다음과 같습니다.
성별:<input type="radio" name="gender" value="female">여성<input type="radio" name="gender" value="male">남성
HTML 양식 코드는 다음과 같습니다.
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
양식은 method="post" 메소드를 사용하여 데이터를 제출합니다.
$_SERVER["PHP_SELF"] 변수는 무엇입니까? $_SERVER["PHP_SELF"]는 현재 실행 중인 스크립트의 파일 이름을 반환하고 문서 루트와 관련된 슈퍼 전역 변수입니다. |
따라서 $_SERVER["PHP_SELF"]는 다른 페이지로 이동하는 대신 현재 페이지로 양식 데이터를 보냅니다.
htmlspecialchars() 메서드란 무엇입니까? htmlspecialchars() 함수는 미리 정의된 일부 문자를 HTML 엔터티로 변환합니다. 사전 정의된 문자는 다음과 같습니다. &(앰퍼샌드)는 &가 됩니다. "(큰따옴표)는 " '(작은따옴표)는 ' <(보다 작음)은 <가 됩니다. > (보다 큼) > |
$_SERVER["PHP_SELF"] 변수는 해커가 사용할 수 있습니다!
해커가 공격을 위해 크로스 사이트 스크립팅 HTTP 링크를 사용하는 경우 $_SERVER["PHP_SELF"] 서버 변수도 스크립트에 포함됩니다. 그 이유는 크로스 사이트 스크립팅이 실행 파일 경로에 추가되어 $_SERVER["PHP_SELF"] 문자열에 HTTP 링크 뒤의 JavaScript 프로그램 코드가 포함되기 때문입니다.
XSS는 크로스 사이트 스크립팅 공격인 CSS(Cross-Site Script)라고도 합니다. 악의적인 공격자는 사용자가 페이지를 탐색할 때 웹 페이지에 악성 HTML 코드를 삽입하여 웹 페이지에 포함된 HTML 코드를 실행함으로써 악의적인 사용자의 특수한 목적을 달성합니다. |
다음 양식 파일 이름 "test_form.php"를 지정하십시오.
<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
이제 URL을 사용하여 제출 주소 "test_form.php"를 지정하고 위 코드를 다음과 같이 수정합니다.
<form method="post" action="test_form.php">
괜찮을 것입니다.
그러나 사용자가 브라우저 주소 표시줄에 다음 주소를 입력한다는 점을 고려하세요.
http://www.codercto.com/test_form.php/%22%3E%3Cscript%3Ealert('해킹됨')%3C/script%3E
위의 URL은 다음 코드로 구문 분석되어 실행됩니다.
<form method="post" action="test_form.php/"><script>경고('해킹됨')</script>
코드에 스크립트 태그가 추가되었고 경고 명령이 추가되었습니다. 이 Javascript 코드는 페이지가 로드될 때 실행됩니다(사용자에게 팝업 상자가 표시됨). 이는 해커가 PHP_SELF 변수를 어떻게 악용할 수 있는지 보여주는 간단한 예입니다.
<script> 태그 내에 JavaScript 코드를 추가할 수 있다는 점에 유의하세요! 해커는 이를 이용해 페이지를 다른 서버의 페이지로 리디렉션할 수 있습니다. 페이지 코드 파일은 악성 코드를 보호하거나 사용자의 양식 데이터를 얻을 수 있습니다.
$_SERVER["PHP_SELF"]는 htmlspecialchars() 함수를 사용하여 피할 수 있습니다.
양식 코드는 다음과 같습니다.
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
htmlspecialchars()는 미리 정의된 일부 문자를 HTML 엔터티로 변환합니다. 이제 사용자가 PHP_SELF 변수를 활용하려는 경우 결과는 다음과 같이 출력됩니다.
<form method="post" action="test_form.php/"><script>alert('hacked')</script>">
이 공격을 악용하려는 시도는 실패했습니다!
먼저, PHP의 htmlspecialchars() 함수를 통해 사용자가 제출한 모든 데이터를 처리합니다.
htmlspecialchars() 함수를 사용하면 사용자는 다음 텍스트 필드를 제출하려고 시도합니다.
<script>location.href('http://www.codercto.com')</script>
이 코드는 다음과 같이 HTML 이스케이프 코드로 저장되므로 실행되지 않습니다.
<script>location.href('http://www.codercto.com')</script>
위 코드는 안전하며 페이지에 정상적으로 표시되거나 이메일에 삽입될 수 있습니다.
사용자가 양식을 제출하면 다음 두 가지 작업을 수행합니다.
사용자 입력 데이터에서 불필요한 문자(예: 공백, 탭, 줄 바꿈)를 제거하려면 PHP Trim() 함수를 사용하십시오.
PHP Stripslashes() 함수를 사용하여 사용자 입력 데이터에서 백슬래시()를 제거합니다.
다음으로, 우리가 직접 정의한 함수에 이러한 필터링 함수를 작성해 보겠습니다. 그러면 코드의 재사용성이 크게 향상될 수 있습니다.
함수 이름을 test_input()으로 지정합니다.
이제 test_input() 함수를 사용하여 $_POST의 모든 변수를 감지할 수 있습니다. 스크립트 코드는 다음과 같습니다.
<?php//변수를 정의하고 기본적으로 빈 값으로 설정 $name= $email= $gender= $comment= $website= "" if($_SERVER["REQUEST_METHOD"]== "POST") { $name= test_input($_POST["name"]); $email= test_input($_POST["email"]); test_input($_POST["website"]); $comment= test_input($_POST["comment"]); $gender= test_input($_POST["gender"]);} functiontest_input($data) ($data); $data= 스트립슬래시($data); $data= htmlspecialchars($data);
위 스크립트를 실행할 때 $_SERVER["REQUEST_METHOD"]를 사용하여 양식이 제출되었는지 여부를 감지합니다. REQUEST_METHOD가 POST이면 양식이 제출되고 데이터의 유효성이 검사됩니다. 양식을 제출하지 않으면 유효성 검사를 건너뛰고 공백으로 표시됩니다.
위 예시에서 입력항목의 사용은 선택사항으로, 사용자가 아무런 데이터를 입력하지 않아도 정상적으로 표시될 수 있습니다.
다음 장에서는 사용자가 입력한 데이터의 유효성을 검사하는 방법을 소개합니다.