[1] HTTP 요청


1] HTTP 전송 방법, 요청된 URL, HTTP 버전


2] REFERER : 어디로부터 요청 받았는지에 대한 URL


3]USER-AGENT : 브라우저, 기타 클라이언트 소프트웨어 정보


4]HOST : 하나의 물리서버에 하나 이상의 웹 호스팅을 했을때 구별


5]쿠키 : 서버가 클라이언트에게 보낸 인자값에 추가 정보를 보낼 때 사용




[2] HTTP 응답


1] HTTP버젼, 요청에 대한 결과 코드, 응답에 대한 상황을 설명하는 문자열


2] SET-COOKIE ; 브라우저에게 쿠키에 대한 정보를 제공, 클라이언트가 서버에게 페이지를 요청 할때 함께 송신


3]PRAGMA : 응답한 내용에 대한 캐시 저장 여부


4]EXPIRES ; 캐시 할 수 있는 기간 제시


5]CONTENT-TYPE ; 이 메세지 바디에 HTML문서가 있음을 알려줌


6]CONTENT-LENGTH ;  메세지 바디의 길이를 바이트 단위로 표시




[3] HTTP 메서드


GET

GET 메서드는 지정된 리소스의 표현을 요청한다. GET를 이용한 요청은 데이터만 검색해야 하며 다른 효과는 없어야 한다.(이것은 다른 몇몇 HTTP 방법에도 해당된다.)


HEAD

HEAD 방법은 GET 요청과 동일한 응답을 요구하지만, 응답 Body는 없다. 이것은 전체 콘텐츠를 전송하지 않고도 응답 헤더에 기록된 메타 정보를 검색할 때 유용하다.


POST

POST 방법은 서버가 요청서에 동봉된 실체를 URI에 의해 식별된 웹 자원의 새로운 부하로 받아들일 것을 요청한다. 예를 들어 posted 데이터는 기존 리소스에 대한 주석, 게시판, 뉴스 그룹, 메일 그룹 또는 주석 스레드에 대한 메시지, 웹 양식을 데이터 처리 프로세스에 제출한 결과 데이터 블록 또는 데이터베이스에 추가할 항목일 수 있다.


PUT

PUT 방법은 폐쇄된 엔티티를 제공된 URI에 저장하도록 요청한다. URI가 이미 존재하는 자원을 참조하면, 수정된다. URI가 기존 자원을 가리키지 않으면, 서버는 해당 URI로 해당 자원을 생성할 수 있다.


DELETE

DELETE 메서드는 지정된 리소스를 삭제한다.


TRACE

TRACE 방법은 수신 요청을 반영하여 클라이언트가 중간 서버에 의해 변경되거나 추가된 내용을 볼 수 있도록 한다.


OPTIONS

OPTIONS 메서드는 서버가 지정한 URL에 대해 지원하는 HTTP 메서드를 반환한다. 이는 특정 자원 대신 '*'를 요청하여 웹 서버의 기능을 확인하는 데 사용될 수 있다.


CONNECT

[CONNECT 방법은 보통 암호화되지 않은 HTTP 프록시를 통해 SSL 암호화 통신(HTTPS)을 용이하게 하기 위해 요청 연결을 투명한 TCP/IP 터널로 변환한다.


PATCH

PATCH 방법은 자원에 부분 수정을 적용한다.




[4] HTTP 헤더


1]일반적인 헤더


1) CONNECTION ; HTTP전송이 완룓힌 후에 TCP연결을 차단할지, 다른 메세지를 위해 열어둘지 결정

2) CONTENT-ENCODING ; 메세지 바디 내용에 어떤 종류의 인코딩을 사용할 지 결정

3) CONTENT-LENGTH ; 메세지 바디의 길이

4) CONTENT-TYPE ; 메시지 바디에 들어 있는 컨텐츠 종류(예를 들어 TEXT/HTML)

5) TRANSFER-ENCODING ; 메세지 바디가 HTTP전송을 쉽게 하게 도와주는 인코딩 방법



2] 요청해더


