1 . cookie         //보안상 취약(사용자의 정보 노출)

-로그인 상태를 계속 유지시켜 주는것이다.


웹 어플리케이션을 이용한 인증 처리

- 인증을 하기 위한 사용자 DB 생성

  

-  입력 -> 인증(authentication -> 인가(authorization)

       

     입력: 아이디, 패스워드


mysql > SELECT * FROM 인증테이블 WHERE id='$id' and pw='$pw';



ex)


id=use

pw=use


SELECT * from user_info where id='use' and pw=md5('use');  

// 테이블에 있는 값과 비교해서 같으면 출력하게 해준다.




   

[실습]

- 사용자로부터 아이디와 패스워드를 입력받아서

입력된 값이 디비에 존재한다면 'login success'알람을 출력 그렇지 않으면 'login failed' 알람을 출력하는 프로그램을 작성





$query = "SELECT * FROM user_info WHERE id='$id' and pw=md5('$pw')";

$res = mysql_query($query);

     $cnt= mysql_num_rows($res);

 if ($cnt) {

        echo "<script> alert('login success'); </script>";

    }

  else{

        echo "<script> alert('login failed'); </script>"; }

 }





setcookie();    //cookie를 할당한다.

ex)


setcookie("name",$id , time()+86400, "/");

setcookie("auth",md5($id.$pw) , time()+86400, "/");




실습에서 만든 파일에서  id : admin pw : 1234 로 로그인을 하고


login.php을 실행 시키면



이렇게 쿠키가 남아 있는 것을 볼 수 있다.

로그아웃 만들기.



이파일을 하이퍼링크로 열면 로그아웃이 된다.







2. session      //이 값만 알아내도 id와passwd 없이 접속가능


 -사용자의 정보를 서버에저장



-session_start() -> session_id -> cookie


-세션을 사용하기 위해서는 session_start() 함수를 먼저 호출


- 클라이언트 (웹 브라우저) -> session_id





session의 경로와 id 이다

             


session을 사용하면 그림과 같이 ID가 보인다.





include " ";    // 다른 파일에 있는 내용을 가져와서 실행 시켜준다. 





session을 통한 로그인


check.php 파일 



session.php 파일




login.php파일



DB에 저장되어 있는 아이디를 입력하게 되면


/var/lib/php/session 에 세션아이디가 남겨진다.  

//session_start(); 에 의해 세션 아이디가 남는다.



 로그아웃을 하게 되면

세션이 사라지게 된다.



세션 사라지게하는 명령어    //logout.php

session_destroy()


그리고 아무런 값을 입력하지 않았을 때 session.php파일이 실행되어

라는 문구가 뜨고  다시  로그인 페이지로 되돌아 간다.




아이디는 같은데 비밀번호가 다르게 입력 받아지면 


session 파일이 실행하여 다시 원래의 login페이지  창으로 돌아온다.






해시와 암호화


hash(해시)

 - 암호화는 아니다

 - 평문(plain text) -> hash value

 - 단방향 함수( 복호화가 존재하지 않는다.)

 - 평문의 길이와 상관없이 hash value의 길이는 고정 길이

 - 평문이 같으면 해시된 값도 같다.

 - 평문이 다르면 해시값도 다르다.


해시 알고리즘

-md4 ,md5 ,sha1 ,sha2 ...



encryption(암호화)


- 평문(plain text) -> 암호문(cipher text)

- 키를 필요로 한다

- 암/복호화 가 가능


- 평문의 길이에 따라 암호문의 길이도 달라진다.

- 평문이 같아도 키가 다르면 암호문도 달라진다.


-RSA , DES , 시저 암호, enigma, ... 


문자 인코딩 : base64 encoding   //웹에서 많이 쓰는 인코딩


-64진법 : 모든 문자를 64개의 문자로 표현


-4바이트 단위로 인코딩이 된다. (4바이트가 부족하면 '=' 로 대체)


 



