개요
오늘은 php에서 _POST와 _GET이나 _SERVER, _COOKIE, _SESSION 등의 방법을 사용하여 값을 넘겨줄때 그 값을 받은 페이지에서 좀 더 간단하게 변수로 받아 사용하는 방법을 알아보려 합니다.
$_POST나 $_GET을 사용하는 이유?
html코드에서 form을 사용해서 post방식으로 값을 넘겼을 때, 값을 받는 페이지에서는 post 방식으로 넘어온 값을 받으려면 $_POST ["이름"]의 방식으로 받아온 값을 사용해야 됩니다.
예를 들어보겠습니다.
<form action="test.php" method="post">
<input type="hidden" name="id" value="abcd">
<input type="submit">
</form>
위와 같은 코드를 통해 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함수의 사용방법을 알아보았습니다.
해당 함수를 사용하여 좀 더 깔끔하게 코드를 정리하고 편리하게 변수를 사용하시길 바랍니다.
'코딩 > php' 카테고리의 다른 글
[PHP] array_key_exists() 함수: 배열 키 존재 여부 확인 (91) | 2023.12.29 |
---|---|
[PHP] 배열이 값을 가지고 있는지 포함여부를 알 수 있는 함수 (in_array 사용법) (74) | 2023.12.27 |
[PHP/자바스크립트] PHP와 JavaScript를 활용한 간단한 실시간 채팅 애플리케이션 예제 (51) | 2023.02.25 |
[PHP/html] PHP를 활용한 간단한 로그인 시스템 구현 예제 (31) | 2023.02.23 |
[HTML/PHP] html과 php, mysql을 활용한 간단한 게시판 만들기 #5 (상세페이지/수정/삭제) (29) | 2023.02.09 |
댓글