#account_jn.php
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원가입</title>
<link rel="stylesheet" href="CSS/account_jn.css">
<link rel="stylesheet" href="font_fi.css">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Nanum+Pen+Script&display=swap" rel="stylesheet">
<script>
function openadress() {
window.open("adress_serch.php", "_blank", "width=500,height=400,top=50%,left=50%,margin-top=-200px,margin-left=-250px");
}
function cancel() {
// 아무런 동작도 하지 않음
}
</script>
</head>
<body>
<h1>IQ Spoofing</h1>
<form method="post" action="account_in_back.php">
<label>사용자 이름</label>
<input type="text" name="username" required>
<br>
<label>비밀번호</label>
<input type="password" name="password" required>
<br>
<label>비밀번호 확인</label>
<input type="password" name="confirm_password" required>
<br>
<label>이메일</label>
<input type="email" name="email" required>
<br>
<lavel>주소</label>
<input type="adress" id="adress" value="주소" required readonly>
<button type="button" onclick="openadress()">주소검색</button>
<br>
<input type="submit" name value="회원가입">
</form>
</body>
</html>
우선 새로운 요소인 adress를 입력하기 위한 form을 위 코드에 추가하였다.
다만 주소의 경우 새 창을 띄워서 db를 통해 검색한 결과를 받을 것이기 때문에 readonly 태그를 사용하였으며 새 창을 띄우는 js함수인 openadress()를 정의/사용하였다.
이때 주소검색 버튼을 통해 post전송이 일어나 오류가 발생 할 수 있으므로 function cancel()을 통하여 새 창을 띄우도록 하였다.
#adress search.php
<?php
if (isset($_GET['adress'])) {
require_once 'tool/db_conn.php';
// require_once 'tool/chack_er.php';
$adress = $_GET['adress'];
$adress_arr=explode(" ",$adress);
$ad_count=count($adress_arr);
if ($ad_count ==1) {
$data_adress = "SELECT * FROM adress_kr WHERE DORO LIKE '%".$adress_arr[$ad_count-1]."%'";
} elseif ($ad_count == 2) {
$data_adress = "SELECT * FROM adress_kr WHERE DORO LIKE '%".$adress_arr[$ad_count-2]."%' AND BUILD_NO1 LIKE '%".$adress_arr[$ad_count-1]."%'";
} else {
echo("도로명과 도로번호만 입력해주세요.");
}
ini_set('memory_limit', '512M');
$data_adress_result = mysqli_query($con, $data_adress);
$data_adress = mysqli_fetch_array($data_adress_result);
}
?>
<!DOCTYPE html>
<html lang="kr">
<head>
<meta charset="UTF-8">
<title>주소검색</title>
</head>
<body>
<h1>주소 검색</h1>
<form method="get" action="#">
<label>도로명 주소를 입력해주세요</label>
<br>
<input type="text" name="adress" placeholder="예)도청로, 도청로89번길, 도청로89번길 30" required>
<input type="submit" name value="검색">
</form>
<table>
<?php
while($adress_visual = mysqli_fetch_array($data_adress_result)){
$full_adress = $adress_visual['SIDO']." ".$adress_visual['SIGUNGU']." ".$adress_visual['DORO']." ".$adress_visual['BUILD_NO1']." ".$adress_visual['BUILD_NM']; ?>
<tr>
<td><a href="ad_in.php?full_adress=<?=$full_adress?>"><?=$full_adress?></a></td>
</tr><?php
}
?>
</table>
</body>
</html>
adress_search.php는 account_jn.php에서주소검색 버튼을 누를경우 나오는 새 창이다.
우선 html 코드의 주요 구성은 다음과 같다.
- form 태그를 통해 get방식 데이터를 현재 페이지에 전송
- 입력칸은 도로명 주소가 검색될수 있는 input tag 사용
- get으로 전송된 데이터가 검색된 결과를 table에 출력
- 출력된 결과값에 link를 달아놓음. 주소는 ad_in.php 이며 get으로 출력값을 전송
상단의 php 코드 구성은 다음과 같다.
- 조건문으로 get을 통하여 adress값을 받았으면 아래 코드를 실행
- db_conn.php로 db 연결
- get adress를 변수에 할당
- 할당된 변수값에서 띄어쓰기 기준으로 배열 생성
- 만약 배열 길이가 1이면 도로 검색 둘이면 도로번호 까지 검색 쿼림문 생성
- 만약 길이가 1||2가 아닐경우안내문구 출력
- 쿼리문으로 db검색 및 결과 저장
- 결과를 배열로 하나씩 저장
html 내부 php코드는 다음과 같다.
- 검색결과만큼 반복
- 시도명/시군구/도로명/도로번호/건물명/건물세부정보를 저장 /테이블에 하나씩 출력
원래 한글로 로와같이 단어끝에 주소의 종류 특정이 가능한 글자를 통해 주소를 순서를 바꿔 검색해도 되도록 하려했는데 안타깝게도 php의 한글 인코딩 문제로 못하였다.
mb_와 같은 함수로 인코딩을 시도하였으나 apache php에서 등록이 안되어 하지 못하였다.
주 목적은 기능 구현 및 이를통한 보안/해킹 공부이므로 시간투자는 그만 하기로 했다.
#accounnt_in_back.php
<?php
// include 'tool/chack_er.php';
session_start();
//db 연결
require_once 'tool/db_conn.php';
// POST 방식으로 데이터를 받기
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// 사용자가 입력한 값들을 변수에 저장.
$username = $_POST['username'];
$email = $_POST['email'];
$password = $_POST['password'];
$confirm_password = $_POST['confirm_password'];
$adress = $_POST['adress'];
if (preg_match('/^[a-zA-Z0-9_-]{5,20}$/',$username)) {
// 아이디가 유효한 경우, 회원가입 처리 수행
} else{
echo "아이디는 5자 이상 20자 이하의 대소문자 알파벳과 특수기호 -,_ 만을 사용할 수 있습니다.<br>";
echo "<a href='http://118.220.178.221/nk/account_jn.php'>돌아가기</a>";
exit;
//아이디가 유효하지 않을경우 php종료.
}
if (preg_match('/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$@$!%*?&])[A-Za-z\d$@$!%*?&]{8,16}$/', $password)) {
//^: 문자열의 시작
// (?=.*[a-z]): 소문자가 적어도 하나 이상 포함되어야 함
// (?=.*[A-Z]): 대문자가 적어도 하나 이상 포함되어야 함
// (?=.*\d): 숫자가 적어도 하나 이상 포함되어야 함
// (?=.*[$@$!%*?&]): 특수문자 중 하나가 적어도 하나 이상 포함되어야 함
// [A-Za-z\d$@$!%*?&]{8,16}: 대문자, 소문자, 숫자, 특수문자 중에서 8자에서 16자까지의 문자열이 포함되어야 함
// $: 문자열의 끝
if (strpos($password, "'") !== false || strpos($password, '"') !== false) {
echo "비밀번호에는 따옴표나 쌍따옴표를 사용할 수 없습니다.<br>";
echo "<a href='http://118.220.178.221/nk/account_jn.php'>돌아가기</a>";
exit;
} else {
// 비밀번호가 유효한 경우, 회원가입 처리 수행
}
} else {
echo "비밀번호는 8~16자까지의 대문자, 소문자, 숫자, 특수문자를 각각 한 개 이상 포함해야 합니다.<br>";
echo "<a href='http://118.220.178.221/nk/account_jn.php'>돌아가기</a>";
exit;
}
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
// 이메일 주소가 유효한 경우, 처리를 진행
} else {
// 이메일 주소가 유효하지 않은 경우, 에러 메시지 출력
echo "유효한 이메일 주소가 아닙니다.<br>";
echo "<a href='http://118.220.178.221/nk/account_jn.php'>돌아가기</a>";
exit;
}
// 비밀번호와 비밀번호 확인이 일치하는지 확인.
if ($password !== $confirm_password) {
echo '비밀번호와 비밀번호 확인이 일치하지 않습니다. ';
echo "<a href='http://118.220.178.221/nk/account_jn.php'>돌아가기</a>";
} else {
}
// 사용자가 입력한 이메일이 이미 존재하는지 확인.
// $stmt = $con->prepare('SELECT id FROM username WHERE email = ?');
$stmt = $con->prepare('SELECT username, email FROM accounts WHERE id = ?');
$stmt->bind_param('s', $email);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc();
if ($row) {
echo '이미 등록된 이메일입니다. ';
echo "<a href='http://118.220.178.221/nk/account_jn.php'>돌아가기</a>";
}
$stmt = $con->prepare('SELECT id FROM accounts WHERE username = ?');
$stmt->bind_param('s', $username);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc();
if ($row) {
echo '이미 등록된 아이디입니다. ';
echo "<a href='http://118.220.178.221/nk/account_jn.php'>돌아가기</a>";
}
// 사용자가 입력한 정보를 데이터베이스에 저장.
$stmt = $con->prepare('INSERT INTO accounts (username, password, email, address_num) VALUES (?, ?, ?, ?)');
$stmt->bind_param('ssss', $username, password_hash($password, PASSWORD_DEFAULT), $email, $adress);
if ($stmt->execute()) {
echo '회원가입이 완료되었습니다.';
echo "<a href='http://118.220.178.221/nk/index.php'>돌아가기</a>";
} else {
echo '회원가입에 실패했습니다.';
echo "<a href='http://118.220.178.221/nk/index.php'>돌아가기</a>";
}
}
?>
다음은 회원가입 php코드이다. 여기서 수정된 부분은 다음과 같다.
- adress를 post로 받는코드 추가
- prepare statement에서 adress추가
#ad_in.php
<!DOCTYPE html>
<html lang="kr">
<head>
</head>
<body>
<?php
$full_adress = $_GET['full_adress'];
?>
<script>
window.onload = function(){
var full_adress = '<?=$full_adress?>';
opener.document.getElementById("adress").value = full_adress;
window.close();
};
</script>
</body>
</html>
다음은 adress_search.php에서 get으로 adress를 받아 부모창인 account _jn.php의 adress input 태그 부분에 주소를 넣는 코드이다. 자세한 내용은 다음과 같다.
- php로 adress값을 get형태로 받는다.
- JS코드로 페이지가 로드되면 아래 코드를 실행한다.
- 부모창 adress input 부분에 get으로 받은 값을 입력한다.
- 창을 닫는다.
'프로그래밍 및 코딩 > PHP' 카테고리의 다른 글
게시판 만들기_게시글페이지 (3) | 2023.05.16 |
---|---|
게시판 만들기_목록 (0) | 2023.05.16 |
게시판_목록 (0) | 2023.05.07 |
주소검색기능 추가 _ db준비 (0) | 2023.04.27 |
Login page 만들기_취약점 보완 (0) | 2023.04.13 |