PHP 양식 유효성 검사

PHP 양식 유효성 검사

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

가능한 경우 클라이언트 스크립트를 통해 사용자 입력의 유효성을 검사해야 합니다. 브라우저 유효성 검사가 더 빨라지고 서버의 로드가 줄어듭니다.

사용자 입력을 데이터베이스에 삽입해야 하는 경우 서버 유효성 검사 사용을 고려해야 합니다. 서버에서 양식의 유효성을 검사하는 좋은 방법은 다른 페이지로 이동하는 대신 양식을 자체적으로 전달하는 것입니다. 이렇게 하면 사용자가 동일한 양식 페이지에서 오류 메시지를 받을 수 있습니다. 사용자가 오류를 찾는 것이 더 쉬울 것입니다.

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

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

PHP 양식 유효성 검사 예

QQ图片20161009114426.png

위 양식에서는 다음 유효성 검사 규칙을 사용합니다.

QQ图片20161009114556.png

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


PHP 양식 보안에 대한 중요 알림

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

페이지에서 PHP_SELF를 사용하는 경우 사용자는 밑줄을 입력하고 XSS(교차 사이트 스크립팅)를 실행할 수 있습니다.

팁: XSS(교차 사이트 스크립팅)는 웹 애플리케이션에서 흔히 발견되는 일종의 컴퓨터 보안 취약점입니다. XSS를 사용하면 공격자는 다른 사용자가 보는 웹 페이지에 클라이언트 측 스크립트를 입력할 수 있습니다.


"test_form.php"라는 페이지에 다음과 같은 양식이 있다고 가정합니다.

<form method="post" action= "< ?php echo $_SERVER["PHP_SELF"];?>">

이제 사용자가 주소 표시줄에 일반 URL을 입력하면 "http://www. /test_form.php", 위 코드는 다음과 같이 변환됩니다:

<form method="post" action="test_form.php">

지금까지는 , 모든 것이 정상입니다.

그러나 사용자가 주소 표시줄에 다음 URL을 입력하는 경우:

http://www.php.cn/test_form.php/%22%3E%3Cscript%3Ealert(' php ')%3C/script%3E

이 경우 위 코드는 다음과 같이 변환됩니다.

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

이 코드는 스크립트와 프롬프트 명령을 추가합니다. 그리고 페이지가 로드되면 JavaScript 코드가 실행됩니다(사용자에게 도구 설명이 표시됩니다). 이것은 PHP_SELF 변수가 어떻게 활용될 수 있는지 보여주는 간단하고 무해한 예입니다.


<script> 태그에는 모든 JavaScript 코드가 포함될 수 있다는 점에 유의하세요! 해커는 사용자를 다른 서버의 파일로 리디렉션할 수 있으며 해당 파일의 악성 코드는 전역 변수를 변경하거나 사용자 데이터 등을 저장하기 위해 양식을 다른 주소로 제출할 수 있습니다.


$_SERVER["PHP_SELF"]가 악용되는 것을 방지하는 방법은 무엇입니까?

htmlspecialchars() 함수를 사용하면 $_SERVER["PHP_SELF"]가 악용되는 것을 방지할 수 있습니다.

양식 코드는 다음과 같습니다.

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" > ;

htmlspecialchars() 함수는 특수 문자를 HTML 엔터티로 변환합니다. 이제 사용자가 PHP_SELF 변수를 이용하려고 시도하면 다음과 같은 결과가 출력됩니다.

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

악용될 수 없으며 해를 끼치지 않습니다!


PHP를 통해 양식 데이터 확인

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

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

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

- 다음과 같은 이유로 코드가 실행되지 않습니다. 다음과 같이 이스케이프 코드로 저장됩니다.

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

이제 이 코드는 페이지나 e- 메일은 안전해요.

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

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

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

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

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


지속적인 학습
||
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>菜鸟教程(runoob.com)</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>
  • 코스 추천
  • 코스웨어 다운로드
현재 코스웨어를 다운로드할 수 없습니다. 현재 직원들이 정리하고 있습니다. 앞으로도 본 강좌에 많은 관심 부탁드립니다~