PHP 개발 기본 튜토리얼 ...LOGIN

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. 검증 규칙

28.png

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 '
  • & lt; (덜) to be & lt;
  • & gt; (greater) to be & gt ;
  • 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="< ? 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 코드를 추가할 수 있습니다. 해커는 이를 이용해 페이지를 다른 서버로 리디렉션할 수 있습니다. 해당 코드는 악성 코드를 보호하거나 사용자의 양식 데이터를 얻을 수 있습니다.

    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('http://www.php.cn')</script>

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

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

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

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

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

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

    다음으로 작성해 보겠습니다. 우리가 정의한 함수에서 이는 코드의 재사용성을 크게 향상시킬 수 있습니다.

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

    4. 요약

    위 스크립트를 실행할 때 $_SERVER["REQUEST_METHOD"]를 사용하여 양식이 제출되었는지 감지합니다. REQUEST_METHOD가 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; } ?> <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>
    코스웨어