양식 유효성 검사
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"]는 다음 값을 반환하는 슈퍼 전역 변수입니다. 현재 실행 중인 스크립트. 문서 루트와 관련된 파일 이름입니다.
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의 모든 변수를 감지합니다