본문 바로가기

Web

[Web] php, mysql을 활용한 로그인 구현 / 웹개발-1

 

웹해킹의 기초를 탄탄히 하기 위해 개발부터 시작. 사실 전과하고 바로 보안을 접했기 때문에 개발을 해본적이 없다. 재밋겠다 하하.

 

👆 완성되었을 때의 모습이다. 로그인 버튼을 누를 시 로그인 성공 페이지로 리다이렉트 시킬 예정이다.

 

내가 짠 코드는 크케 세 가지의 파일로 이루어진다. 

 

1. 로그인 페이지를 보여주는 html 파일

2. 로그인 버튼이 눌렸을 때 서버측 로직을 처리 해주는 php파일

3. 로그인 성공 페이지를 보여주는 php파일

 

먼저, 코딩 전에 사용할 DB를 만들어 놓고 가자. 회원가입은 다음 시간에 구현할 것이므로 미리 DB에 데이터를 넣어놨다.

 

mysql> CREATE DATABASE login;
mysql> USE login;
mysql> CREATE table login_tb( -> id INT(11) NOT NULL AUTO_INCREMENT,
                                                       -> username VARCHAR(20) NOT NULL, -> password VARCHAR(20) NOT NULL,                                            -> PRIMARY KEY(id) -> );
mysql> INSERT INTO login_tb (username, password) VALUES ('test', 'test');

대문자 사용에 유의하자..

 

 

데이터가 올바르게 들어갔다.

 

 

 

login.html


 

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf8">
        <title>로그인</title>
    </head>
    <body>
        <h2>로그인</h2>
        <form action="login.php" method="post">
            <label for="username">아이디</label><br>
            <input type="text" id="username" name="username"><br><br>
            <label for="password">비밀번호</label><br>
            <input type="password" id="password" name="password"><br><br>
            <input type="submit" value="Login">
        </form>
    </body>
</html>

 

label 태그는 UI의 라밸을 정의할 때 사용되며 for속성이랑 사용한다. 다른 요소의 id값이랑 label 태그의 for 값은 일치할 경우 결합이 가능하다. 

 

input태그의 type값에 따라 형태가 달라지며 name 값이 Form으로 서버측에 전송될 때 key값으로 넘어간다.

 

 

 

 

login.php


 

<?php
$host = "localhost";
$user = "root";
$pw = "";
$dbname = "login";
$conn = new mysqli($host, $user, $pw, $dbname);

if ($conn->connect_error) {
    die("Failed: " . $conn->connect_error);
} else {
    echo "Connected";
}

if (getenv("REQUEST_METHOD") == "POST") {
    $username = $_POST["username"];
    $password = $_POST["password"];

    $sql = "SELECT * FROM login_tb WHERE username = '$username' and password = '$password'";

    $result = $conn->query($sql);

    if ($result->num_rows > 0) {

        $_SESSION["username"] = $username;
        echo "<script>alert('로그인 성공'); location.replace('./login_success.php');</script>";
    } else {
        $error = "아이디 또는 비밀번호가 잘 못 되었습니다.";
    }
}

 

 

  • DB 연결을 확인한다. 
  • 서버측 POST 요청을 확인하고 각 key값들을 파싱한다.
  • 데이터를 조회한다.
  • 조회된 데이터가 있을 경우 로그인 성공 페이지로 리다이렉트 된다.
  • username을 세션변수에 username으로 저장한다. (세션 변수는 session_start() 전에 할당은 가능하지만 사용은 못한다! session_start()가 수행되어야 사용이 가능하다.)

 

 

login_success.php


<?php
$host = "localhost";
$user = "root";
$pw = "";
$dbname = "login";
$conn = new mysqli($host, $user, $pw, $dbname);

session_start();
if (isset($_SESSION["usernameeee"])) {
    echo "환영합니다 " . $_SESSION["username"] . "님";
}

 

username을 출력한다.

 

 

 

 

 

SQLI 실습


 

or 1=1을 이용해 쿼리문을 참으로 만들고 뒤에 값을 주석처리 해줬다.

 

 

sqli이 올바르게 수행됐다.