PHP 완전 자율 학습 매뉴...login
PHP 완전 자율 학습 매뉴얼
작가:php.cn  업데이트 시간:2022-04-15 13:53:54

PHP 양식 유효성 검사



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


PHP 양식 유효성 검사

Note
Note在处理PHP表单时我们需要考虑安全性。

本章节我们将展示PHP表单数据安全处理,为了防止黑客及垃圾信息我们需要对表单进行数据安全验证。

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

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

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

Instance
<!DOCTYPE HTML> 
<html>
<head>
<meta charset="utf-8">
<title>PHP中文网(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>

인스턴스 실행»

온라인 인스턴스를 보려면 "인스턴스 실행" 버튼을 클릭하세요

字段验证规则
名字必须。 +只能包含字母和空格
E-mail必须。 + 必须是一个有效的电子邮件地址(包含'@'和'.')
网址必须。如果存在,它必须包含一个有效的URL
备注必须。 多行输入字段(文本域)
性别必须。 必须选择一个

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


먼저 순수 HTML을 살펴보세요. 양식 코드:

텍스트 필드

"이름", "이메일" 및 "웹사이트" 필드는 텍스트 입력 요소이고 " 비고' 필드는 텍스트 영역. 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" name="gender" value="male">男

양식 요소
HTML 양식 코드는 다음과 같습니다.
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
이 양식은
method= "post"
Note什么是 $_SERVER["PHP_SELF"] 变量?

$_SERVER["PHP_SELF"]是超级全局变量,返回当前正在执行脚本的文件名,与 document root相关。
데이터 제출 방법입니다. <🎜><🎜>
Note<🎜>$_SERVER["PHP_SELF"] 변수가 무엇인가요?<🎜><🎜>< 🎜 > $_SERVER["PHP_SELF"]는 현재 실행 중인 스크립트의 파일 이름을 반환하는 슈퍼 전역 변수이며 문서 루트와 관련됩니다.

따라서 $_SERVER["PHP_SELF"]는 다른 페이지로 이동하는 대신 현재 페이지로 양식 데이터를 보냅니다.

참고htmlspecialchars() 메서드가 무엇인가요?
Note什么是 htmlspecialchars()方法?

htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体。

预定义的字符是:

  • & (和号) 成为 &amp;

  • " (双引号) 成为 &quot;

  • ' (单引号) 成为 &#039;

  • < (小于) 成为 <

  • > (大于) 成为 >


htmlspecialchars() 함수 미리 정의된 일부 문자를 HTML 엔터티로 변환합니다.
미리 정의된 문자는 다음과 같습니다.

&(앰퍼샌드)는 &

  • 가 됩니다." (큰따옴표)는 "

  • '이 됩니다(작은따옴표)는 '
    NoteXSS又叫 CSS (Cross-Site Script) ,跨站脚本攻击。恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。
  • <🎜>< ;<🎜>
  • <🎜>>(보다 큼)><🎜>
  • < 🎜><🎜><🎜>PHP 양식에서 주의해야 할 사항은 무엇입니까? <🎜><🎜>$_SERVER["PHP_SELF"] 변수는 해커가 사용할 수 있습니다. <🎜><🎜>해커가 cross를 사용할 때 HTTP 웹 사이트 스크립트의 링크가 공격을 받으면 $_SERVER["PHP_SELF"] 서버 변수도 스크립트에 이식됩니다. 그 이유는 실행 파일의 경로에 크로스 사이트 스크립트가 추가되므로 $ 문자가 포함되기 때문입니다. _SERVER["PHP_SELF"] 문자열에는 HTTP 링크 <🎜><🎜> 뒤에 있는 JavaScript 코드가 포함됩니다.

    다음 양식 파일 이름을 "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('hacked')</script>">
    가 이 취약점을 시도하지 못했습니다!

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

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

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

    <script>location.href('http://www.php.cn')</script>
    코드는 HTML 이스케이프로 저장되므로 실행되지 않습니다. 코드는 다음과 같습니다.
    <script>location.href('http://www.php.cn')</script>
    위 코드는 안전하며 페이지에 정상적으로 표시되거나 이메일에 삽입될 수 있습니다.

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

    1. 1. PHP Trim() 함수를 사용하여 양식에서 관련 없는 정보를 제거합니다. 사용자 입력 데이터 필수 문자(예: 공백, 탭, 줄 바꿈)

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

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

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

    이제 test_input() 함수를 통해 $_POST의 모든 변수를 감지할 수 있습니다. 스크립트 코드는 다음과 같습니다.

    Instance

    <!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="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>

    인스턴스 실행»

    온라인 인스턴스를 보려면 "인스턴스 실행" 버튼을 클릭하세요

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

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

    권장 실무 튜토리얼: "PHP 양식 유효성 검사"

    다음 장에서는 PHP 양식 유효성 검사를 수행하는 방법을 소개합니다. 사용자.

    PHP 중국어 웹사이트