양식 유효성 검사LOGIN

양식 유효성 검사

PHP 양식 유효성 검사

이 장에서는 PHP를 사용하여 클라이언트가 제출한 양식 데이터를 확인하는 방법을 소개합니다.

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

이 장에서는 해커와 스팸을 방지하기 위해 PHP 양식 데이터의 보안 처리를 시연합니다. 양식에 대한 데이터 보안 검증을 수행해야 합니다.

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

<!DOCTYPE HTML>
 <html>
 <head>
     <meta charset="utf-8">
     <title>php.cn</title>
     <style>
         .error {color: #FF0000;}
     </style>
 </head>
 <body>
<?php
 // 定义变量并默认设置为空值
 $nameErr = $emailErr = $genderErr = $websiteErr = "";
 $name = $email = $gender = $comment = $website = "";
 
 if ($_SERVER["REQUEST_METHOD"] == "POST")
 {
     if (empty($_POST["name"]))
     {
         $nameErr = "名字是必需的";
     }
     else
     {
         $name = test_input($_POST["name"]);
         // 检测名字是否只包含字母跟空格
         if (!preg_match("/^[a-zA-Z ]*$/",$name))
         {
             $nameErr = "只允许字母和空格";
         }
     }
 
     if (empty($_POST["email"]))
     {
         $emailErr = "邮箱是必需的";
     }
     else
     {
         $email = test_input($_POST["email"]);
         // 检测邮箱是否合法
         if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email))
         {
             $emailErr = "非法邮箱格式";
         }
     }
 
     if (empty($_POST["website"]))
     {
         $website = "";
     }
     else
     {
         $website = test_input($_POST["website"]);
         // 检测 URL 地址是否合法
         if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$website))
         {
             $websiteErr = "非法的 URL 的地址";
         }
     }
 
     if (empty($_POST["comment"]))
     {
         $comment = "";
     }
     else
     {
         $comment = test_input($_POST["comment"]);
     }
 
     if (empty($_POST["gender"]))
     {
         $genderErr = "性别是必需的";
     }
     else
     {
         $gender = test_input($_POST["gender"]);
     }
 }
 
 function test_input($data)
 {
     $data = trim($data);
     $data = stripslashes($data);
     $data = htmlspecialchars($data);
     return $data;
 }
 ?>
 

먼저 순수 HTML 양식 코드를 살펴보겠습니다.

텍스트 필드

"名字", "E-mail", 及"网址"字段为文本输入元素,"备注"字段是 textarea。HTML代码如下所示:
“名字”: <input type="text" name="name">
E-mail: <input type="text" name="email">
网址: <input type="text" name="website">
备注: <textarea name="comment" rows="5" cols="40"></textarea>

라디오 버튼

"성별" 필드는 라디오 버튼이며 HTML 코드는 아래와 같습니다.

성별:

<input type="radio" name="gender" value="female">여성

<input type= "radio" 이름 ="gender" value="male">Male


Form 요소

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 엔터티로 변환합니다.
<정> 미리 정해진 문자는 다음과 같습니다.

· &(He)는 & amp

· · "(큰따옴표)는 & quot;

이 됩니다. · '(작은따옴표)는 다음과 같습니다.

·                                                                                                                                        관심이 필요한 것은 무엇입니까?

$_SERVER["PHP_SELF"] 변수는 해커가 사용할 수 있습니다.

해커가 크로스 사이트 스크립트 HTTP 링크를 사용하여 공격할 경우 $_SERVER["PHP_SELF"] 서버 변수도 스크립트에 포함됩니다. 그 이유는 크로스 사이트 스크립트가 실행 파일 경로에 추가되기 때문입니다. 따라서 $_SERVER["PHP_SELF"] 문자열에는 프로그램 코드 뒤에 있는 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.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 변수를 어떻게 악용할 수 있는지 보여주는 간단한 예입니다.

<script> 태그에는 모든 JavaScript 코드를 추가할 수 있습니다. 해커는 이를 이용해 페이지를 다른 서버로 리디렉션할 수 있습니다. 해당 코드는 악성 코드를 보호하거나 사용자의 양식 데이터를 얻을 수 있습니다.


$_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( '해킹됨') </script>">

이 취약점을 악용하려는 시도는 실패했습니다!


PHP를 사용하여 양식 데이터 유효성 검사

먼저 PHP의 htmlspecialchars() 함수를 통해 사용자가 제출한 모든 데이터를 처리합니다.

htmlspecialchars() 함수를 사용할 때 사용자는 다음 텍스트 필드를 제출하려고 합니다.

<script>location.href('http://www.php.cn' )< ;/script>

이 코드는 아래와 같이 HTML 이스케이프 코드로 저장되므로 실행되지 않습니다.

<script>location.href('http: / /www.php.cn')</script>

위 코드는 안전하며 페이지에 정상적으로 표시되거나 이메일에 삽입될 수 있습니다.

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

1. PHP Trim() 함수를 사용하여 사용자에서 불필요한 문자(예: 공백, 탭)를 제거합니다. 입력 데이터, 개행).

2. PHP 스트립슬래시() 함수를 사용하여 사용자 입력 데이터에서 백슬래시를 제거합니다()

다음으로, 우리가 직접 정의한 함수에 이러한 필터링 함수를 작성해 보겠습니다. 그러면 코드의 재사용성이 크게 향상될 수 있습니다.

함수 이름을 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"]);
   $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;
 }
 ?>

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

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

2. PHP 스트립슬래시() 함수를 사용하여 사용자 입력 데이터()에서 백슬래시()를 제거합니다

3. test_input() 함수를 사용하여 $_POST의 모든 변수를 감지합니다


다음 섹션
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>php.cn</title> <style> .error {color: #FF0000;} </style> </head> <body> <?php // 定义变量并默认设置为空值 $nameErr = $emailErr = $genderErr = $websiteErr = ""; $name = $email = $gender = $comment = $website = ""; if ($_SERVER["REQUEST_METHOD"] == "POST") { if (empty($_POST["name"])) { $nameErr = "名字是必需的"; } else { $name = test_input($_POST["name"]); // 检测名字是否只包含字母跟空格 if (!preg_match("/^[a-zA-Z ]*$/",$name)) { $nameErr = "只允许字母和空格"; } } if (empty($_POST["email"])) { $emailErr = "邮箱是必需的"; } else { $email = test_input($_POST["email"]); // 检测邮箱是否合法 if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email)) { $emailErr = "非法邮箱格式"; } } if (empty($_POST["website"])) { $website = ""; } else { $website = test_input($_POST["website"]); // 检测 URL 地址是否合法 if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$website)) { $websiteErr = "非法的 URL 的地址"; } } if (empty($_POST["comment"])) { $comment = ""; } else { $comment = test_input($_POST["comment"]); } if (empty($_POST["gender"])) { $genderErr = "性别是必需的"; } else { $gender = test_input($_POST["gender"]); } } function test_input($data) { $data = trim($data); $data = stripslashes($data); $data = htmlspecialchars($data); return $data; } ?>
코스웨어