- 2015.03.17
1. php 연동
1) php.ini 파일 수정
# vi /etc/php.ini
457 register_globals = On
462 register_long_arrays = On
# service httpd restart
* register_globals : 전역변수 사용 가능 설정 - $id, $pw 등을 사용하기 위함
2) php 기본 사용법
<?
$var = 0; # 변수 선언 시 $ 를 붙이면 된다. type 지정 및 선언 필요 없음
?> # <- 이 안에 php 내용 삽입
3) 출력 확인
변수를 받아 출력 되는지 확인
# vi login_check.php
1 <?
2
3 echo "id: $id";
4 echo "<br>";
5 echo "pw: $pw";
6
7 ?>
login.html 에서 확인 해보면 정상적으로 작동한다.
4) php변수
- 글로별 변수 : get, post 방식 상관 없이 처리 가능
- $_GET[] : get 방식으로 데이터가 전달 된 경우
- $_POST[] : post 방식으로 데이터가 전달 된 경우
[ 예제 ]
# vi login_check.php
1 <?
2
3 echo "id: $id";
4 echo "<br>";
5 echo "pw: $pw";
6
7 echo "<br>";
8 echo "<br>";
9
10 echo "id: $_GET[id]";
11 echo "<br>";
12 echo "pw: $_GET[pw]";
13
14 echo "<br>";
15 echo "<br>";
16
17 echo "id: $_POST[id]";
18 echo "<br>";
19 echo "pw: $_POST[pw]";
20
21 ?>
- POST 방식
http://192.168.133.142/login_check.php 에서 전송하면 POST 결과 확인 가능
- GET 방식
현재 login.html 소스코드가 POST 방식이기 때문에 아래 url을 통해 확인 가능
http://192.168.133.142/login_check.php?id=asdf&pw=asdf
* Tip
php 는 컴파일이 없기 때문에 에러메세지가 따로 나오지 않는다.
눈으로 소스코드를 찾아보거나 명령어 방법으로 에러를 찾아야 한다.
2. php와 mysql
1) mysql 관련 library in php
- mysql_connect() : mysql server 접속
server : localhost
username : root
password : xxxx
- mysql_select_db() : 사용할 DB 선택
DB_name : test
file descriptor : DB id - mysql_connect() 를 통해 반환됨
- mysql_query() : 쿼리 전송
query : 실행할 쿼리
- mysql_fetch_array() : 쿼리 결과를 배열 형태로 반환
result : 쿼리 실행 결과
상수 : 배열의 형태
MYSQL_NUM - 숫자로 가져옴
MYSQL_ASSOC - field 값으로 가져옴
MYSQL_BOTH - 둘 다로 가져옴
* 쿼리 실행 결과를 가져올 수 있는 또 다른 함수
- mysql_fetch_row()
- mysql_fetch_assoc()
ex)
# vi login_check.php
1 <?
2 $DB = mysql_connect( 'localhost', 'root', 'a' );
3 mysql_select_db( 'test', $DB );
4
5 ?>
=>
# mysql -u root -p
mysql> use test;
까지 진행 된 상황.
[ 예제 ]
# vi login_check.php
1 <?
2 $DB = mysql_connect( 'localhost', 'root', 'a' ); # mysql Server 접속
3 $ret = mysql_select_db( 'test', $DB ); # DB 접속
4
5 $sql = "select * from user"; # query 실행
6 $result = mysql_query( $sql ); # 결과를 result에 저장
7
8 while( $row = mysql_fetch_array( $result, MYSQL_NUM ) ) { # row에 NULL값이 들어갈 때까지 반복
9 echo "num: $row[0] name: $row[1] id: $row[2] pw: $row[3]"; # 반복문 없다면 첫번째 열만 출력함
10 echo "<br>";
11 }
12
13 ?>
2) 인증 예제
id & pw 인증
# vi login_check.php
1 <?
2 $DB = mysql_connect( 'localhost', 'root', 'a' ) ; # mysql Server 접속
3 $ret = mysql_select_db( 'test', $DB ); # DB 접속
4
5 $sql = "select * from user where id='$id' and pw=password('$pw')"; # query 실행
6 $result = mysql_query( $sql ); # 결과를 result에 저장
7
8 #$row = mysql_fetch_array( $result, MYSQL_NUM );
9
10 $count = mysql_num_rows( $result ); # result는 몇열인가?
11 echo $count; # 조건 맞는 열의 개수 저장하여 출력
12
13 ?>
=> http://192.168.133.142/login_check.php?id=admin&pw=xxxx 확인 시 1 이 나온다. 이를 이용하여 아래처럼 꾸며보자.
# vi login_check.php
1 <?
2 $DB = mysql_connect( 'localhost', 'root', 'a' ); # mysql Server 접속
3 $ret = mysql_select_db( 'test', $DB ); # DB 접속
4
5 $sql = "select * from user where id='$id' and pw=password('$pw')"; # query 실행
6 $result = mysql_query( $sql ); # 결과를 result에 저장
7
8 #$row = mysql_fetch_array( $result, MYSQL_NUM );
9
10 $count = mysql_num_rows( $result ); # result는 몇열인가?
11 if ( $count > 0 ) {
12 header('location: http://192.168.133.142/login.html');
13 }
14 else {
15 echo "authentication fail... ";
16 }
17
18 ?>
=> 인증은 된다. but 일반적으론 tcp 세션이 끊기기 전까지 인증이 유지되어야 하는데 여기선 그렇지 못하다.
3. Web 인증 방식
1) TCP 통신
연결을 계속 유지시키지는 않음
세션을 맺고 페이지를 모두 받아오면 바로 세션을 끊는다.
2) cookie, session
인증된 사용자임을 알기 위해 서버가 제공해주는 것들
* php 내의 이미 선언 되어 있는 변수
$_COOKIE[]
$_SESSION[]
3) cookie 굽기
- setcookie()
cookie name
cookie value
expire time
path
(option) domain
(option) security
# vi login_check.php
1 <?
2 $DB = mysql_connect( 'localhost', 'root', 'a' ); # mysql Server 접속
3 $ret = mysql_select_db( 'test', $DB ); # DB 접속
4
5 $sql = "select * from user where id='$id' and pw=password('$pw')"; # que ry 실행
6 $result = mysql_query( $sql ); # 결과를 result에 저장
7
8 # $row = mysql_fetch_array( $result, MYSQL_NUM );
9
10 $count = mysql_num_rows( $result ); # result는 몇열인가?
11 if ( $count > 0 ) {
12 setcookie('cookie', $pw, 0, '/'); # cookie 굽기, 만료 시간 없음
13 }
14 header('location: http://192.168.133.142/login.php');
15
16 ?>
# vi login.html
1 <?
2 if( !$_COOKIE[cookie] ) {
3 ?>
4 <html>
5 <head>
6 <title> Log In </title>
7 </head>
8
9 <body>
10 <form method=POST action=login_check.php>
11 id <input type="text" name="id"><br>
12 pw <input type="password" name="pw"><br>
13 <input type="submit" value="Login">
14 </form>
15 </body>
16 </html>
17
18
19 <?
20 }
21 else {
22 echo "already login...";
23 }
24 ?>
html 파일을 php로 바꿔준다.
# mv login.html login.php
# vi index.html
17 <li> <a href="login.php">Log In</a> < /li>
4) logout
아래와 같이 Logout 버튼을 만들 수 있다.
# vi login.php
21 else {
22 echo "already login...";
23 echo "<br>";
24 echo "<a href='logout.php'> Logout </a>";
25 }
# vi logout.php
1 <?
2 setcookie( 'cookie', '', 0, '/');
3 header('location: http://192.168.133.142/login.php');
4 ?>
=> cookie의 value를 초기화해서 쓸모 없는 cookie로 바꿔버림.
'Study > 웹보안' 카테고리의 다른 글
[09] php 게시판 생성, 비정상적으로 게시글 입력, 게시판 출력 (0) | 2015.05.07 |
---|---|
[08] cookie 및 session 이용한 인증, SQL Injection, secure 코딩 (0) | 2015.05.07 |
[06] php 및 mysql 설치, 인증, SQL, get & post, http 헤더 (0) | 2015.05.07 |
[05] 간단한 웹페이지 작성, index.html, main.css (0) | 2015.05.07 |
[04] Linux 초기설정, web 개요, html, webserver 구축 (0) | 2015.05.07 |