PHP 양식 유효성 검사로그인

PHP 양식 유효성 검사

PHP 양식을 다룰 때는 보안을 고려해야 합니다.

이 장에서는 해커와 스팸을 방지하기 위해 PHP 양식 데이터의 보안 처리를 보여줍니다.


이 장에 소개된 HTML 양식에는 다음 입력 필드가 포함되어 있습니다. 선택적 텍스트 필드, 라디오 버튼과 연결되어야 함 , 제출 버튼:

Instance

<!DOCTYPE HTML>
 <html>
 <head>
     <meta charset="utf-8">
     <title>PHP.cn</title>
 </head>
 <body>
 <h2>PHP 表单验证实例</h2>
 <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"> 
    名字: <input type="text" name="name" value="">
     <br>
     E-mail: <input type="text" name="email" value="">
     <br>
     网址: <input type="text" name="website" value="">
     <br>
     备注: <textarea name="comment" rows="5" cols="40"></textarea>
     <br>
     性别:
     <input type="radio" name="gender"  value="female">女
     <input type="radio" name="gender"  value="male">男
     <br>
     <input type="submit" name="submit" value="提交">
 </form>
 </body>
 </html>

프로그램 실행 결과:

5.png

위 양식 유효성 검사 규칙은 다음과 같습니다.

          字段        验证规则
    名字必须。 +只能包含字母和空格
    E-mail必须。 + 必须是一个有效的电子邮件地址(包含'@'和'.')
    网址可选。如果存在,它必须包含一个有效的URL
    备注可选。 多行输入字段(文本域)
필드
    性别必须。 必须选择一个
<🎜 >
<🎜> 유효성 검사 규칙<🎜><🎜>
이름필수입니다. +문자와 공백만 포함할 수 있습니다
이메일 URL선택사항. 있는 경우 유효한 URL을 포함해야 합니다.
비고텍스트 필드

'이름', '이메일', '웹사이트' 필드는 텍스트 입력 요소이고, '비고' 필드는 텍스트 영역 텍스트 영역입니다.

HTML 코드는 다음과 같습니다.

이름: <입력 유형= " text" name="name" value="">
이메일: <input type="text" name="email" value="">
웹사이트: <input type= " text" name="website" value="">
참고: <textarea name="comment"rows="5" cols="40"></textarea>


라디오 버튼

"성별" 필드는 라디오 버튼입니다.

HTML 코드는 다음과 같습니다.

성별:
<입력 유형= " radio" name="gender" value="female">여성
<input type="radio" name="gender" value="남성">남성


양식 요소

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 문자가 < 이렇게 하면 공격자가 HTML 또는 JavaScript 코드를 양식에 삽입하여 코드를 악용하는 것을 방지할 수 있습니다(교차 사이트 스크립팅 공격).

PHP 양식 보안에 대한 중요 팁

$_SERVER["PHP_SELF"] 변수는 해커에 의해 악용될 수 있습니다!

페이지에서 PHP_SELF를 사용하는 경우 사용자는 밑줄을 입력하고 CSS라고도 하는 XSS(교차 사이트 스크립팅)를 실행할 수 있습니다. 와 함께 XSS를 사용하면 공격자는 다른 사용자가 보는 웹 페이지에 클라이언트 측 스크립트를 입력할 수 있습니다.

다음 형식의 "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.php.cn/test_form.php/% 22 %3E%3Cscript%3Ealert('hacked')%3C/script%3E


위 URL은 다음 코드로 구문 분석되어 실행됩니다.

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


코드에 스크립트 태그가 추가되었고, 경고 명령이 추가되었습니다. 이 Javascript 코드는 페이지가 로드될 때 실행됩니다(사용자에게 팝업 상자가 표시됨). 이는 해커가 PHP_SELF 변수를 어떻게 악용할 수 있는지 보여주는 간단한 예입니다.

참고 모든 JavaScript 코드를 <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> 경고('해킹됨')</script>">

이 취약점을 시도하지 못했습니다!


PHP를 통해 양식 데이터 유효성 검사

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

htmlspecialchars() 함수를 사용한 후 사용자가 텍스트 필드에 다음을 제출하려고 하면:

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

- 코드는 다음과 같이 이스케이프 코드로 저장되므로 실행되지 않습니다.

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

이제 이 코드는 페이지에 표시되는 온라인이나 이메일로 안전합니다.

사용자가 양식을 제출하면 다음 두 가지 작업을 더 수행해야 합니다.

1. (PHP Trim() 함수를 통해) 사용자 입력 데이터에서 불필요한 문자(추가 공백)를 제거합니다. , 탭, 줄 바꿈)

2. (PHP 스트립슬래시() 함수를 통해) 사용자 입력 데이터에서 백슬래시 제거()

다음으로 검사 함수를 만듭니다(코드를 반복해서 작성하는 것과 비교). 더욱 효율적으로 만듭니다).

함수 이름을 test_input()으로 지정했습니다.

이제 test_input() 함수를 통해 각 $_POST 변수를 확인할 수 있습니다. 스크립트는 다음과 같습니다.

<!DOCTYPE HTML>
 <html>
 <head>
     <meta charset="utf-8">
     <title>PHP中文网(php.cn)</title>
 </head>
 <body>
 
 <?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;
 }
 ?>
 
 <h2>PHP 表单验证实例</h2>
 <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
     名字: <input type="text" name="name">
     <br><br>
     E-mail: <input type="text" name="email">
     <br><br>
     网址: <input type="text" name="website">
     <br><br>
     备注: <textarea name="comment" rows="5" cols="40"></textarea>
     <br><br>
     性别:
     <input type="radio" name="gender" value="female">女
     <input type="radio" name="gender" value="male">男
     <br><br>
     <input type="submit" name="submit" value="提交">
 </form>
 
 <?php
 echo "<h2>您输入的内容是:</h2>";
 echo $name;
 echo "<br>";
 echo $email;
 echo "<br>";
 echo $website;
 echo "<br>";
 echo $comment;
 echo "<br>";
 echo $gender;
 ?>
 
 </body>

프로그램을 실행하고 살펴보세요


참고: 위 스크립트를 실행할 때 $_SERVER["REQUEST_METHOD"]를 사용하여 양식이 제출되었는지 감지합니다. REQUEST_METHOD가 POST이면 양식이 제출되고 데이터의 유효성이 검사됩니다. 양식이 제출되지 않으면 유효성 검사를 건너뛰고 공백으로 표시됩니다.

위 예시에서 입력항목의 사용은 선택사항으로, 사용자가 아무런 데이터를 입력하지 않아도 정상적으로 표시될 수 있습니다.


다음 장에서는 사용자가 입력한 데이터의 유효성을 검사하는 방법을 소개합니다.



다음 섹션
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>PHP.cn</title> </head> <body> <h2>PHP 表单验证实例</h2> <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"> 名字: <input type="text" name="name" value=""> <br> E-mail: <input type="text" name="email" value=""> <br> 网址: <input type="text" name="website" value=""> <br> 备注: <textarea name="comment" rows="5" cols="40"></textarea> <br> 性别: <input type="radio" name="gender" value="female">女 <input type="radio" name="gender" value="male">男 <br> <input type="submit" name="submit" value="提交"> </form> </body> </html>
코스웨어
    없음