본문 바로가기
코딩/php

[PHP] POST와 GET없이 변수값을 사용하는 법 (extract 사용)

by 우월한하루 2023. 10. 26.
728x90
반응형
개요

 

 

오늘은 php에서 _POST와 _GET이나 _SERVER, _COOKIE, _SESSION 등의 방법을 사용하여 값을 넘겨줄때 그 값을 받은 페이지에서 좀 더 간단하게 변수로 받아 사용하는 방법을 알아보려 합니다.

 


 

출처: 위키피디아 php 공식문서
출처: 위키피디아 php 공식문서

 

 

 $_POST나 $_GET을 사용하는 이유?

 

html코드에서 form을 사용해서 post방식으로 값을 넘겼을 때, 값을 받는 페이지에서는 post 방식으로 넘어온 값을 받으려면 $_POST ["이름"]의 방식으로 받아온 값을 사용해야 됩니다.

 

예를 들어보겠습니다.

 

<form action="test.php" method="post">
	<input type="hidden" name="id" value="abcd">
    <input type="submit">
</form>

 

 

728x90

 

 

위와 같은 코드를 통해 id값을 test.php 페이지로 넘겨봅시다.

 

method="post"로 test.php로 값을 넘겨주었기 때문에 넘겨준 id 값을 사용하기 위해서는 $id = $_POST ["id"]; 이렇게 선언해 주어야 변수 id의 값에 "abcd"라는 값이 들어가서 사용할 수 있게 됩니다.  

 

이런 값이 한두 개면 모르겠는데 수십 개라면 하나하나 이렇게 지정해 주어서 사용하기 너무 불편하지 않을까요?

 

물론 반복문을 통해서 지정해서 사용도 가능하지만 반복문을 사용하면 코드의 충돌이 일어날 경우 대처하는 코드를 또 작성해 줘야 되고 이것저것 생각하면 코드가 또 길어질 수 있습니다.

 

굳이 어렵게 하지 않고 php에서 사용가능한 코드를 사용하면 딱 한 줄로 해결이 가능합니다.

 

 

extract(); 사용하기

 

extract함수를 사용하면 값을 넘겨줄 때 사용했던 name값으로 그대로 변수를 사용할 수 있습니다.

 

extract($_POST);

echo $id;

 

"extract($_POST);"

 

위의 코드 한 줄만 있으면 post로 수십 개 수백 개의 값을 넘겨도  $id = $_POST ["id"];처럼 선언하지 않고 $id를 그대로 사용해도 되는 것입니다.

 

echo로 id값을 출력했으니 나오는 내용은 "abcd"가 출력되게 됩니다.

 

extract($_POST);
extract($_GET);
extract($_SERVER);
extract($_COOKIE);
extract($_SESSION);

 

post뿐만 아니라 마찬가지로 쿠키나 세션값들도 위와 같이 사용할 수 있습니다.

매번 페이지마다 이렇게 선언해 주면 귀찮으니 헤더 파일이나 lib 파일을 하나 만들어서 그곳에 입력해 주고 include_once()를 사용하여 불러와서 사용하면 편리합니다.

 

 

extract의 취약점

 

extract는 변수를 쉽게 사용하게 정의해 주지만 취약점도 존재합니다.

웹사이트를 운영하다 보면 해외 아이피 등으로 들어오는 공격들도 마주하게 됩니다.이럴 때 해당 변수들에 간섭하여 저장된 정보들을 빼가는 등등 여러 가지 공격이 들어오는데, extract($_POST); 로만 사용하면 공격에 취약할 수 있습니다.

 

 

반응형

 

extract($_POST, EXTR_SKIP);
extract($_GET, EXTR_SKIP);
extract($_SERVER, EXTR_SKIP);
extract($_ENV, EXTR_SKIP);
extract($_COOKIE, EXTR_SKIP);
extract($_SESSION, EXTR_SKIP);

 

extract의 안에 EXTR_SKIP을 사용해 주면, 충돌이 있는 경우 기존 변수를 덮어쓰지 않고 사용하게 해 주어 공격이 들어왔을 때 변수를 덮어쓰지 않게 하여 취약점을 어느 정도 예방 할 수 있습니다.

 

이 외에도 여러 개가 있는데 아래에 설명 추가하겠습니다.

 

EXTR_OVERWRITE

충돌이 있으면 기존 변수를 덮어씁니다.

 

EXTR_SKIP

충돌이 있는 경우 기존 변수를 덮어쓰지 마십시오.

 

EXTR_PREFIX_SAME

충돌이 있는 경우 변수 이름 앞에 $prefix를 붙입니다. 

extract(array &$array, int $flags = EXTR_OVERWRITE, string $prefix = "");

 

EXTR_PREFIX_ALL

모든 변수 이름 앞에 prefix 를 붙임.

 

EXTR_PREFIX_INVALID

유효하지 않은/숫자 변수 이름 앞에만 prefix 를 붙임 .

 

EXTR_IF_EXISTS

현재 기호 테이블에 변수가 이미 존재하는 경우에만 변수를 덮어쓰고, 그렇지 않으면 아무 작업도 수행하지 않습니다. 예를 들어 이는 유효한 변수 목록을 정의한 다음 $_REQUEST 에서 정의한 변수만 추출하는 데 유용합니다

 

EXTR_PREFIX_IF_EXISTS

동일한 변수의 접두어가 없는 버전이 현재 기호 테이블에 존재하는 경우에만 접두어가 붙은 변수 이름을 생성하십시오.

 

EXTR_REFS

변수를 참조로 추출합니다. 이는 가져온 변수의 값이 여전히 매개 array변수의 값을 참조하고 있음을 의미합니다. 이 플래그를 단독으로 사용하거나 OR을 사용하여 다른 플래그와 결합할 수 있습니다 flags.

 

 


 

마무리

 

오늘은 extract함수의 사용방법을 알아보았습니다.

해당 함수를 사용하여 좀 더 깔끔하게 코드를 정리하고 편리하게 변수를 사용하시길 바랍니다.

 

728x90
반응형

댓글