'Web Security' 카테고리의 다른 글

가상호스팅  (0) 2019.03.18
웹(WWW)  (3) 2019.03.13
아파치 웹 서버 인증 과 DB  (0) 2018.02.21
데이터 전달  (0) 2018.02.20
CGI(PHP)  (0) 2018.02.19

1. 아파치 웹 인증


 -설정파일 : /etc/httpd/conf/httpd.conf  //317줄




<directory /var/www/html>    

 ...

         AuthType Basic      // 이런식으로 중간에 추가해준다.

         AuthName "Basic Authentication"

         AuthUserFile /var/www/html/.htpasswd  //사용자파일 경로

         Require valid-user         //어떤 사용자에게 인증을 요구하냐

</directory>

       



이렇게 인증칸이 생겼다.


인증 아이디 만드는법

AuthUserFile /var/www/html/.htpasswd 

즉, /var/www/html 위치에서 

htpasswd -c .htpasswd user1


htpasswd -c [파일명] [아이디]

// -c 옵션은 아예 처음 만들 때만 사용 한다.






2. 인증 처리 프로그램 작성

- 데이터 베이스 (DataBase)


SQL(Structured Query Language)

     -구조화된 질의 언어

     - CREATE , DROP, SELECT , INSERT , UPDATE ,         DELETE


1. DDL(Data Definition Language)


- 데이터를 정의할 수 있는 구문

- 생성 및 삭제 : CREATE , DROP


2. DML(Data Manipulation Language) 

    - 데이터를 조작할 수 있는 구문

     - 조회, 입력 , 수정 , 삭제 

   

3. DCL(Data Control Language)

    - 데이터를 제어할 수 있는 구문

    - 권한, 트랜잭션 , ... 

    

MySQL

- 참조 사이트 : dev.mysql.com


[설치]


1. 데몬(서버 프로그램) : mysql-server

yum -y install mysql-server.i686

2. 클라이언트 프로그램 : mysql



mysql 서버 접속


mysql -h [localhost] -u root  //리눅스의root계정과 관계 x

이런식으로 뜨면 mysql 서버에 접속한 것이다. 

//이땐 리눅스 명령어 통하지 않음.                                                              

[패스워드 설정]


mysqladmin -u root  password 패스워드


mysql -u root -p   // 그다음 패스워드 입력창이 뜬다.


[간단한 명령어]


service mysqld start   //mysql 실행



[DDL]


show   [프로그램 이름] ;       // 보여준다.


drop database [DB이름];    //삭제



test파일이 사라져 있다.



create database [DB이름];    //생성


youngwook이 생성 되어 있다.



use [DB이름];    //들어가기 (화면상에 안뜨므로 기억해야함)


show tables;  //테이블 확인 (아직 만들지 않아 내용이 없음)




[테이블 생성 및 삭제 ]

-데이터의 구조를 정의


정형화된 데이터 : 사용자 정보 

    - no -> 식별번호 -> int

    - 아이디   -> varchar

    - 패스워드  -> hash -> 고정길이 -> char


CREATE TABLE 테이블 이름  ( 컬럼 이름 컬럼 속성들 , 컬럼 이름 컬럼 속성들  , ...)


CREATE TABLE user_info( id varchar(10), pw char(50) );


만든 테이블 안을 보려면

DESC 이름;


DROP TABLE 테이블 이름;    //테이블 삭제(데이터가 존재해도 바로 삭제됨



Key값과 Extra 값을 준 상태.



[DML]



[입력] : insert

 -  INSERT INTO 테이블 이름(컬럼이름, ...) VALUE(값1,...);

 

 - INSERT INTO user_info VALUE('user1',md5('1234'));

// 오류가 난다. 테이블의 갯수와 설정 갯수가 같지 않기 때문에



-INSERT INTO user_info(id,pw) VALUE('user1',md5('1234'));

따라서 이렇게 컬럼을 지정해줘 오류가 나지 않게 설정 한다.



