1. 회원가입 폼: signUp_form.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8" />
<title> Sign up </title>
</head>
<body>
</br>
<div align="center" name="signUp">
<form method="POST" action="./signUp.php">
<table align="center" >
<tr>
<td align="left"> ID (4~14) </td>
<td align="center">
<input type="text" name="id"/>
</td>
</tr>
<tr>
<td align="left"> Password (8~16) </td>
<td align="center">
<input type="password" name="password"/>
</td>
</tr>
<tr>
<td align="left"> Password confirm </td>
<td align="center">
<input type="password" name="password_confirm"/>
</td>
</tr>
<tr>
<td> Name(K: 2~8, E: 2~16) </td>
<td>
<input type="text" name="name"/>
</td>
</tr>
<tr>
<td align="right" colspan="2">
<input type="submit" value="회원가입" />
</td>
</tr>
</table>
</form>
</div>
</body>
</html>
|
cs |
11행: 회원가입 정보 역시 로그인과 마찬가지로 URL에 노출되어선 안 되고,
서버의 데이터베이스에 추가되는 내용이므로 POST 방식으로 전송한다.
28행: 이름이 너무 길다. name="pw_confirm" 정도로 할 걸 그랬다.
2. 회원가입: signUp.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
<?php
include "./connectDB.php";
$conn = connectDB();
/* 입력받은 ID, 비밀번호, 성별, 이메일을 읽어옴 */
$inputID = $_POST["id"];
$inputPW = $_POST["password"];
$confirmPW = $_POST["password_confirm"];
$inputName = $_POST["name"];
$pattern = "/[^a-z0-9_]+$/i";
$namePattern = "/[^가-힣a-z]+$/";
if($inputID === "" || $inputPW === "" || $confirmPW === "" || $inputName === "") {
?>
<script>
alert("입력란을 모두 채워주세요.");
history.back();
</script>
<?php
} else if(preg_match($pattern, $inputID) || preg_match($pattern, $inputPW) || preg_match($pattern, $confirmPW)) ) {
?>
<script>
alert("ID와 비밀번호에는 알파벳과 숫자, 언더바만 쓸 수 있습니다.");
history.back();
</script>
<?php
} else if(preg_match($namePattern, $inputName)) {
?>
<script>
alert("이름에는 한글 또는 알파벳만 쓸 수 있읍니다.");
history.back();
</script>
<?php
} else {
if($inputPW != $confirmPW) {
?>
<script>
alert("비밀번호가 일치하지 않습니다.");
history.back();
</script>
<?php
} else {
/* ID가 일치하는 회원정보 선택 */
$query = "SELECT * FROM user WHERE id=\"$inputID\"";
$result = mysqli_query($conn, $query);
$rowsNum = mysqli_num_rows($result);
if($rowsNum > 0) { //ID 중복
?> <script>
alert("이미 존재하는 ID입니다.");
history.back();
</script>
<?php
} else {
/* 새로운 회원 정보 삽입 */
$pwHash = sha1($inputPW);
$query = "INSERT INTO user (name, id, password) VALUES (\"$inputName\", \"$inputID\", \"$pwHash\")";
$result = mysqli_query($conn, $query);
if($result) {
?>
<script>
alert("회원가입 완료");
document.location.href="./login_form.php";
</script>
<?php
} else {
?>
<script>
alert("회원가입 실패");
document.location.href="./signUp_form.php";
</script>
<?php
}
}
}
}
?>
|
cs |
5행: $conn의 값을 검사해서 0이면 초기 페이지로 돌아가게 하는 게 나을 것 같다.
11행: 알파벳, 숫자, 언더바가 아닌 글자로 한 글자 이상
12행: 한글이나 알파벳이 아닌 문자로 한 글자 이상
14행: PHP의 == 연산자는 형을 일치시켜 비교한다. 따라서 정확한 비교를 위해
=== 연산자를 사용했다. 사실 문자열이라 strcmp 함수를 쓰는 게 더 나았을 텐데,
왜 이렇게 했는 지 모르겠다.
21행: preg_match 함수는 첫 번째 인자로 받은 정규표현식과
두 번째 인자로 받은 문자열이 일치하는 지 검사한다.
36행: 마찬가지로 strcmp 함수를 쓰는 게 더 좋을 것 같다.
57행: 입력받은 패스워드를 DB에 저장할 때는 sha1 해시 값으로 저장한다.
이는 DB가 해킹당해도 해커가 패스워드는 알 수 없게 하기 위함이다.
65행: 회원가입 성공 시 로그인 페이지로 이동하고
72행: 회원가입 실패 시 회원가입 폼 페이지로 이동한다.
'Programming > Web' 카테고리의 다른 글
[게시판] 게시글 수정 (0) | 2019.07.17 |
---|---|
[게시판] 게시글 작성 (0) | 2019.07.16 |
[게시판] DB 연결, 로그인 세션 설정 + 로그인 (0) | 2019.07.12 |
[게시판] 데이터베이스 설계 (0) | 2019.07.12 |
GET 방식과 POST 방식의 차이 (0) | 2019.07.09 |