PHP 개발 기본 튜토리얼 PHP 양식 검증
1. PHP 양식 확인
이 장에서는 PHP를 사용하여 클라이언트가 제출한 양식 데이터를 확인하는 방법을 소개합니다.
참고: PHP 양식을 처리할 때는 보안을 고려해야 합니다. 이 장에서는 해커와 스팸을 방지하기 위해 PHP 양식 데이터의 보안 처리를 시연합니다. 양식에 대한 데이터 보안 검증을 수행해야 합니다.
이 장에 소개된 HTML 양식에는 필수 및 선택 텍스트 필드, 라디오 버튼, 제출 버튼 등의 입력 필드가 포함되어 있습니다.
2. 표시 예
코드는 다음과 같습니다.
<!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; } ?> <h2>PHP 表单验证实例</h2> <p><span class="error">* 必需字段。</span></p> <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"> 名字: <input type="text" name="name" value="<?php echo $name;?>"> <span class="error">* <?php echo $nameErr;?></span> <br><br> E-mail: <input type="text" name="email" value="<?php echo $email;?>"> <span class="error">* <?php echo $emailErr;?></span> <br><br> 网址: <input type="text" name="website" value="<?php echo $website;?>"> <span class="error"><?php echo $websiteErr;?></span> <br><br> 备注: <textarea name="comment" rows="5" cols="40"><?php echo $comment;?></textarea> <br><br> 性别: <input type="radio" name="gender" <?php if (isset($gender) && $gender=="female") echo "checked";?> value="female">女 <input type="radio" name="gender" <?php if (isset($gender) && $gender=="male") echo "checked";?> value="male">男 <span class="error">* <?php echo $genderErr;?></span> <br><br> <input type="submit" name="submit" value="Submit"> </form> <?php echo "<h2>您输入的内容是:</h2>"; echo $name; echo "<br>"; echo $email; echo "<br>"; echo $website; echo "<br>"; echo $comment; echo "<br>"; echo $gender; ?> </body> </html>
출력 효과는 오른쪽과 같습니다.
3. 실제 설명
1. 검증 규칙
2. 텍스트 필드
'이름', '이메일', '웹사이트' 필드는 텍스트 입력 요소이며, '비고'는 " 필드는 텍스트 영역입니다. HTML 코드는 다음과 같습니다.
"Name": <input type="text" name="name">
E-mail: <input type="text" name ="email">
웹사이트: <input type="text" name="website">
비고: <textarea name="comment" 행="5 " cols="40"></textarea>
3. 라디오 버튼
"성별" 필드는 라디오 버튼이며 HTML 코드는 다음과 같습니다.
성별:
<input type="radio" name="gender" value="female">여성
<input type="radio" name="gender" value="male">남성
4. 양식 요소
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 엔터티로 변환합니다.
미리 정의된 문자는 다음과 같습니다.
" 명언) Be '-
-
- 5. PHP 양식에서 주의해야 할 점은 무엇인가요?
- $_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="test_form.php">
- 그러나 사용자가 브라우저 주소 표시줄에 다음 주소를 입력한다는 점을 고려하세요:
- <form method="post" action="test_form.php/"><script>alert('hacked')</script>
<script> 태그에는 모든 JavaScript 코드를 추가할 수 있습니다. 해커는 이를 이용해 페이지를 다른 서버로 리디렉션할 수 있습니다. 해당 코드는 악성 코드를 보호하거나 사용자의 양식 데이터를 얻을 수 있습니다.
6. $_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>">
이 취약점을 악용하려는 시도가 실패했습니다!
7. PHP를 사용하여 양식 데이터 유효성 검사
먼저 PHP의 htmlspecialchars() 함수를 통해 사용자가 제출한 모든 데이터를 처리합니다.
htmlspecialchars() 함수를 사용할 때. , 사용자는 다음 텍스트를 제출하려고 합니다. 도메인:
<script>location.href('//m.sbmmt.com')</script>
이 코드는 아래와 같이 HTML 이스케이프 코드로 저장되므로 실행되지 않습니다.
<script>location.href('http:// m.sbmmt.com') </script>
위 코드는 안전하며 페이지에 정상적으로 표시되거나 이메일에 삽입될 수 있습니다.
사용자가 양식을 제출하면 다음 두 가지 작업을 수행합니다.
PHP Trim() 함수를 사용하여 불필요한 문자(예: 공백, 탭)를 제거합니다. , newlines) 사용자 입력 데이터에서
- PHP Stripslashes() 함수를 사용하여 사용자 입력 데이터()에서 백슬래시를 제거합니다.
<?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; } ?>4. 요약
위 스크립트를 실행할 때 $_SERVER["REQUEST_METHOD"]를 사용하여 양식이 제출되었는지 감지합니다. REQUEST_METHOD가 POST이면 양식이 제출되고 데이터의 유효성이 검사됩니다. 양식이 제출되지 않으면 유효성 검사를 건너뛰고 공백으로 표시됩니다. 위 예시에서 입력항목의 사용은 선택사항으로, 사용자가 아무런 데이터를 입력하지 않아도 정상적으로 표시될 수 있습니다. 다음 장에서는 사용자가 입력한 데이터를 확인하는 방법을 소개하겠습니다.