[조회/검색] : select    //출력도 가능


- SELECT 컬럼, ...FROM 테이블 이름;


- SELECT no, id ,pw FROM user_info;



연산이 가능하다.         //printf 같은 역할도 한다.



SELECT 컬럼, ...FROM 테이블 이름 WHERE 조건

= ( 같다 표시 ==를 쓰지 않는다)

<> ( 같지 않다 !=와 같은 뜻)

SELECT * FROM user_info WHERE id='user1'; 


 

[수정] : update


UPDATE 테이블 이름 SET 할당 리스트;

UPDATE 테이블 이름 SET 할당 리스트 WHERE 조건;


UPDATE user_info SET id='quest';


UPDATE user_info SET id='user1' WHERE no=1;




[삭제] : delete


DELETE FROM 테이블 이름 WHERE 조건; 


DELETE FROM user_info WHERE no=1;





PHP 로 mysql에 연결



PHP mysql 다운

   - yum -y install php-mysql.i686




$link : 여러개의 DB를 연결할 때 사용







DB 쿼리 -> PHP( mysql_query() )


1. 입력 , 수정 , 삭제

    - 쿼리가 제대로 실행 되었는가?

  

<?php


// connect to mysql database


// mysql> -h localhost -u root -p;


$link = mysql_connect( 'localhost','root','1234');

if ( $link === False ) {

 // die("mysql connect error: " . mysql_error());

   exit();

}


//db select

//mysql > use user;


$ret = mysql_select_db('youngwook',$link);

if ($ret === False) {

 //die("mysql db select error: " . mysql_error() );

  exit();

}


if (!isset($_REQUEST[id] ) || !isset($_REQUEST[pw] ) || $_REQUEST[id] ===''|| $_REQUEST[pw] === '') {


        //echo "<script> alert('input id and password'); </script>";


?>


<form method=POST action=db.php>

 <input type=text name=id placeholder='user name'  >

 <br>

 <input type=password name=pw placeholder='password here'>

 <input type=submit value='join'>

</form>


<?php

} else{

  $id = $_POST[id];

  $pw = $_POST[pw];

  $query = "INSERT INTO user_info(id,pw) VALUES( '$id', md5('$pw'))";

  $ret= mysql_query($query);

  if(!$ret) {

        die('mysql INSERT ERROR: '.mysql_error() );


 }

}


?>






값을 입력하면


아래와 같이 db테이블 안에 저장 된다.



2. 조회

 - 조건에 맞는 조회된 데이터가 있는가?

 - 조건에 맞는 조회된 데이터가 없는가?




mysql_num_rows()        // id의 갯수가몇개인지 확인