1) ACCEPT ; 클라이언트가 수용할 종류를 서버에게 알림(그림파일, 문서형식...)

2) ACCEPT-ENCODING ; 클라이언트가 어떤 종류의 인코딩된 문서를 수락할지 서버에게 알림

3)AUTHORIZATION ; 사용자의 식별정보을 서버에게 보낼 때

4)If-Modified-Since ; 브라우저가 마지막으로 요청 자료을 받은 시간 . 해당 자료가 특정 시간이후에 변경된 적이 없다면, 304코드을 이용해 클라이언트 하드디스크에있는 복사본을 사용할것을 권고

5]If-None-Match ; Entity tag을 지정하기 위해서 사용. 메시지 바디을 식별해주는 역할. 브라우저는 서버에서 전송된 정보를 모두 수신한 후 entiry tag를 전송한다. 서버는 entity tag을 사용해 브라우저가 자료 복사본을 사용 할 수 있는지 여부를 판단.

6)Referer ; 현재 요청이 시작된 URL

7)User-Agent ; 요청 브라우저의 정보




3] 응답헤더


1)Cache-Control ; 캐시에 대한 지시를 브라우저에게 전달

2)Etag ; Entity Tag로서 클라이언트는 나중에 같은 자료를 요청할때 If-None-Match 헤더에서 Etag정보를 보낼 수 있다. 따라서 현재 브라우저는 캐시에 어떤 버전의 자료을 가시고 있는지 서버에게 알릴 수 있다.

3)Expires ; 브라우저는 요청한 자원에 대해 Expires 시간까지 클라이언트의 하드에 저장된 복사본을 이용.

4)Location ; 재전송하는 응답에서 목적지를 나타내는 데 사용. Location은 상태 코드 3부터 시작.

5)Pragma ; 브라우저에게 no-cache와 같은 캐싱 지시을 보내기 위해 사용

6)Server ; 웹서버의 소프트웨어에 대한 정보

7)Set-Cookie ; 쿠키를 생성하고 브라우저에게 보낼 때 사용

8) WWW-Authentication ; 401상태 코드와 함께 응답할 때 사용




[5] 상태 코드


1] 1xx ;  정보을 제공함

2] 2xx ; 요청이 성공적으로 이뤄짐

3] 3xx ; 요청에 대한 해당 자원이 다른 곳에 있음

4] 4xx ; 요청(클라이언트)에 문제가 있음

5] 5xx ; 서버에 에러가 있음




100 Continue ; 클라이어트가 서버에게 메시지 바디을 포함한 요청을 보냈을때 받는 응답 코드

200 OK ; 클리이언트 요청이 성공

201 Created ; 클라이언트의 PUT요청이 성공

301 Moved Permanently ; 브라우져 요청을 다른 URL로 항시 전달한다는 것.

302 Found ; 브라우저의 요청을 임시 URL로 바꾸고 Location 헤더에 임시로 변경한 URL에 대한 정보를 적는다.

304 Not Modified ; 클라이언트 요청을 서버는 복사되어 있는 캐시를 사용할것을 요청

400 Bad Request ; 클라이언트가 서버에 잘못된 요청을 했다는 것

401 Unauthorized ; 서버가 클라이언트 요청에 대해 http 인증확인을 요구한다는 것

403 Forbidden ; 클라이언트 요청에대한 접근을 차단

404 Not Found ; 클라이언트 요청 자료가 존재하지 않는 다는 것

405 Method Not Allowed ; 클라이언트 요청에 대한 이용한 메소드가 해당 URL에 지원 불가능하다는 것

413 Request Entity Too Large ; 클라이언트 요청한 바디를 서버에서 처리하기가 너무 크다는 것

414 Request URI Too Long ; 서버가 감당 할 수 없을 만큼 크다는 것

500 Internal Server Error ; 서버가 클라이어트 요청을 실행 할 수 없을때

503 Service Unavailable ; 서버에서 구동 중인 Application이 응답하지 못할때




[6] HTTP 인증


1] Basic: Base64로 암호화한 문자열 사용

