check_write_token함수의 $_REQUEST['token']에 관하여 질문하고자 합니다.
본문
// POST로 넘어온 토큰과 세션에 저장된 토큰 비교
function check_write_token($bo_table)
{
if(!$bo_table)
alert('13올바른 방법으로 이용해 주십시오.', G5_URL);
$token = get_session('ss_write_'.$bo_table.'_token');
set_session('ss_write_'.$bo_table.'_token', '');
if(!$token || !$_REQUEST['token'] || $token != $_REQUEST['token'])
alert('14올바른 방법으로 이용해 주십시오.', G5_URL);
return true;
}
안녕하세요
위의 코드에서
(1)$_REQUEST['token']의
token이 무엇인지요?
(2)변수가 들어가있는게 아니라
왜 $_REQUEST['token'] 이 형태 인지요?
초심자입니다.
쉽게 설명좀 부탁드립니다.
좋은 하루 되세요.
!-->답변 2
PHP 에서는 슈퍼 글로벌 변수라고하여
$_SERVER, $_POST, $_GET, $_FILES, $_REQUEST 등 여러가지 슈퍼 글로벌 변수가 있습니다.
(1)
$_REQUEST 란 $_POST, $_GET을 모두 포함한 슈퍼 글로벌 변수입니다.
예를들어 해당 실행하는 코드의 앞 페이지에서 $_POST로 보내든, $_GET으로 보내든
모두 $_REQUEST 슈퍼글로벌 변수에 해당 값들이 저장됩니다.
이때 checke_write_token() 함수가 실행되기전 $_POST 또는 $_GET 으로 toten 값을 전달 했다는 의미입니다.
따라서 $_REQUEST['token'] 으로 값을 받은 것 입니다.
추가 예로 앞에서 <form>의 GET방식으로
<form method="get">
<input name="test" value="테스트">
</form>
형식으로 값을 넘긴다면 뒤에서는 일반적으로 $_GET['test'] 형식으로 받을수 있지만
$_REQUEST['test'] 로도 받을 수 있습니다.
(2) $_REQUEST['token'] 은 배열이며 보통 배열 변수라고도 부릅니다.
$변수명 = 일반 변수
$배열명['키값'] = 배열 변수
!-->
웹 취약점중인 하나인 세션하이젝킹을 방어를 하려고
토큰의 개념을 사용하고 있습니다.
세션 하이젝킹(Session Hijacking)이란
공격자인 해커가 사이트 이용자의 세션값을 가로채어 그 시스템을 접근하려는 공격입니다.
웹 서버(PHP 로직 부분)에서 토큰을 요청 웹 브라우저에 할당을 합니다. ( 그누보드 $_REQUEST['token'] => 브라우저 사용자 식별용 )
어떠한 특정행위 (게시글 글쓰기.. 웹에서 일어나는 기타 행위들..)를 웹서버로 요청을 할때
브라우저에서 할당 받은 토큰과 웹서버에 있는 토큰과 비교를 합니다. ( $_REQUEST['token']와 세션 토튼 비교)
정말 이 토큰이 요청한 사용자인지 검증하는 단계인거죠..
이게 도입이 되기전까지는 공격자가 게시글을 사용할때 img태크, iframe태그등으로 자신의 레벨을 올리는 링크를 올려서 그 올린글을 웹사이트 관리자가 보았을때 시스템 계정을 탈취를 했습니다.
이러한 행위를 방지하는 차원으로 이해해주시면 되겠습니다.