이번엔 2주차로,
php forms에 대해 배울 것이다.
php 양식 처리
<html>
<body>
<!--사용자가 데이터를 제출하면 'name-email.php' 파일에 post 방식으로 전송-->
<form action="name-email.php" method="post">
<!--텍스트 입력 창으로 이름 데이터 전송-->
이름: <input type="text" name="name"><br>
<!--입력 이메일을 데이터로 전송-->
이메일: <input type="text" name="email"><br>
<!--입력 데이터 제출-->
<input type="submit">
</form>
</body>
</html>
위 코드 실행시 사이트 상에서 보이는 화면이다.
이름과 이메일, 두 개의 입력 필드와 제출 필드가 있는 HTML 양식(Handling)이다.
입력필드에 입력 후 제출 버튼을 눌러 데이터를 처리하기 위해서 'name-email.php'를 활용한다.
'name-email.php'코드는 다음과 같다.
<html>
<body>
이름: <?php echo $_POST["name"]; ?><br>
이메일: <?php echo $_POST["email"]; ?><br>
</body>
</html>
위 HTML 코드에서 $_POST 방식으로 보낸 아이디와 이메일을
'name-email.php'에서 $_POST 방식으로 받아온다.
받은 데이터를 출력시키는 코드이다.
입력 필드에서
이름: 남기, 이메일: namgi@example.com을 입력했기에
위 처럼 데이터를 출력하는 것이다.
php 양식 유효성 검사
다음과 같은 게시판이 있다고 가정해보자.
위 게시판의 코드는 다음과 같다.
<!DOCTYPE HTML>
<html>
<head>
</head>
<body>
<?php
//변수 정의, 값은 empty로 설정
$name = $email = $comment = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$name = test_input($_POST["name"]);
$email = test_input($_POST["email"]);
$comment = test_input($_POST["comment"]);
}
?>
<h2>게시판</h2>
<form method="post" action="<?php echo ($_SERVER["PHP_SELF"]);?>">
이름: <input type="text" name="name">
<br><br>
이메일: <input type="text" name="email">
<br><br>
게시글: <textarea name="comment" rows="5" cols="40"></textarea>
<br><br>
<input type="submit" name="submit" value="Submit">
</form>
</body>
</html>
PHP 양식을 처리할 때 보안도 신경써야하는데,
위처럼 코드를 만든다면 XSS(Cross Site Script) 공격의 위험이 있다.
XXS(Cross Site Script)란? - 공격자가 악의적인 코드를 사이트에서 실행시키게 함으로서 개인정보 탈취 등 여러 공격을 수행하는 행동
더 자세한 내용: https://namu.wiki/w/XSS
XXS를 위 게시판에서 실행해보자.
Form에 index.php가 있다고 가정하고,
공격자가 주소에 밑 URL을 입력한다면,
http://www.example.com/index.php/%22%3E%3Cscript%3Ealert('사이트%20해킹됨')%3C/script%3E
밑 사진처럼 XXS 공격이 수행되게 된다.
위 공격을 막기 위해 할 수 있는 방법은
'htmlspecialchars() 함수'를 사용하는 것이다.
여기에
'trim() 함수' 와 'stripslashes() 함수' 를 사용하여
방어할 수 있다.
-
htmlspecialchars() - 특수 문자를 HTML 엔터티로 변환
trim() - 불필요한 문자(여분의 공백, 탭, 줄 바꿈) 제거
stripslashes() - 백슬래시(\) 제거
-
코드는 다음과 같다.
<!DOCTYPE HTML>
<html>
<head>
</head>
<body>
<?php
//변수 정의, 값은 empty로 설정
$name = $email = $comment = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$name = test_input($_POST["name"]);
$email = test_input($_POST["email"]);
$comment = test_input($_POST["comment"]);
}
//함수 이름 'test_input' 지정
function test_input($data) {
$data = trim($data); //불필요한 문자 제거(공백,탭,줄바꿈)
$data = stripslashes($data); //백슬래시(\) 제거
$data = htmlspecialchars($data); //특수 문자를 HTML 엔터티로 변환
return $data;
}
?>
<h2>게시판</h2>
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
이름: <input type="text" name="name">
<br><br>
이메일: <input type="text" name="email">
<br><br>
게시글: <textarea name="comment" rows="5" cols="40"></textarea>
<br><br>
<input type="submit" name="submit" value="Submit">
</form>
<?php
echo "<h2>작성 정보:</h2>";
echo $name;
echo "<br>";
echo $email;
echo "<br>";
echo $comment;
?>
</body>
</html>
php 양식 필수 필드
다음과 같이 입력칸을 필수 입력으로 설정할 수 있다.
위 필수입력 칸은 비워둘 수 없게 만든다.
먼저 코드부터 봐보자.
<!DOCTYPE HTML>
<html>
<head>
<style>
/*'error' 클래스의 색을 지정*/
.error {color: #FF0000;}
</style>
</head>
<body>
<?php
//변수 정의, 값은 empty로 설정
$nameerr = $emailerr = $commenterr = "";
$name = $email = $comment = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
//만약 'name' 입력칸이 비어져있다면,
if (empty($_POST["name"])) {
//코드 실행
$nameerr = "필수 입력칸 입니다.";
//아니라면 코드 실행
} else {
$name = test_input($_POST["name"]);
}
if (empty($_POST["email"])) {
$emailerr = "필수 입력칸 입니다.";
} else {
$email = test_input($_POST["email"]);
}
if (empty($_POST["comment"])) {
$commenterr = "";
} else {
$comment = test_input($_POST["comment"]);
}
}
//함수 이름 'test_input' 지정
function test_input($data) {
$data = trim($data); //불필요한 문자 제거(공백,탭,줄바꿈)
$data = stripslashes($data); //백슬래시(\) 제거
$data = htmlspecialchars($data); //특수 문자를 HTML 엔터티로 변환
return $data;
}
?>
<h2>게시판</h2>
<p><span class="error">* 필수 입력칸</span></p>
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
이름: <input type="text" name="name">
<!--지정한 'error' 클래스의 색으로 출력 -->
<span class="error">* <?php echo $nameerr;?></span>
<br><br>
이메일: <input type="text" name="email">
<span class="error">* <?php echo $emailerr;?></span>
<br><br>
게시글: <textarea name="comment" rows="5" cols="40"></textarea>
<br><br>
<input type="submit" name="submit" value="Submit">
</form>
<?php
echo "<h2>작성 정보:</h2>";
echo $name;
echo "<br>";
echo $email;
echo "<br>";
echo $comment;
?>
</body>
</html>
다음 코드에서 '$nameerr', '$emailerr', '$commenterr'의 새로운 변수를 추가했다.
이 변수들은 필수 입력칸에 대한 오류 메세지 행동을 한다.
if ~ else문에 $_POST 변수 에 대한 명령문을 추가했다.
이것은 $_POST 변수가 비어 있는지 확인한다. empty()함수 사용
비어 있으면 오류 변수에 저장되고,
비어 있지 않으면 'test_input() 함수'를 통해 입력한 데이터를 보낸다.
php 양식 확인 / 이름, 이메일
위 화면처럼 이름과 이메일의 형식이 맞지 않는다면,
텍스트를 출력하게 만들 수 있다.
이름 양식 확인
이름에 문자와 공백이 있지 않다면,
'문자와 공백만 입력할 수 있습니다'라고 출력하기 위해 밑의 코드를 사용한다.
<?php
$name = test_input($_POST["name"]);
//이름에 문자와 공백만 있는지 확인
if (!preg_match("/^[a-zA-Z-' ]*$/",$name)) {
//아니라면 밑 코드 출력
$nameerr = "문자와 공백만 입력할 수 있습니다.";
}
?>
'preg_match() 함수'는 문자열을 검색하여 있으면 true를 반환,
그렇지 않으면 false를 반환한다.
이메일 양식 확인
이메일의 형식이 'name@example.com'이 아니라면,
'이메일 형식이 맞지 않습니다'를 출력하게 할 수 있다.
이 행동은
'filter_var() 함수'를 사용하여 할 수 있다.
코드는 다음과 같다.
<?php
$email = test_input($_POST["email"]);
//이메일 형식이 맞는지 확인
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$emailerr = "이메일 형식이 맞지 않습니다.";
}
?>
전체 코드를 보자면, 다음과 같다.
<!DOCTYPE HTML>
<html>
<head>
<style>
/*'error' 클래스의 색을 지정*/
.error {color: #FF0000;}
</style>
</head>
<body>
<?php
//변수 정의, 값은 empty로 설정
$nameerr = $emailerr = $commenterr = "";
$name = $email = $comment = "";
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 (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$emailerr = "이메일 형식이 맞지 않습니다.";
}
}
if (empty($_POST["comment"])) {
$commenterr = "";
} else {
$comment = test_input($_POST["comment"]);
}
}
//함수 이름 'test_input' 지정
function test_input($data) {
$data = trim($data); //불필요한 문자 제거(공백,탭,줄바꿈)
$data = stripslashes($data); //백슬래시(\) 제거
$data = htmlspecialchars($data); //특수 문자를 HTML 엔터티로 변환
return $data;
}
?>
<h2>게시판</h2>
<p><span class="error">* 필수 입력칸</span></p>
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
이름: <input type="text" name="name">
<span class="error">* <?php echo $nameerr;?></span>
<br><br>
이메일: <input type="text" name="email">
<span class="error">* <?php echo $emailerr;?></span>
<br><br>
게시글: <textarea name="comment" rows="5" cols="40"></textarea>
<br><br>
<input type="submit" name="submit" value="Submit">
</form>
<?php
echo "<h2>작성 정보:</h2>";
echo $name;
echo "<br>";
echo $email;
echo "<br>";
echo $comment;
?>
</body>
</html>
이번 회차에선 'Forms'에 대한
php 양식 처리, 유효성 검사, 필수 필드, 양식 확인에 대해 배웠다.
다음 회차에선 'Advanced'에 대해 배울 것이다.
'php' 카테고리의 다른 글
[php Advanced] 2주차(3회차) / php 파일처리, 파일 업로드 (0) | 2022.09.11 |
---|---|
[php Advanced] 2주차(2회차) / php 날짜 및 시간, 파일처리 (2) | 2022.09.10 |
[php 튜토리얼] 1주차 최종정리 보고서 (0) | 2022.09.08 |
[php 튜토리얼] 7회차 / php 함수 (0) | 2022.09.08 |
[php 튜토리얼] 6회차 / php 전역 변수 (0) | 2022.09.07 |