2] NTML ; 윈도우 NTLM 프로토콜 사용

3] Digest ; MD5 체크섬을 사용




[7] 인코딩 스키마


1] URL 인코딩 ; ASCII 문자집합에서 출력가능한 문자 포함. 0x20~0x7e범위도 포함


%3D ; =

%25 ; %

%20 ; space

%0a ; new line

%00 ; Null byte



2] UNIcode 인코딩 ; %u로 시작



3] HTML 인코딩

&qout ; "

&apos ; '

&amp ; &

&lt ; <

&gt ; >




10진수로도 인코딩

&#34 ; "

&#39 ; '




16진수로도 인코딩

&#x22 ; "

&#x27 ; '




4] Base64 인코딩

; 입력 데이터를 3 byte단위로 블럭화 한 후, 각 블록은 다시 6bit씩 네 파트로 분할


eth1 host-only 를 캡처해서

http://meta

접속해보기

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

LFI(Local File Inclusion)  (0) 2019.03.26
정보수집(maltego와 dirb스캐닝)  (0) 2019.03.25
bee-box설치  (0) 2019.03.21
서버연동해보기  (0) 2019.03.20
php와mysql,zabbix설치 (Centos7)  (0) 2019.03.19


어드민 비번 : bug


web사이트

bee /bug


meta

admin /password


1. 다운

 https://sourceforge.net/projects/bwapp/files/bee-box/bee- box_v1.6.7z/download  



2. 키보드 설정


한국 키보드로 변경~




3. 네트워크 설정

vi /etc/network/interfaces


/etc/init.d/networking restart



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

정보수집(maltego와 dirb스캐닝)  (0) 2019.03.25
http  (0) 2019.03.25
서버연동해보기  (0) 2019.03.20
php와mysql,zabbix설치 (Centos7)  (0) 2019.03.19
가상호스팅  (0) 2019.03.18



members_area을 연동하기.



[1] 화면띄우기


members_area을 /var/www 밑에 풀기.


vi /etc/httpd/conf/httpd.conf

<VirtualHost *:80>

ServerName www.websec.local

ServerAlias websec.local *.websec.local

//index.php파일위치

DocumentRoot /var/www/websec.local/members_area 

DirectoryIndex index.php

</VirtualHost>


//아래 같이 뜨면 성공


[2] db연동

//아래와 같은 곳에서 입력하면 db에 값이 들어가야한다.



2-1 테이블생성

mysql -u root -p


create database webestools;


use websestools;


CREATE TABLE `users` (

  `id` bigint(20) NOT NULL,

  `username` varchar(255) NOT NULL,

  `password` varchar(255) NOT NULL,

  `email` varchar(255) NOT NULL,

  `avatar` text NOT NULL,

  `signup_date` int(10) NOT NULL

) ENGINE=MyISAM DEFAULT CHARSET=utf8;

2-2 연동


vi config.php

//밑에처럼 db아이디와 db비번 db이름을 연동





select * from users;

이제 회원가입을하면 값이 들어오는 것을 확인할 수 있다.





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

http  (0) 2019.03.25
bee-box설치  (0) 2019.03.21
php와mysql,zabbix설치 (Centos7)  (0) 2019.03.19
가상호스팅  (0) 2019.03.18
웹(WWW)  (3) 2019.03.13






1. 가상호스팅 1개더 추가.


vi /etc/http/conf/httpd.conf


2. 호스트파일 편집

vi /etc/hosts

192.168.232.250 www.zabbix.local 추가

3.클라 호스트파일에 추가

vi /etc/hosts

192.168.232.250 www.zabbix.local 추가


4. PHP설치


yum -y install php php-pear php-cgi php-common php-mbstring php-snmp php-gd php-xml php-mysql php-gettext php-bcmath


php -v //버전확인


5. timezone in /etc/php.ini 설정


vi /etc/php.ini

878번째  줄 아래와 같이 수정

6. Mariadb 설치

yum -y install mariadb-server mariadb

systemctl start mariadb  //실행
systemctl enable mariadb //부팅시 자동실행

