일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- THM
- tryhackme
- php file upload
- php 로그인 페이지 만들기
- privilege escalation
- php login page
- FTZ
- active reconnaissance
- sql injection
- php To Do List
- War Game
- file upload
- Leviathan
- OS Command Injection
- Authentication
- Reconnaissance
- access control
- Server Side Request Forgery
- Recon
- php
- Cryptography
- SQLi
- overthewire
- php 파일 업로드하기
- over the wire
- 파일 업로드 취약점
- ssrf
- Cookie
- BANDiT
- active recon
- Today
- Total
R's Hacking Daily Log
php - HTML Form으로 데이터 전송하기 (1) 본문
Step :: POST & GET
웹 사이트를 이용하다 보면 로그인, 회원 가입, 댓글 등
Form을 입력하고 전송 버튼을 누르는 경우를 흔하게 마주할 수 있다.
전송 버튼을 누른 다는 건 다른 말로, 현재 페이지의 데이터를 다음 페이지로 전달한다고 할 수 있다.
데이터를 전달할 때 사용되는 http method는 POST OR GET method이며
전달할 데이터를 입력하는 형태는 html elemnt를 통해 선택할 수 있다.
POST or GET method를 통해 전달되는 데이터를 php에서는 글로벌 변수 $_POST & $_GET을 통해 저장한다.
$_SESSION, $_COOKIE와 같이 key - value 형태로 데이터를 저장하고 참조할 수 있다.
POST & GET 방식을 이용한 사례를 살펴보기 전, 두 방식이 어떻게 다른지에 대해 알아보자.
GET method의 경우,
데이터를 전달할 때 전달되는 데이터가 URL에 드러나게 되는 특징이 있다.
그렇다보니 중요한 정보를 전달하는 경우에는 GET method가 적합하다고 하기 어렵다.
예를 들어 productID가 지정된 상품 페이지를 클릭하는 경우,
~shopping.com/product?productID=2
브라우저는 productID가 2인 상품 페이지를 줘!라고 서버에게 요청을 보내고
서버는 productID parameter를 기반으로 페이지를 만들어 보내준다.
이때 위와 같이 productID라는 key가 2라는 value를 가진다는 걸 url에 포함하고 있음을 볼 수 있다.
$_GET['productID'] = 2;
서버는 url을 보고 GET method로 받은 데이터를 글로벌 변수 $_GET에 위와 같은 형태로 저장하게 되는 것!
POST method의 경우는
데이터를 전달할 때 전달되는 데이터를 html body 부분에 넣어서 보낸다.
그렇다보니 url에 정보가 노출되지 않는다.
GET method에서와 같이 productID 값을 POST method로 전달한다면
$_POST['productID'] = 2;
서버에서는 html body를 통해 값을 받고 이를 글로벌 변수 $_POST에 저장할 것이다.
지금부터는 POST & GET Method를 각각 이용해 데이터를 전달하는 코드를 살펴보도록 하자!
[ post.php ]
<html>
<head>
<title>Post</title>
</head>
<body>
<h1>Post Example</h1>
<form action="./post_result.php" method="post">
name : <input type="text" name="name"><br/>
id : <input type="text" name="id"><br/>
mail : <input type="text" name="email"><br/>
<input type="submit" value="Submit">
</form>
</body>
</html>
위와 같은 html 태그로 이루어진 post.php code가 있다.
내용을 살펴보니 form tag 안에 input tag가 4개가 들어있는 데 그중 3개는 text, 1개는 submit type인 걸 확인할 수 있다.
우선 form tag부터 보면, action & method 속성이 설정되어 있는 상태이다.
<form action="./post_result.php" method="post"></form>
action 속성은 "action 속성 값" 경로로 가줘 라는 의미이다. 따라서 위의 코드의 form이 제출되면
post_result.php로 이동하게 된다.
method 속성은 form에 작성된 데이터를 전달할 때 어떤 방식으로 전달할 지를 지정하기 위해 사용한다.
HTTP POST method를 원한다면 post, GET method를 원한다면 get이라 적으면 된다.
다음으로 input tag는 type에 따라 유형이 달라지는 데 여기서는 text & submit 유형만 살펴볼 것이다.
<input type="text" name="name">
type이 text인 경우에는 텍스트 문자를 입력 받을 수 있는 input tag가 만들어진다.
name 속성은 해당 태그를 가르킬 이름을 지정하기 위해 사용한다.
method에 따라 데이터를 저장하기 위해서는 input tag에 입력된 데이터(= value)를 저장할 때
이 데이터를 가르킬 이름(= key)이 필요하다.
즉, tag에 지정된 name 속성 값을 글로벌 변수에 저장할 때
key 값으로 사용하기 위해서 name 속성을 사용하고 있는 것!!
<input type="submit" value="Submit">
type이 submit인 경우에는 input tag가 버튼 모양으로 만들어진다.
해당 버튼을 누르면 말 그대로 "제출" 기능이 수행된다.
따라서 (1)form 안에 input tag를 데이터로 채워주고 (2)submit type의 input tag를 누르면
(3)form 데이터가 action 경로에 적힌 페이지로 전달된다.
그렇다면 결과가 어떻게 나오는지 post_result.php를 확인해 보자!
[ post_result.php ]
<?php
$name = $_POST['name'];
$id = $_POST['id'];
$email = $_POST['email'];
?>
<html>
<head>
<title>Post Result</title>
</head>
<body>
<h1>Post Example</h1>
<?php echo $name."님의 id는 ".$id." 메일주소는 ".$email."입니다."; ?>
</body>
</html>
form의 데이터가 post_result.php로 전달되면 name 속성이 각각 name, id, email이기 때문에
$_POST['name'] = '상어밥';
$_POST['id'] = 'shark';
$_POST['email'] = 'shark@abc.com';
이와 같은 형태로 $_POST에 저장되었을 것이다.
이 값을 변수 id, name, email에 할당하고 있는 형태라고 보면 된다.
값을 할당했으니 html tag 안에서 변수 값을 출력하면
(html tag 내에서 php를 사용하기 위해서는 당연히 <?php ?>로 php code 부분을 감싸줘야 한다.)
input tag에 내용을 작성하고 submit 버튼을 누르면 post_result.php 페이지로 이동해
입력했던 값들이 정상적으로 출력되는 걸 볼 수 있다.
동일한 흐름을 이번에는 GET Method로 구현해 보자.
[ get.php ]
<html>
<head>
<title>Get</title>
</head>
<body>
<h1>Get Example</h1>
<form action="./get_result.php" method="get">
name : <input type="text" name="name"><br>
id : <input type="text" name="id"><br>
email : <input type="text" name="email"><br>
<input type="submit" value="SUBMIT">
</form>
</body>
</html>
post.php 코드에서 form - method를 get, form - action을 get_result.php로 수정해 준다.
[ get_result.php ]
<?php
$name = $_GET['name'];
$id = $_GET['id'];
$email = $_GET['email'];
?>
<html>
<head>
<title>Get Result</title>
</head>
<body>
<h1>Get Example</h1>
<?php echo $name."님의 아이디는 ".$id." 메일주소는 ".$email."입니다"; ?>
</body>
</html>
get Method로 데이터를 전달했기 때문에 이번에는 $_POST가 아닌 $_GET으로부터 값을 할당한다.
Get method는 전달하는 데이터가 url에 노출되는 특징이 있다고 위에서 언급한 바 있다.
결과를 보면 get_result.php url에 name, id, email에 대한 정보가 포함되어 있는 걸 볼 수 있다.
/get_result.php?name=상어밥&id=shark&email=shark@abc.com
url 상에서 데이터가 전달될 때는 key=value 형태로 나열되는 데
해당 데이터는 전달된 경로 뒤에 물음표(?)가 붙고 나서 앰퍼샌드(&)로 연결되는 구조를 가진다.
즉 위의 url을 보면 누구든지
"name 값은 상어밥이고 id는 shark, email은 shark.com이구나"라는 걸 쉽게 알 수 있기 때문에
데이터를 전달할 때 보안을 생각한다면 Get method를 사용하는 건 적절치 못하다!!!
Get Method로 데이터를 전달하는 방법에는 input tag를 활용하는 것 말고도 다른 방법이 존재한다.
[ geturl.php ]
<?php
$name = "상어밥";
$id = "shark";
$email = "shark@abc.com";
?>
<head>
<head>
<title>Get</title>
</head>
<body>
<h1>Get Example</h1>
<a href="./get_result.php?name=<?php echo $name; ?>&id=<?php echo $id; ?>&email=<?php echo $email; ?>">전송</a>
</body>
</head>
input tag를 사용해서 값을 전달하는 것이 아닌 직접 php 변수를 만들고
해당 변수를 html 안에서 선언하여 전달하는 것이다.
a tag를 보면 href 속성 값에 GET method로 인해 생성되는 url 형태로 php 변수를 호출하고 있는 걸 볼 수 있다.
이렇게 데이터를 전달하더라도 서버 측에서 데이터를 $_GET에 넣고 값을 참조하는 과정은 변함없기 때문에
결과는 get.php로부터 얻은 결과와 동일하다!
'PHP' 카테고리의 다른 글
php - File Upload (1) (0) | 2023.07.25 |
---|---|
php - HTML Form으로 데이터 전송하기 (2) (0) | 2023.07.24 |
php Cookie (0) | 2023.07.22 |
php Session (0) | 2023.07.21 |
php 예외 처리 (0) | 2023.07.19 |