반응형
목적
PHP에서 기본적으로 제공하는 세션을 이용하여 로그인하는 방식으로 APM(Apache2, Php, Mysql)로 로그인인증을 하는 웹싸이트를 제작합니다.
- 로그인 기능 구현
- 메인 페이지 구현
- 로그인 되어야만 들어갈 수 있는 화면.
- 현재 누구로 로그인 되어있는지 알려주기.
- 로그아웃 기능 구현
- 회원가입 기능 구현
- ID 중복 검사 기능
- ID, PWD 빈칸 검사
세션아이디는 임의로 유저 아이디를 사용합니다.
*참고:
우분투에 APM: Apache, PHP, MySQL 환경 셋팅
데이터베이스 (MySQL) 셋팅
서버이름 = "localhost"
데이터베이스 이름 = "test"
데이터베이스 User name = "root"
데이터베이스 Password= "1234"
테이블 이름 = “users”
admin 아이디= “admin”
admin 비밀번호= “admin”
steps
- mysql 사용자로 db생성
mysqladmin -u root create test -p
- mysql 사용자 접속
mysql -u root -p
- root 계정 비번 설정: 이미 설정했다면 그 비밀번호 삽입.
use mysql;
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '1234';
- 사용 디비 설정
use test;
- 테이블 생성
create table users(
id int primary key auto_increment,
user_id varchar(255),
user_pwd varchar(255)
);
- 테이블에 기본 admin 계정 넣기
insert into users (user_id, user_pwd) values ('admin','admin');
- 테이블 데이터 확인
select * from users;
- db설정 종료
quit;
- mysql 서버 실행
service mysql start
- 아파치 서버도 실행
# 아파치 서버 시작
sudo service apache2 start
# 아파치 서버 중지
sudo service apache2 stop
# 아파치 서버 재시작
sudo service apache2 restart
code
Main.php
<?php
session_start(); // 세션 시작
if(!isset($_SESSION['user_id'])) // 로그인되어있지 않다면
{
header ('Location: ./login.html'); // 로그인 페이지로 이동
}
echo "<h2>로그인 성공</h2><br><h2>";
echo $_SESSION['user_id'];
echo " 님 안녕하세요</h2><br><br>"; // 로그인한 사용자의 이름 출력
echo "<a href=logout.php>로그아웃</a>"; // 로그아웃 링크 출력
?>
login.html
<html>
<head>
<title>login page</title>
<meta charset="utf-8">
</head>
<body>
<form method="post" action="/login_chk.php">
<div>
<label for="user_id">ID </label>
<input type="text" name="user_id"/>
</div>
<div>
<label for="user_pwd">Password </label>
<input type="text" name="user_pwd"/>
</div>
<div class="button">
<button type="submit"> login </button>
</div>
</form>
<button onclick="location.href='sign_up.html'"> sign up </button>
</body>
</html>
login_chk.php
<?php
session_start(); // 세션 시작
$id = $_POST['user_id']; // 사용자가 제출한 ID
$pw = $_POST['user_pwd']; // 사용자가 제출한 비밀번호
$servername = "localhost"; // 서버 이름
$username = "root"; // 사용자 이름
$password = "1234"; // 비밀번호
$dbname = "test"; // 데이터베이스 이름
// 데이터베이스 연결
$conn = new mysqli($servername, $username, $password, $dbname);
// 데이터베이스 연결 확인
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// 입력한 ID를 가진 사용자 정보를 가져옴
$sql = "SELECT * FROM users WHERE user_id='$id'";
$result = $conn->query($sql);
// 사용자 정보가 존재하는 경우
if($result->num_rows == 1){
$row = $result->fetch_array(MYSQLI_ASSOC);
// 입력한 비밀번호가 맞는 경우
if($row['user_pwd'] == $pw){
$_SESSION['user_id'] = $id;
// 세션 저장 성공한 경우
if(isset($_SESSION['user_id'])){
header('Location: ./Main.php');
}
else{
echo "세션 저장 실패";
}
}
// 입력한 비밀번호가 틀린 경우
else{
echo "잘못된 아이디 또는 비밀번호입니다.";
header('Location: ./login.html');
}
}
// 사용자 정보가 존재하지 않는 경우
else{
echo "잘못된 아이디 또는 비밀번호입니다.";
header('Location: ./login.html');
}
$conn->close(); // 데이터베이스 연결 종료
?>
sign_up.html
<html>
<head>
<title> Sign Up </title>
<meta charset="utf-8">
</head>
<body>
<form action = "./sign_up.php" method="post">
<div>
<label for="user_id"> ID </label>
<input type="text" name="user_id"/>
</div>
<div>
<label for="user_pwd"> PW </label>
<input type="text" name="user_pwd"/>
</div>
<div class="button">
<input type="submit" value="submit">
</div>
</form>
</body>
</html>
sign_up.php
<?php
$id = $_POST['user_id']; // 사용자가 입력한 ID
$pw = $_POST['user_pwd']; // 사용자가 입력한 비밀번호
if($id==NULL || $pw==NULL) // 입력한 값이 빈칸인 경우
{
echo "빈 칸을 모두 채워주세요";
echo "<a href=sign_up.html>back page</a>";
exit();
}
$servername = "localhost"; // 서버 이름
$username = "root"; // 사용자 이름
$password = "1234"; // 비밀번호
$dbname = "test"; // 데이터베이스 이름
// 데이터베이스 연결
$conn = new mysqli($servername, $username, $password, $dbname);
// 데이터베이스 연결 확인
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// 입력한 ID가 이미 존재하는 경우
$sql = "SELECT * FROM users WHERE user_id='$id'";
$result = $conn->query($sql);
if($result->num_rows == 1)
{
echo "중복된 ID입니다.";
echo "<a href=sign_up.html>back page</a>";
exit();
}
// 새로운 사용자 정보를 데이터베이스에 추가
$sql = "INSERT INTO users (user_id, user_pwd) VALUES ('$id', '$pw')";
$signup = mysqli_query($conn, $sql);
// 회원가입이 성공적으로 처리된 경우
if($signup)
{
echo "회원가입이 완료되었습니다.";
}
$conn->close(); // 데이터베이스 연결 종료
?>
logout.php
<?php
session_start(); // 세션 시작
$res = session_destroy(); // 모든 세션 변수 지우기
if($res)
{
header('Location: ./Main.php'); // 로그아웃 성공 시 로그인 페이지로 이동
}
?>
반응형
'old > Cyber Security' 카테고리의 다른 글
10진수 아스키 코드 표 (0) | 2023.04.30 |
---|---|
Assignment: 로그인 로직&우회 연구 (0) | 2023.04.17 |
웹 해킹 예제: 쿠키 변조, 디렉토리 명 추측, 세션 하이재킹, 인증 우회, 브루트 포스 공격 (0) | 2023.04.12 |
사이버 보안: Burp Suite이란 (0) | 2023.04.12 |
OAuth 2.0까지의 인증 방식의 진화 (0) | 2023.04.10 |