Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- php
- 웹개발
- file upload
- JS
- JWT
- union sql injection
- Reflected Xss
- lord of sqli
- Python
- blind sql injection
- 게시판 만들기
- csrf
- Cross Site Request Forgery
- 로그인
- XSS
- MySQL
- 과제
- 로그인페이지
- 모의해킹
- css
- sql injection
- CTF
- lord of sql injection
- Error based sql injection
- 세션
- sql injection point
- Los
- cors
- cookie 탈취
- 쿠키
Archives
- Today
- Total
Almon Dev
모의해킹 공부 정리 8일차 (과제) 본문
이미 로그인과 회원가입 페이지는 완성했었으나
몇 가지 고칠 점을 생각해 봤습니다.
https://almon.tistory.com/9 에서 수정한 내용입니다.
로그인
mysql.php
<?php
function runSQL($sql) {
$host = "localhost";
$id = "root";
$password = "admin1234";
$dbname = "almond";
$conn = mysqli_connect($host, $id, $password, $dbname);
if (!$conn) {
die("mysql 연결 에러 : ". mysqli_connect_error());
}
$result = mysqli_query($conn, $sql);
if (!$result) {
die("쿼리문 에러 : " . mysqli_error($conn));
}
mysqli_close($conn);
return $result;
}
?>
수정 없음
login_proc2.php
수정 전
<?php
include("mysql.php");
$id = $_POST["id"];
$pass = $_POST["passwd"];
$url = '/login_successful.php';
$sql = 'select id,password,nickname from users;';
$sql_result = runSQL($sql);
$result = false;
if (mysqli_num_rows($sql_result) > 0) {
while ($row = mysqli_fetch_array($sql_result)) {
if ($id == $row['id'] && $pass == $row['password']) {
$nickname = $row['nickname'];
echo "<form id='redirection-form' action='$url' method='post'>";
echo "<input type='hidden' name='nickname' value='$nickname'>";
echo "</form>";
echo "<script>document.getElementById('redirection-form').submit()</script>";
$result = true;
}
}
if(!$result) {
header('Location: login2.php?result=failed');
}
}
?>
수정 후
<?php
include("mysql.php");
$id = $_POST["id"];
$pass = $_POST["passwd"];
$url = '/login_successful.php';
$sql = "select nickname from users where id='$id' and password='$pass';";
$sql_result = runSQL($sql);
if ($row = mysqli_fetch_array($sql_result)) {
$nick = $row['nickname'];
echo "<form id='redirection-form' action='$url' method='post'>";
echo "<input type='hidden' name='nickname' value='$nick'>";
echo "</form>";
echo "<script>document.getElementById('redirection-form').submit()</script>";
exit;
}
header('Location: login2.php?result=failed');
?>
$sql = "select nickname from users where id='$id' and password='$pass';";
sql문을 수정했습니다
본래는 users의 모든 값을 받아온 뒤 while문으로 한 줄씩 읽으면서 아이디와 패스워드를 대조해 보았지만
지금은 where문을 사용해서 mysql서버에서 바로 대조를 거치고 결과 값을 받아오는 방식으로 변경했습니다.
어제는 exit;를 사용하지 않아서 로그인에 성공하든 실패하든 header('location : ') 부분이 실행되어
로그인 실패창으로 이동해 버리는 바람에 if문을 한번 더 사용해야 했지만
노말틱님의 로그인 페이지를 보고 exit;의 존재를 알게 되어 수정해 보았습니다.
회원가입
sign_up.php
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>회원가입</title>
<link rel="stylesheet" href="/css/sign_up.css">
<script src="/script/duplicate_check.js" defer></script>
</head>
<body>
<container class="signup-container">
<form action="sign_up_proc.php" method="post" class="signup-form">
<div class="logo-container">
<a href="/login2.php"><img src="/imgs/almond.png" alt="logo" class="logo"></a>
</div>
<h2>Almond</h2>
<input type="text" name="id" placeholder="아이디" class="signup-input id-input" required>
<input type="password" name="pass" placeholder="비밀번호" class="signup-input pass-input" required>
<input type="password" name="passCheck" placeholder="비밀번호 확인" class="signup-input pass-input-check" required>
<input type="text" name="nickname" placeholder="닉네임" class="signup-input nickname-input" required>
<input type="email" name="email" placeholder="이메일" class="signup-input email-input" required>
<div class="agreement">
<input type="checkbox" id="sign_up_agreement" required>
<label for="sign_up_agreement">회원가입에 동의합니다.</label>
</div>
<button type="submit" class="signup-submit">회원가입</button>
</form>
</container>
</body>
</html>
sign_up_proc.php
수정전
<?php
include ("mysql.php");
header("Content-Type: apllication/json");
$id = $_POST['id'];
$nick = $_POST['nickname'];
$pass = $_POST['pass'];
$passCheck = $_POST['passCheck'];
$email = $_POST['email'];
$id_duple = false;
$nick_duple = false;
$pass_duple = false;
$result = false;
$sql = "select * from users;";
$sql_result = runSQL($sql);
if (mysqli_num_rows($sql_result) > 0) {
while ($row = mysqli_fetch_array($sql_result)) {
if ($id == $row["id"]) {
$id_duple = true;
}
if ($nick == $row['nickname']) {
$nick_duple = true;
}
}
}
if($pass != $passCheck) {
$pass_duple = true;
}
if (!$id_duple && !$pass_duple && !$nick_duple) {
$result = true;
runSQL("insert into users values ('$id', '$nick', '$email', '$pass')");
}
echo json_encode(['result' => $result, 'id' => $id_duple, 'nick' => $nick_duple, 'pass' => $pass_duple]);
?>
수정 후
<?php
include ("mysql.php");
header("Content-Type: apllication/json");
$id = $_POST['id'];
$nick = $_POST['nickname'];
$pass = $_POST['pass'];
$passCheck = $_POST['passCheck'];
$email = $_POST['email'];
$id_duple = false;
$nick_duple = false;
$pass_duple = false;
$result = false;
$sql = "select id,nickname from users where id='$id' or nickname='$nick';";
$sql_result = runSQL($sql);
if (mysqli_num_rows($sql_result) > 0) {
while ($row = mysqli_fetch_array($sql_result)) {
if ($id == $row["id"]) {
$id_duple = true;
}
if ($nick == $row['nickname']) {
$nick_duple = true;
}
}
}
if($pass != $passCheck) {
$pass_duple = true;
}
if (!$id_duple && !$pass_duple && !$nick_duple) {
$result = true;
runSQL("insert into users values ('$id', '$nick', '$email', '$pass')");
}
echo json_encode(['result' => $result, 'id' => $id_duple, 'nick' => $nick_duple, 'pass' => $pass_duple]);
?>
$sql = "select id,nickname from users where id='$id' or nickname='$nick';";
sql문을 모든 데이터를 받아오던 방식에서 아이디와 닉네임 둘 중 한 개 이상이 일치한 데이터를 받아옵니다.
if (mysqli_num_rows($sql_result) > 0) {
while ($row = mysqli_fetch_array($sql_result)) {
if ($id == $row["id"]) {
$id_duple = true;
}
if ($nick == $row['nickname']) {
$nick_duple = true;
}
}
}
while문을 돌면서 어떤 것이 중복인지 $..._duple함수에 기록합니다.
if (!$id_duple && !$pass_duple && !$nick_duple) {
$result = true;
runSQL("insert into users values ('$id', '$nick', '$email', '$pass')");
}
모든 검증을 통과하면 insert문으로 데이터를 삽입하여 회원가입을 완료합니다.
echo json_encode(['result' => $result, 'id' => $id_duple, 'nick' => $nick_duple, 'pass' => $pass_duple]);
회원가입 성공여부와 아이디, 패스워드, 닉네임의 검증값을 json에 담아 응답합니다.
오늘 한일을 생각하면 강의를 듣고 내용을 정리한 것과
강의를 바탕으로 만들어봤던 웹사이트를 수정한 것입니다.
다음에 할 일은 로그아웃 기능과 미니 미션이 되겠네요
'모의해킹 > 웹 개발' 카테고리의 다른 글
모의해킹 공부 정리 10일차 (마이페이지) (2) | 2024.10.26 |
---|---|
모의해킹 공부 정리 9일차 (로그아웃) (0) | 2024.10.25 |
모의해킹 공부 정리 7일차 (mysql 적용) (0) | 2024.10.23 |
모의해킹 공부 정리 4,5,6 일차 (mysql 설정) (3) | 2024.10.22 |
모의해킹 공부 정리 3일차 (회원가입 페이지) (0) | 2024.10.19 |