정보보안공부
웹보안_8. GET/POST방식 본문
GET/POST방식
데이터를 보내는 방식에는 GET방식과 POST방식이 있다.
GET방식과 POST방식과 함께 php에 미리 지정된 변수들을 살펴보자.
$_GET, $_POST, $_REQUEST, $_COOKIE, $_SESSION ... 등이 있고 어떤 파일에서도 참조할 수 있는 super globals가 있다. super globals 는 설정만 변경해주면 어떤 파일에서도 참조할수 있는 변수가된다. 아래를 통해 살펴보자.
<GET방식>
- GET방식으로 보낸 데이터가 담겨있는 변수는 $_GET으로 지정되어있다.
- GET방식으로 데이터를 보내는 방법을 살펴보자
- GET방식은 해당 URL뒤에 ?변수=값으로 구성되고 변수들을 여러개 작성하려면 해당 URL뒤에 ?변수=값&변수=값&변수=값으로 &를통해 구분지어준다.
이렇게 작성하면 x=30, y=50 이라는 x라는 key, 30이라는 value형태로 외부에서 변수를 정의할 수 있다. 사용자는 x=30, y=50 이라는 데이터를 전달하고 서버는 데이터의 결과를 사용자에게 보여주는 형태가된다.
이렇게 작성하지만 해당 데이터 내용을 누군가가 확인할 수 있다는 뜻 이므로 보안에 취약하다.
전달된 정보를 Chrome에 개발자환경(F12)를 통해 아래와 같이 확인해보자
URL뒤에 ?x=30&y=50그대로 데이터값은 x: 30 , y: 50으로 나타나는것을 확인 할 수있다.
데이터의 결과를 보기위해서는 input.php파일에 출력하는 코드를 작성해야한다. input.php파일에서 변수를 선언한것이아니라 외부에서 선언된 변수이므로 아래와같이 할경우 해당데이터를 출력하지 못한다.
따라서 외부에서 선언한 변수의 값을 출력하려면 php.ini 파일의 설정을 변경해야한다. 아래사진으로 살펴보자.
register_globals = On으로 설정한다.
파일의 설정을 변경하면 꼭 재시작을 해주어야한다.
외부에서 선언한 변수도 출력할수 있다는 것만 확인해보자. register_globals = On으로 설정하면 일반 변수를 슈퍼 글로벌 변수로 바꿈으로써 다른 php파일에서도 해당변수를 사용할수 있지만 좋은 방법은 아니라는 것도 알아두자. 하지만GET방식으로 작성했을경우 위의 방법보다는 $_GET을 사용해볼것이다.
$_GET은 register_globals = On의 설정과 상관없이 php에 지정되어있는 변수이다.
print_r은 배열형태로 출력시켜준다.
var_dump를 이용해 변수에 대한 정보를 출력한다. isset은 해당 변수가 설정되었는지 확인할때 사용하고 결과값을 boolean형을 통해 false, true로 반환한다.
첫번째줄 결과가 bool(true) : x=30이라는 변수가 설정되었으므로
두번째줄 결과는 GET방식인 외부변수 y의 정보를 출력해준다 String(2) : 글자, "50":값
var_dump( $_GET ); 을 이용하면 get방식에 이용된 변수를 한번에 출력할수 있다.
if 문과 isset을 이용해 GET방식으로 변수를 지정하면 해당 변수의 값을 출력하고 GET방식으로 x, y 변수를 지정하지않으면 input again이라는 문구를 출력하도록 한다.
x, y 둘중 하나를 지정하지않거나, 둘다 지정하지않으면 if문조건에 의해서 else문이 실행된다.
php를 작성할때 부분별로 <?php ?>를 이용해서 작성할 수 있는데 아래와같이 표현한 코드는 위의 코드와 동일하게 실행된다. <?php ?>를 사용하지 않은 부분은 단순히 웹페이지에서 보여지는 HTML코드이고 <?php ?>를 사용한 코드는 서버로부터 결과를 받아 나타도록 하는 코드와 관련있다고 생각해야한다. php를 여러블록으로 나누어도 하나의 파일로 실행된다.
<POST방식>
- POST방식으로 보낸 데이터가 담겨있는 변수는 $_POST로 지정되어있다.
- POST방식은 form 형태를 통해서만 데이터를 보낼 수 있다. GET방식은 URL에서 입력한뒤 엔터를 하고, POST방식의 입력은 submit 을 실행(눌러야)해야 전송이된다.
#form.php
action : 상대경로로 지정한다.
method : GET or POST 둘다 사용가능하다. method가 없다면 GET방식이 default값이다.
name과 age를 작성후 send를 누르면action에 지정한 input.php로 데이터값이 전달된다.
#input.php
위의 파일은 form.php에 폼태그를 작성한뒤 input.php로 해당데이터를 넘겼다.
이번에는 input.php에서 폼태그와 데이터를 받는코드를 함께사용해보자. 입력값이 있으면 입력받은 값을 출력하고 없으면 입력폼을 출력한다.
위의 코드는 폼태그 중에서 name과 age둘중 하나라도 입력하지 않으면 또다시 입력값을 작성하는 폼태그를 수행한다. name과 age 모두입력해야 두개의 출력값이 뜬다. DEBUG :::: 는 해당값이 어떻게 출력되나 확인하기위해 임시로 작성한 출력문이다.
isset은 변수가 지정되면 참으로 판정된다. 변수명이 지정되도 변수값이 지정안된경우 $_POST[name] !== '' 으로 해결한다. 값이 지정안된상태는 '' 상태이다. null과는 다르다.
gettype()을 이용하면 name값의 타입을 알수있는데 String이다. 아무것도 입력하지 않았을때 String인 것으로 보아 문자열이므로 '' 이다. 위의 노란색 줄처럼 if문으로 아무것도 입력하지 않았을때 해당 조건에의해 if문이 실행되지 않는다.
# null과 ''의 차이
gettype을 이용해 null과 ''의 타입을 출력해보면 null은 NULL, ''은 String이다.
비교연산자 === 는 타입도 고려하기때문에 false값이 출력되고 == 로 타입에 관계없이 비교하였을때는 true라고 판단하니 주의하는게 좋을 것 같다.
# 변수가 지정됬는지 확인할때는 isset, 지정된 변수값의 타입을 확인할때는 gettype을 사용하면 좋을것같다.
'정보보안 > 웹보안' 카테고리의 다른 글
웹보안_10. MYSQL/쿼리 (0) | 2018.02.24 |
---|---|
웹보안_9. 웹페이지 인증 (0) | 2018.02.22 |
웹보안_7. php (0) | 2018.02.20 |
웹보안_6. HTML DOM/BOM (0) | 2018.02.17 |
웹보안_5. Javascript문법 (0) | 2018.02.13 |