7.Configure security for Mariadb
mysql_secure_installation //초기설정

7-1 //초기비번없음 enter입력

7-2  비번 설정.

7-3  익명사용자 제거

7-4  루트로그인 차단

7-5 테스트DB 삭제


7-6 privilege Reload

8. 마리아db접속

mysql -u root -p

show databases;

use mysql;

create database zabbix;


//권한부여

grant all privileges on zabbix.* to 'zabbix'@'localhost' identified by 'root';

flush privileges;



9. zabbix repository 다운
yum install -y https://repo.zabbix.com/zabbix/4.0/rhel/7/x86_64/zabbix-release-4.0-1.el7.noarch.rpm

10. install zabbix
yum install -y zabbix-server-mysql zabbix-web-mysql zabbix-agent zabbix-get

11. Create tables in zabbix database using script

zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p zabbix
패스워드 물으면 패스워드 입력.


use zabbix;

show tables;





12. Edit zabbix server 
 
vi /etc/zabbix/zabbix_server.conf
 DBPassword = 비번


13. Start zabbix-server
systemctl start zabbix-server
systemctl enable zabbix-server
systemctl restart httpd

14. 방화벽 키기(10051과10050 열기)
firewall-cmd --permanent --add-port={10051/tcp,10050/tcp}
firewall-cmd --reload //저장
firewall-cmd --list-ports //확인


15. zabbix확인
www.zabbix.local




password만 건든다.

NEXT


NEXT


NEXT





NEXT




NEXT


초기 아이디 : admin

초기 비번 :zabbix



//모니터링을 할 수 있다.  










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

bee-box설치  (0) 2019.03.21
서버연동해보기  (0) 2019.03.20
가상호스팅  (0) 2019.03.18
웹(WWW)  (3) 2019.03.13
Cookie와 session  (0) 2018.02.26

가상호스트

- 한 컴퓨터로 여러 웹사이트를 서비스하는 것.


- IP기반 방식   //IP를 여러개 사용하여 서비스

- 이름기반 방식 //IP한개로 여러 이름을 가지는 서비스



[이름기반방식]

호스트 이름

127.0.0.1

www.websec.local

www.infosec.local 




[기본 문법]

NameVirtualHost *:80


<VirtualHost *:80>

ServerName www.domain.tld

ServerAlias domain.tld *.domain.tld

DocumentRoot /www/domain

</VirtualHost>



[설정하는법]


1. vi /etc/httpd/conf/httpd.conf


NameVirtualHost *:80


<VirtualHost *:80>

ServerName www.websec.local

ServerAlias websec.local *.websec.local 

//alias부분은 굳이 적지 않아도 된다.

DocumentRoot /var/www/websec.local

</VirtualHost>


<VirtualHost *:80>

ServerName www.infosec.local

ServerAlias infosec.local *.infosec.local

DocumentRoot /var/www/infosec.local

</VirtualHost>






2.접근권한 775로 2개의 디렉터리 생성 

mkdir -m 775 {websec.local,infosec.local}   


3.각각 디렉터리안에 index.html 파일 생성

cd var/www/websec.local

 touch index.html

 cat > index.html

 This page is for WEBSEC site.


cd var/www/infosec.local

 touch index.html

 cat > index.html

 This page is for INFOSEC site.



4. vi /etc/hosts   //매핑시켜준다.

127.0.0.1 대신 자신의 ip주소를 써도 무방.


127.0.0.1   www.websec.local

127.0.0.1   www.infosec.local


5. ping을 통해 살아있는지 확인

ping -c 4 www.websec.local



ping -c 4 www.infosec.local



6. website를 통해 확인

firefox http://websec.local &


firefox http://infosec.local &



7. 첫화면 가져오기.
cd /var/www/websec.local //디렉터리 안에 들어가서 해야한다.
curl -o index.html http://www.w3.org/ 
//www.w3.org의 홈페이지화면을 가져와서 index.html로 옮긴다.





[메인페이지 이름바꾸기(index.html) ]


1.
vi /etc/httpd/conf/httpd.conf

