이것과 다음 장에서는 폼 데이터를 검증하기 위해 PHP를 사용하는 방법을 보여줍니다.
PHP 폼 검증
PHP 양식을 처리 할 때 보안을 생각!
이 페이지는 보안을 염두에두고 PHP 양식을 처리하는 방법을 보여줍니다. 폼 데이터의 적절한 검증은 해커와 스패머에서 양식을 보호하는 것이 중요!
필수 및 선택 텍스트 필드, 라디오 버튼 및 제출 버튼 : 우리는이 장에서에서 일하게 될 것입니다 HTML 양식, 다양한 입력 필드를 포함합니다 :
다음과 같이 양식에 대한 유효성 검사 규칙 위입니다 :
들 | 유효성 검사 규칙 |
---|---|
이름 | 필요합니다. + 문자와 공백을 포함해야 |
이메일 | 필요합니다. + 유효한 이메일 주소를 포함해야합니다 (with @ and .) |
웹 사이트 | 선택 과목. 존재하는 경우, 유효한 URL을 포함해야 |
논평 | 선택 과목. 멀티 - 라인 입력 필드 (textarea) |
성별 | 필요합니다. 하나를 선택해야합니다 |
먼저 우리는 폼의 일반 HTML 코드를 볼 것입니다 :
텍스트 필드
이름, 이메일, 웹 사이트 필드는 텍스트 입력 요소이며, 주석 필드는 텍스트 영역이다. 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>
라디오 버튼
성별 필드는 라디오 버튼이며 HTML 코드는 다음과 같습니다 :
Gender:
<input type="radio" name="gender"
value="female">Female
<input type="radio" name="gender" value="male">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 엔터티로 변환합니다. 이것은이 HTML 문자를 대체 할 것을 의미 같은 <와>와 & LT; 하고있다 ;. 이 HTML이나 자바 스크립트 코드를 주입하여 코드를 악용하는 공격자를 방지 (Cross-site Scripting attacks) 형태로.
PHP 양식 보안에 큰 참고
$ _SERVER는 [ "PHP_SELF은"] 변수는 해커에 의해 사용할 수 있습니다!
PHP_SELF이 페이지에서 사용하는 경우, 사용자는 슬래시 입력 할 수 있습니다 (/) 다음 몇 가지 크로스 사이트 스크립팅 (XSS) 실행 명령을.
크로스 사이트 스크립팅 (XSS) 일반적으로 웹 애플리케이션에서 발견되는 컴퓨터 보안 취약점의 유형입니다. XSS는 다른 사용자가 볼 웹 페이지에 클라이언트 사이드 스크립트를 삽입하는 공격자를 할 수 있습니다.
우리라는 이름의 페이지에 다음과 같은 형식 있다고 가정 "test_form.php" :
<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
사용자가 같은 주소 표시 줄에 정상적인 URL 입력하면 이제 "http://www.example.com/test_form.php" , 위의 코드로 변환 될 것입니다 :
<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>
이 코드는 스크립트 태그 및 경고 명령을 추가합니다. 페이지가로드가 자바 스크립트 코드가 실행됩니다 때 (the user will see an alert box) . 이것은 PHP_SELF 변수가 악용 될 수있는 방법을 단순한 무해한 예입니다.
그 어떤 자바 스크립트 코드는 내부에 추가 할 수 있습니다 알고 있어야합니다 <script> 태그! 해커는 다른 서버에있는 파일로 사용자를 리디렉션 할 수 있으며, 해당 파일은 전역 변수를 변경하거나 예를 들어, 사용자 데이터를 저장하기 위해 다른 주소로 양식을 제출할 수있는 악성 코드를 보유 할 수 있습니다.
어떻게 $ _SERVER [ 'PHP_SELF'] 악용을 방지하기 위해?
$ _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으로 폼 데이터를 검증
우리가 가장 먼저해야 할 것은 PHP의를 통해 모든 변수를 전달하는 것입니다 htmlspecialchars() 기능.
우리가 사용하는 경우 htmlspecialchars() 기능; 다음 사용자가 텍스트 필드에 다음을 제출하려고하면 :
<script> 위치. href('http://www.hacked.com') </ script>
- HTML은 다음과 같이 코드를 탈출로 저장 될 수 있기 때문에이 실행되지 않을 것이다 :
및 LT; 스크립트한다 위치. href('http://www.hacked.com') 및 / 스크립트한다
코드는 현재 페이지 또는 전자 우편 안에 표시하는 것이 안전합니다.
사용자가 양식을 제출하면 우리는 또한 두 가지 이상의 일을 할 것입니다 :
- 스트립 불필요한 문자 (extra space, tab, newline) 사용자가 입력 한 데이터 행 (with the PHP trim() 작용)
- 제거 백 슬래시 (\) 은 사용자 입력 데이터를 발 (with the PHP stripslashes() 함수)
다음 단계는 우리를 위해 모든 검사를 수행하는 함수 만드는 것입니다 (which is much more convenient than writing the same code over and over again) .
우리는 함수 이름을 것 test_input() .
이제, 우리는 각각 $ _POST 변수를 확인하실 수 있습니다 test_input() 기능, 스크립트는 다음과 같습니다 :
예
<?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;
}
?>
»실행 예 스크립트의 시작이 주목, 우리는 양식 [ 'REQUEST_METHOD을 "] $ _SERVER를 사용하여 제출되었는지 여부를 확인합니다. REQUEST_METHOD가 POST 인 경우, 다음 폼이 제출되었습니다 - 그리고 그것을 확인해야합니다. 가 제출되지 않은 경우, 유효성 검사를 생략하고 빈 양식을 표시합니다.
그러나, 위의 예에서, 모든 입력 필드는 선택 사항입니다. 사용자가 데이터를 입력하지 않은 경우에도 스크립트가 잘 작동합니다.
다음 단계는 필수 입력 필드를 확인하고 필요한 경우 오류 메시지를 생성하는 것입니다.