웹마스터 팁
page_full_width" class="col-xs-12" |cond="$__Context->page_full_width">
PHP 혼자 공부하기 - 4 :: 미리 정의된 변수
2003.04.09 17:13
이야~ 벌써 네번째네요~ ^^
저도 하던 작업이 있어서 우선은 여기까지만 강의하고 며칠 뒤에 또 올릴께요~
php.ini 에 register_globals 라는 옵션이 있고 대부분의 웹호스팅에서는 이 옵션이 On 되어있습니다. 되게 편하기는 한 옵션입니다.
예를 들어, test.php?name=행복한고니 라고 URL을 입력하면...
<?php echo $name ?>
과 같이 간단하게 받아올 수 있으니까요... 그렇지만 이 경우 보안상에는 꽤 문제가 될 수도 있습니다.
register_globals 옵션을 켜두게 되면 쿠키, 세션, GET, POST 모두가 전역 변수로 등록됩니다. 여기에서 문제가 발생하죠. 만약 변수명이 같게 되면 어느 쪽이던지 데이타가 사라져 버리게 됩니다. 조심해야할 문제죠. 더군다나 보안상의 위험이 생길 수도 있습니다. 그래서 세션이나 쿠키같은 값은 대게 $_SESSION 이나 $_COOKIE 와 같은 시스템 변수로 받아오는 것이 안전하며, 이것은 GET이나 POST에도 마찬가지로 적용됩니다.
사용자가 지정해주지 않아도 미리 생겨있는 $_SESSION, $_COOKIE 같은 변수들을 Predefined variables(미리정의된 변수) 라고 하며, 다음과 같습니다. 각각의 변수들은 전부 배열로 표현되며 $_SERVER[PHP_SELF] 와 같이 값을 사용합니다.
$GLOBALS
전역변수, 글로벌 변수라고 부릅니다. 말 그대로 현재의 프로그램 전체에 걸쳐서 영향을 미치는 변수입니다.
$_SERVER - 4.1.0 이하는 $HTTP_SERVER_VARS
서버의 환경값이 있는 변수입니다.
...PHP_SELF : 현재 실행되는 PHP프로그램의 경로를 알려줍니다.
...argv : GET방식으로 전달받을 때는 이 곳에 쿼리문 전체(예를들어. test.php?num=123&name=고니 중 num=123&name=고니)를 저장해두며, 쉘 상에서 실행될때는 이곳에 전달받은 argument 값들을 저장합니다.
...argc : 쉘 상에서 실행되었을 경우, 전달받은 파라미터의 갯수를 저장합니다.
...GATEWAY_INTERFACE : 서버가 사용하는 CGI 사양을 알려줍니다. 보통은 CGI/1.1 처럼 출력됩니다.
...SERVER_NAME : 서버의 이름입니다.
...SERVER_SOFTWARE : 서버가 사용하는 소프트웨어를 알려줍니다. 저의 경우에는 Apache/1.3.24 With MMAP/EAPI (Win32) PHP/4.1.2 mod_ssl/2.8.8 OpenSSL/0.9.6c 로 출력되네요.
...SERVER_PROTOCOL : 서버의 프로토콜을 알려줍니다. 당연히 Web 서버이니까 HTTP 입니다.
...REQUEST_METHOD : 페이지 요청 방식을 알려줍니다. GET, HEAD, POST, PUT 등이 있습니다.
...QUERY_STRING : 쿼리문 전체를 알려줍니다.
나머지는 대강 생략하고... 다시 몇 가지...
...HTTP_HOST : 현재의 서버 도메인을 알려줍니다.
...HTTP_REFERER : 현재 문서의 바로 전 문서를 알려줍니다. 어디서 왔는지 알 수 있죠.
...HTTP_USER_AGENT : 사용자의 웹브라우저 종류를 알 수 있습니다.
...REMOTE_ADDR : 사용자의 IP주소 입니다.
...PHP_AUTH_USER : 인증을 거쳤을 때의 사용자아이디입니다.
...PHP_AUTH_PW : 인증을 거쳤을 때의 사용자패스워드입니다.
...PHP_AUTH_TYPE : 인증 방식입니다.
$_GET - 4.1.0 이하는 $HTTP_GET_VARS
GET방식으로 전달받은 값들이 저장되는 변수입니다.
GET방식이란 test.php?num=1234 와 같이 주소표시줄에서 전달받는 방식을 말합니다.
전달받은 변수는 $_GET[num] 과 같이 사용할 수 있습니다.
$_POST - 4.1.0 이하는 $HTTP_POST_VARS
POST방식으로 전달받은 값들이 저장되는 변수입니다.
전달받은 변수는 $_POST[변수명]과 같이 사용할 수 있습니다.
$_COOKIE - 4.1.0 이하는 $HTTP_COOKIE_VARS
쿠키값이 저장되는 변수입니다.
전달받은 변수는 $_COOKIE[쿠키명]과 같이 사용할 수 있습니다.
$_FILES - 4.1.0 이하는 $HTTP_POST_FILES
업로드한 파일값을 저장하는 변수입니다.
$_ENV - 4.1.0 이하는 $HTTP_ENV_VARS
여러가지 환경값이 저장되는 변수입니다.
$_SESSION - 4.1.0 이하는 $HTTP_SESSION_VARS
세션값이 저장되는 변수입니다.
전달받은 변수는 $_SESSION[세션명]과 같이 사용할 수 있습니다.
그냥 이런 변수들이 있구나... 하는 것 정도만 알고 가시면 됩니다. $_GET 이나 $_POST 등은 PHP내부적으로 자동 등록되므로 register_globals 옵션에 관계없이 사용할 수 있으며 PHP 버전 4.1.0 이상이어야 사용가능합니다. ^^ 4.1.0이하에서 사용한 것들도 아직까지는 사용할 수 있지만 곧 지원되지 않을 예정이라고 하므로 가급적이면 사용을 피하는 것이 좋습니다.
### 오늘 생각해볼 것
1. 현재 실행되고 있는 파일명을 출력하라.
2. 사용자의 IP를 출력하라.
저도 하던 작업이 있어서 우선은 여기까지만 강의하고 며칠 뒤에 또 올릴께요~
php.ini 에 register_globals 라는 옵션이 있고 대부분의 웹호스팅에서는 이 옵션이 On 되어있습니다. 되게 편하기는 한 옵션입니다.
예를 들어, test.php?name=행복한고니 라고 URL을 입력하면...
<?php echo $name ?>
과 같이 간단하게 받아올 수 있으니까요... 그렇지만 이 경우 보안상에는 꽤 문제가 될 수도 있습니다.
register_globals 옵션을 켜두게 되면 쿠키, 세션, GET, POST 모두가 전역 변수로 등록됩니다. 여기에서 문제가 발생하죠. 만약 변수명이 같게 되면 어느 쪽이던지 데이타가 사라져 버리게 됩니다. 조심해야할 문제죠. 더군다나 보안상의 위험이 생길 수도 있습니다. 그래서 세션이나 쿠키같은 값은 대게 $_SESSION 이나 $_COOKIE 와 같은 시스템 변수로 받아오는 것이 안전하며, 이것은 GET이나 POST에도 마찬가지로 적용됩니다.
사용자가 지정해주지 않아도 미리 생겨있는 $_SESSION, $_COOKIE 같은 변수들을 Predefined variables(미리정의된 변수) 라고 하며, 다음과 같습니다. 각각의 변수들은 전부 배열로 표현되며 $_SERVER[PHP_SELF] 와 같이 값을 사용합니다.
$GLOBALS
전역변수, 글로벌 변수라고 부릅니다. 말 그대로 현재의 프로그램 전체에 걸쳐서 영향을 미치는 변수입니다.
$_SERVER - 4.1.0 이하는 $HTTP_SERVER_VARS
서버의 환경값이 있는 변수입니다.
...PHP_SELF : 현재 실행되는 PHP프로그램의 경로를 알려줍니다.
...argv : GET방식으로 전달받을 때는 이 곳에 쿼리문 전체(예를들어. test.php?num=123&name=고니 중 num=123&name=고니)를 저장해두며, 쉘 상에서 실행될때는 이곳에 전달받은 argument 값들을 저장합니다.
...argc : 쉘 상에서 실행되었을 경우, 전달받은 파라미터의 갯수를 저장합니다.
...GATEWAY_INTERFACE : 서버가 사용하는 CGI 사양을 알려줍니다. 보통은 CGI/1.1 처럼 출력됩니다.
...SERVER_NAME : 서버의 이름입니다.
...SERVER_SOFTWARE : 서버가 사용하는 소프트웨어를 알려줍니다. 저의 경우에는 Apache/1.3.24 With MMAP/EAPI (Win32) PHP/4.1.2 mod_ssl/2.8.8 OpenSSL/0.9.6c 로 출력되네요.
...SERVER_PROTOCOL : 서버의 프로토콜을 알려줍니다. 당연히 Web 서버이니까 HTTP 입니다.
...REQUEST_METHOD : 페이지 요청 방식을 알려줍니다. GET, HEAD, POST, PUT 등이 있습니다.
...QUERY_STRING : 쿼리문 전체를 알려줍니다.
나머지는 대강 생략하고... 다시 몇 가지...
...HTTP_HOST : 현재의 서버 도메인을 알려줍니다.
...HTTP_REFERER : 현재 문서의 바로 전 문서를 알려줍니다. 어디서 왔는지 알 수 있죠.
...HTTP_USER_AGENT : 사용자의 웹브라우저 종류를 알 수 있습니다.
...REMOTE_ADDR : 사용자의 IP주소 입니다.
...PHP_AUTH_USER : 인증을 거쳤을 때의 사용자아이디입니다.
...PHP_AUTH_PW : 인증을 거쳤을 때의 사용자패스워드입니다.
...PHP_AUTH_TYPE : 인증 방식입니다.
$_GET - 4.1.0 이하는 $HTTP_GET_VARS
GET방식으로 전달받은 값들이 저장되는 변수입니다.
GET방식이란 test.php?num=1234 와 같이 주소표시줄에서 전달받는 방식을 말합니다.
전달받은 변수는 $_GET[num] 과 같이 사용할 수 있습니다.
$_POST - 4.1.0 이하는 $HTTP_POST_VARS
POST방식으로 전달받은 값들이 저장되는 변수입니다.
전달받은 변수는 $_POST[변수명]과 같이 사용할 수 있습니다.
$_COOKIE - 4.1.0 이하는 $HTTP_COOKIE_VARS
쿠키값이 저장되는 변수입니다.
전달받은 변수는 $_COOKIE[쿠키명]과 같이 사용할 수 있습니다.
$_FILES - 4.1.0 이하는 $HTTP_POST_FILES
업로드한 파일값을 저장하는 변수입니다.
$_ENV - 4.1.0 이하는 $HTTP_ENV_VARS
여러가지 환경값이 저장되는 변수입니다.
$_SESSION - 4.1.0 이하는 $HTTP_SESSION_VARS
세션값이 저장되는 변수입니다.
전달받은 변수는 $_SESSION[세션명]과 같이 사용할 수 있습니다.
그냥 이런 변수들이 있구나... 하는 것 정도만 알고 가시면 됩니다. $_GET 이나 $_POST 등은 PHP내부적으로 자동 등록되므로 register_globals 옵션에 관계없이 사용할 수 있으며 PHP 버전 4.1.0 이상이어야 사용가능합니다. ^^ 4.1.0이하에서 사용한 것들도 아직까지는 사용할 수 있지만 곧 지원되지 않을 예정이라고 하므로 가급적이면 사용을 피하는 것이 좋습니다.
### 오늘 생각해볼 것
1. 현재 실행되고 있는 파일명을 출력하라.
2. 사용자의 IP를 출력하라.
댓글 13
-
yjae
2003.04.11 07:23
-
행복한고니
2003.04.11 11:35
네. ^^;; (틀렸으면 설명이라도 하겠지만 맞는 말이라 더 할말이 없다는...) -
yjae
2003.04.12 00:00
^^;;;
제가 아직 Predefined variables ($_xxx) 변수들은 한번도 사용해보지 않아서 신기하네요 =_=
그럼 위 예제에서 $_GET[num] 은 $num 과 똑같은 value 를 가지고 있는거네요. 그러면 프로그래머들의 귀찮니즘과 모순 되지 않을까요. ^^;;;
(쉽게 말해서 귀찮게 왜 $_get[num] 을 쓰는 걸까요 어차피 $num 이 더 쓰기 편할텐데. 단지 global variable 로 안 만들어 줘도 된다는 이유로...?)
죄송합니다. :) 새로운걸 접해보니 신기해서요. 좋은 말씀 부탁 드릴께요 ^^; -
TheMics
2003.04.12 20:28
$_SERVER = $HTTP_SERVER_VARS
$_COOKIE = $HTTP_COOKIE_VARS
등등 축약형이지요..3.x에서는 동작하지 않는걸로 알고있습니다^^ -
TheMics
2003.04.12 20:32
yjae//$_GET을 쓰는 이유는 몇가지가 있습니다.
첫째는 보안상 안전하다고 하는데, 저는 체감해보지 못했습니다.
두면째는 php.ini의 gpc_order 때문인데, 기본적으로 get변수 -> post변수 ->쿠키변수 순으로 불러오도록 되어 있습니다. 즉, get변수와 post변수가 중첩되는 부분이 있으면 먼저 get변수를 읽고 다음으로 post변수를 읽기때문에 최종적으로 post변수가 읽혀진다는 것이죠. 쿠키의 경우에도 그렇습니다. 프로그래밍하는 도중에 자신이 만든 쿠키의 이름과 폼의 이름이 같은경우도 발생할 수 있기 때문에 $_GET를 추천하는 겁니다. -
yjae
2003.04.14 11:30
아 감사합니다. :)
삼천포로 빠지는 것 같아서 이런 질문 드리기 뭣 하지만,
get 과 post 변수들이 동시에 전달 될 수 있나요? -
행복한고니
2003.04.15 03:07
네, 같이 전달됩니다.
아래 소스를 test.php 란 이름으로 저장하고 실행해보시면 감이 오실겁니다.
<?php
echo $_GET[name];
echo $_POST[test];
?>
<html>
<form action="test.php?name=1234" method=POST>
<input type=text name=test value=abcdef>
<input type=submit>
</form>
</html> -
yjae
2003.04.15 21:34
아... form 주소에다가 그냥 써버리는...;;; 하하... ^^; (무안-_-) -
☆꼬맹냥、
2003.04.16 02:13
좋은강좌네요~~☆
푸힛⌒-⌒ㅎ+ -
River
2003.05.12 08:40
질문이 있습니다. 메뉴얼에서
$foo = 1 + "10.5"; // $foo 는 double형 (11.5)
$foo = 1 + "-1.3e3"; // $foo 는 double형 (-1299)
$foo = 1 + "bob-1.3e3"; // $foo 는 정수형 (1)
$foo = 1 + "bob3"; // $foo 는 정수형 (1)
$foo = 1 + "10 Small Pigs"; // $foo 는 정수형 (11)
$foo = 1 + "10 Little Piggies"; // $foo 는 정수형 (11)
$foo = "10.0 pigs " + 1; // $foo 는 정수형 (11)
$foo = "10.0 pigs " + 1.0; // $foo 는 double형 (11)
라는 부분이 있는데 두번째 예로 $foo = 1 + "-1.3e3"; // $foo 는 double형 (-1299)
에 대해서 설명을 좀 부탁드립니다. -
행복한고니
2003.05.13 02:32
River//
double 형에 대한 고민은 길게 안하셔도 됩니다. PHP에서의 double = float 즉 실수형이라는 말과 같습니다. 그런데 double 형이라고 하는데는 다음과 같은 이유가 있습니다.
integer 형을 표현하기 위해 사용하는 메모리의 크기는 4byte 입니다. 4byte에는 8bit(1byte=8bit) * 4 = 32bit 가 있고 32비트로 표현할 수 있는 최대의 숫자는 2의 32제곱 = 4294967296 가 됩니다. 저것은 unsigned(부호없음) 일 경우이고, 보통의 경우에는 2147483648 에서 -2147483647 까지 표현가능합니다.
그럼 왜 float 형을 double 형이라고 그러느냐?
그것은 float 형은 정수형의 두배 즉, 8byte의 크기를 사용하기 때문입니다. 다만, 이 형태는 소숫점 이하에 대한 정보도 포함해야하기때문에 {±1.7x10의 -308제곱 ~±1.7x10의 308제곱} 까지의 수를 표현할 수 있습니다.
단, C언어의 float 과 double 는 완전히 다른 형태이니 행여 나중에 공부하실 일이 있으시면 제대로 알고 넘어가시기 바랍니다. -
강희중
2003.08.10 21:32
3강 까지는 아주 쉽게 잘 이해가 가는데 이번 4강부터 첫 개념조차 이해하기 힘드네요 ㅡㅡ;
쿨럭;;
"
예를 들어, test.php?name=행복한고니 라고 URL을 입력하면...
<?php echo $name ?>
과 같이 간단하게 받아올 수 있으니까요... 그렇지만 이 경우 보안상에는 꽤 문제가 될 수도 있습니다."
이부분 부터 영.. 처음 하는거라 뭔 소린지를 모르겠네요; 이해를 도와줄 세부 설명 부탁합니다 -
나르미스
2004.03.10 07:05
test.php?name=행복한고니
라고 입력하면
test.php 에서 따로 $test 를 지정해주지않아도 기본적으로 "행복한고니" 라는 데이터가 저장되어있다는 예기지요.
물론 register_globals 라는 옵션이 켜져있을때만;
제목 | 글쓴이 | 날짜 |
---|---|---|
군대간 친구 남은날짜 계산하기 [6] | xacdo | 2003.04.27 |
유용한 일반 함수 모음;ㅁ; [11] | TheMics | 2003.04.23 |
노프레임+프레임없이 접근막기+게시물 링크하기 [3] | teslaMINT | 2003.04.20 |
PHP 혼자 공부하기 - 12 :: SQL문 [6] | 행복한고니 | 2003.04.20 |
데이터베이스, PHP를 만나면「알짜 사이트로 부활!」 [1] | .maya | 2003.04.18 |
[mics'php] 2. PHP 사용 시스템 구축하기 [3] | TheMics | 2003.04.17 |
[mics'php] 1. PHP란? [8] | TheMics | 2003.04.16 |
PHP 혼자 공부하기 - 11 :: 정규식 실전예제 [9] | 행복한고니 | 2003.04.16 |
PHP 혼자 공부하기 - 10 :: 정규식 패턴 문법 [3] | 행복한고니 | 2003.04.15 |
PHP 혼자 공부하기 - 9 :: 정규식 함수 [3] | 행복한고니 | 2003.04.14 |
PHP 혼자 공부하기 - 8 :: 시간다루기 [18] | 행복한고니 | 2003.04.13 |
PHP 혼자 공부하기 - 7 :: 제어문과 함수 [7] | 행복한고니 | 2003.04.12 |
[mics'php] 들어가기 전에 [1] | TheMics | 2003.04.11 |
PHP 혼자 공부하기 - 6 :: 연산자 [7] | 행복한고니 | 2003.04.11 |
PHP 혼자 공부하기 - 5 :: 변수 [4] | 행복한고니 | 2003.04.10 |
PHP 혼자 공부하기 - 4 :: 미리 정의된 변수 [13] | 행복한고니 | 2003.04.09 |
PHP 혼자 공부하기 - 3 :: 변수형 [8] | 행복한고니 | 2003.04.09 |
PHP 혼자 공부하기 - 2 :: PHP의 시작 [9] | 행복한고니 | 2003.04.09 |
PHP 혼자 공부하기 - 1 :: 준비물 [3] | 행복한고니 | 2003.04.09 |
개판 오분전 세션 - 7 [10] | 미친개 | 2003.04.08 |
만약 test.php?num=1234 로 가는 경우 다음 test.php 에서는 $_GET[num] 에 1234가 저장 되나요?