$id = $_POST[id];

  $pw = $_POST[pw];


  $query = "SELECT * FROM user_info WHERE id='$id'";

  $resource = mysql_query($query);

  if( $resource) {

        $cnt = mysql_num_rows($resource);

        echo "number of rows: " .$cnt;





mysql_fetch_row()        //배열 형태로 내용을 보여줌

//row 대신 array라 사용해도 무방


$id = $_POST[id];

  $pw = $_POST[pw];


  $query = "SELECT * FROM user_info WHERE id='$id'";

  $resource = mysql_query($query);

  if( $resource) {

       $row = mysql_fetch_row($resource);

        print_r($row);





MYSQL_BOTH        // 테이블 열의 이름을 보여준다?


        $row = mysql_fetch_row($resource,MYSQL_BOTH);


       print_r($row);




현재  한 줄만 출력이 되고 있다. 전부 출력 하고 싶으면 수 만큼 $row = mysql_fetch_row($resource,MYSQL_BOTH);


       print_r($row); 이 문을 계속 수행 해주면 된다


ex) number of rows : 3    //반복문 사용해도 된다.

$row = mysql_fetch_row($resource,MYSQL_BOTH);


       print_r($row);

$row = mysql_fetch_row($resource,MYSQL_BOTH);


       print_r($row);


$row = mysql_fetch_row($resource,MYSQL_BOTH);


       print_r($row);



for문을 사용했을 때


for($i=$cnt; $i > 0; $i--){

        $row = mysql_fetch_array($resource,MYSQL_BOTH);

        print_r($row);

        print_r("<br>");

        }










[실습]


-이미 존재하는 사용자라면 입력받은 값으로 새로 업데이트 할 수 있도록 수정




[소스]



$query = "INSERT INTO user_info(id,pw) VALUE('$id',md5('$pw'))";
   if($cnt === 0){

        $result = mysql_query($query);}



   $query = "UPDATE user_info SET pw=md5('$pw') WHERE id='$id'";
   if($cnt > 0) {

    $ret = mysql_query($query); }






'Web Security' 카테고리의 다른 글

웹(WWW)  (3) 2019.03.13
Cookie와 session  (0) 2018.02.26
데이터 전달  (0) 2018.02.20
CGI(PHP)  (0) 2018.02.19
키입력 받아서 화면에 출력  (0) 2018.02.14

1. 미리 지정된 변수



-super globals

$_GET :   GET 방식으로 보낸 데이터가 담겨 있다.(보안 취약)

$_POST : POST 방식으로 보낸 데이터가 담겨 있다.


-사용자 인증

$_COOKIE

$_SESSION



2. GET 방식으로 데이터를 보내는 방법

-URL을 통해 전달 -> 데이터의 크기도 제한

 

-url에 ?을 붙이고 그 다음에 값을 입력하면 들어간다.


- 정보가 쉽게 공개 되게 때문에 보안에 취약






이런식으로 정보가 외부에 들어나기 때문에 엄청나게 취약하다.


!! 일반 변수를 슈퍼 그로벌 변수처럼 (693줄)

/etc/php.ini


-register_globals = off   // 사용하지 않는게 좋다.


데이터가 전달됬는지 확인하기 


isset :bool값과 값이 있다면 string까지 알려줌.



데이터를 입력하지 않았을 때 




데이터를 입력했을 때





데이터를 입력하지 않았을 때 웹페이지와 소스코드



데이터를 입력했을 때의 웹페이지와 소스코드




(PHP의 특징)

위의 결과를 보면 내가 입력하는 값에 따라 페이지 소스 또한 달라진다는 것을 알 수 있다.




3. POST 방식으로 데이터를 보내는 방법

-form 태그를사용해서만 전달이 가능

- 헤더가 아닌 메세지 바디를 통해 전달


form의 주요 속성


- action

- method=GET | POST


기본구조

value를 넣으면 그 값을 넣을 수 있다.


placeholder를 이용하면 




이런식으로 옅하게 뜬다.




POST와 GET의 차이

-POST는 url에 보이지 않는다.



GET




POST





data.php




데이터를 전송하면


data.php 파일에서 데이터를 받아 출력하게 해준다 (POST방식이라 url에 보이지 않는다.)


실습


값이 있으면 값을 출력하고 값이 없으면 form을 출력하게 한다.



<!doctype html>


<html>

<head></head>


<body>


<?php

if(isset($_POST[age]) && isset($_POST[name]) && $_POST[age]!=='' && $_POST[name] !==''  ) {



  echo "<p> name: $_POST[name] </p>";

  echo "<p> age: $_POST[age] </p>";

}

else

{

?>


     <form action=POST.php method=POST >


      <input type=text name=name >

      <input type=text name=age >

      <input type=submit >

        </form>

<?php

}


?>

</body>

</html>

                       









'Web Security' 카테고리의 다른 글

Cookie와 session  (0) 2018.02.26
아파치 웹 서버 인증 과 DB  (0) 2018.02.21
CGI(PHP)  (0) 2018.02.19
키입력 받아서 화면에 출력  (0) 2018.02.14
웹의이해 (JavaScript)  (0) 2018.02.12

+ Recent posts