Skip to Content
Go Back
안형우

안녕하세요. 14년차 풀스택 웹개발자 안형우입니다. 이 블로그에서는 WordPress, PHP, CSS, 사용성, 리눅스 서버 등 풀스택 웹개발에서 마주하는 다양한 문제 상황과 해결책, 필요한 개념들을 다룹니다. 👉 소개


작업물

📌 워드프레스, 답답한 빌더와 플러그인 대신 시원하게 커스터마징하기(강의) 2023-01-15
📌 아무도 말하지 않는 PHP의 좋은 점 2018-10-13
📌 유지보수하기 쉬운 CSS 전략(슬라이드) 2016-12-20
📌 워드프레스 테마에서 템플릿 파일 매칭 순서 2013-05-12
📌 [번역] CSS 코드 냄새 2013-01-01

PHP 버그? 세션 변수 값을 일반 변수가 덮어 쓰는 문제 – 아마 register_globals 때문인 듯

△ PHP, 느슨해서 배우기 쉽지만 그만큼 제멋대로 작동하는 경우도 종종 있는 것 같다.

오늘 어이없는 현상을 발견했다. 환경은 PHP 5.2.8 이었고, register_globals = On 이었다.

register_globals = Off인 경우에는 이런 문제가 발생하지 않는 듯하다.

오늘 사용자 정보를 세션에 저장했다가 마지막 페이지에 가서 뿌려주는 페이지를 구현하고 있었다.

session_start();
echo '<pre>';
$_SESSION['foo'] = '세션 푸';
$foo = '그냥 푸';
echo "세션 푸를 찍어 보자 : ".$_SESSION['foo'];
echo "\n";
echo "그냥 푸를 찍어 보자 : ".$foo;
echo "\n";
echo '</pre>';

위 예제를 보면 좀 도움이 될 것이라고 본다.

어떤 결과가 나올 거라고 예상하는가? 당연히 아래와 같은 결과가 논리적이다.

세션 푸를 찍어 보자 : 세션 푸
그냥 푸를 찍어 보자 : 그냥 푸

세션에 처음 변수를 할당했을 때의 화면은 위와 같이 정상적으로 나온다.

그런데 F5를 누른다면? 아래와 같이 나온다.

세션 푸를 찍어 보자 : 그냥 푸
그냥 푸를 찍어 보자 : 그냥 푸

즉, 그냥 변수의 내용이 세션 변수를 덮어 써버리는 것이었다.

완전 황당 그 자체였다.

이걸 깨닫지 못했기 때문에, 나는 대체 어디서 정보가 유실된 거야 하면서 한참을 찾아야 했다.

게다가 나의 로컬 테스트 환경은 register_globals = Off였기 때문에, 로컬에서 모든 테스트를 마치고 서버에 파일을 올렸다가 낭패를 봐야 했다.

이건 도대체 뭔 문제 때문인지 설명 가능하신 분 없는지 궁금하다.

여튼간에 register_globals = On 인 경우 SESSION 변수를 사용할 때 주의하자. SESSION 변수와 이름이 같은 변수명을 사용하면 SESSION 정보가 날아가 버릴 수도 있다. 심지어 환경에 따라서 선택적으로 말이다.

안녕하세요. 14년차 풀스택 웹개발자 안형우입니다. 이 블로그에서는 WordPress, PHP, CSS, 사용성, 리눅스 서버 등 풀스택 웹개발에서 마주하는 다양한 문제 상황과 해결책, 필요한 개념들을 다룹니다. 👉 소개


작업물

댓글 (2개)

    • 그냥 php.ini에서 register_globals를 On으로 설정해 보시고 세션에 값을 넣은 다음 일반 변수를 같은 이름으로 지어서 값을 할당하고 출력해 보시면 됩니다.
      코드가 일으키는 문제라기보다는 설정이 일으키는 문제니까요.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다