<Virtualhost *:80> 문장안에
DirectoryIndex websec.html 추가


<Virtualhost *:80> 문장안에
DirectoryIndex infosec.html 추가

2.

각 폴더에 index.html파일의 이름을 바꾼 이름으로 변경


cd /var/www/websec.local

mv index.html websec.html


cd /var/www/infosec.local

mv index.html infosec.html



3. httpd 재시작 후 잘 되는지 확인

systemctl restart httpd


[다른 IP주소로 열기]

DNS가 따로 없다면,

만든 웹페이지를 들어갈 리눅스에 /etc/hosts파일에 
서버IP와 웹페이지주소를 매핑시켜놓으면 된다.













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

서버연동해보기  (0) 2019.03.20
php와mysql,zabbix설치 (Centos7)  (0) 2019.03.19
웹(WWW)  (3) 2019.03.13
Cookie와 session  (0) 2018.02.26
아파치 웹 서버 인증 과 DB  (0) 2018.02.21

Internet

- Network(Infrastructure)

- Service{WEB , Mail,FTP.....} 



 24/7        //24시간 계속 제공해야하는 서비스

- 이중화        //하나가 죽어도 하나는 살아야한다.

- 망분리       //독립적으로 작동해야한다.



[서버]

H/W : 안전성,성능 ,보안성

 성능 : 로드밸런싱, 분산

S/W :

서버 OS :  Microsoft{ 2016,2012,2008,2003 ...}

   Linux { Distribute(배포판) }

  Unix  

  FreeBSD


S/W 웹서버 

- IIS (Microsoft)

- Apache (Linux)    


    





  



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

php와mysql,zabbix설치 (Centos7)  (0) 2019.03.19
가상호스팅  (0) 2019.03.18
Cookie와 session  (0) 2018.02.26
아파치 웹 서버 인증 과 DB  (0) 2018.02.21
데이터 전달  (0) 2018.02.20

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

CGI

- 데이터의 전달(입/출력)


공격이란?

  -비정상적인 입력값


HTTP와 관련됨.


1. GET


2. POST


웹 어플리케이션

-  CGI  프로그램

- php(python, 등등 다 가능)로 만들어진 프로그램 



PHP 참조 사이트 

-www.php.net



1.  php 설치

- 인터프리터 설치

yum -y install php.i686




php 출력문


echo


print


printf()


<?php            // php블록의 시작


echo "Hello,PHP\n";


print "Hello,PHP\n";


printf("%s\n","Hello,PHP");


?>        // php블록의 끝



실행 : php  hello.php 


마찬가지로 아파치 서버에서 실행하면





아파치에서 실행하면 웹사이트이기 떄문에 html로 인식하여 \n을 인식하지 못하여 <br>을 사용해야 한다.


주의 할 점은 보이는 것은 같으나, 이것이 php인지 javascript인지 구분하기가 어렵다. php는 서버측에서 돌아가는 것이고, javascript는 웹브라우저에서 돌아간다. 




php는 javascript와 다르게 웹사이트에서 코드에러가 나면 에러메세지가 나오지 않는다.

2. 에러 메시지 출력: /etc/php.ini    //권장하지 않음.


display_errors = Off  --->On 으로 바꾸고 아파치 서버를 재부팅하면 에러메세지가 뜬다.





배열




배열 전체 출력은

print_r($arr); 




이런식으로 정렬할 수 도 있다.




이런식으로 다중 배열로 이용할 수 있다.



문자열을 연결할 때 javscript는 '+' 를 사용 하였지만 

       php는 '.'이나 띄어쓰기로 가능하다.







  애매한 문법을 보완하기 위해 {}를 쓴다.



배열 전부 출력


foreach( $배열 as $키 => $값 )



foreach로 key값도 가져올 수 있다.





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

아파치 웹 서버 인증 과 DB  (0) 2018.02.21
데이터 전달  (0) 2018.02.20
키입력 받아서 화면에 출력  (0) 2018.02.14
웹의이해 (JavaScript)  (0) 2018.02.12
Apache 서버  (0) 2018.02.12

+ Recent posts