PHP & Others

include 되서 처리되야하는데 그냥 접근할경우 체크

페이지 정보

본문

보통 공통적인 부분을 처리하는 파일들은 인클루드 해서 사용하죠
그러나 직접적으로 브라우져로
http://~~~~~/lib.php 이런식으로 접근할경우
접근 에러 출력이 필요할때가 있어서 머리굴리다가 생각해낸 방법입니다.

물론 define()함수로 체크하면 더 쉽겠죠
그냥 저는 PHP환경값으로 체크해보았습니다.

간단하게 아래 PHP환경값으로 파일이름을 구해서 비교하는 방법입니다

index.php파일에서 lib.php을 include하는경우
__FILE_과 $PHP_SELF를 lib.php에서 사용할때

index.php 에 접근할경우 아래 두 값이 일치하지 않죠
[ __FILE__ ] ~~~~/lib.php
[ $PHP_SELF ] ~~~/index.php

lib.php 에 접근할경우 아래 두 값이 일치하죠
[ __FILE__ ] ~~~/lib.php
[ $PHP_SELF ] ~~/lib.php


바로 이 원리를 이용해서 include되서 처리되나 체크할수 있죠


<?php

preg_match("/([a-zA-Z0-9_.]+)$/", $PHP_SELF, $f1);
preg_match("/([a-zA-Z0-9_.]+)$/", __FILE__, $f2);
if($f1[1] == $f2[1])
{
  echo"잘못된 접근";
  exit;
}

?>

1.

◀--include.php
<?
include'one.php';
?>--▶

◀--one.php
<?
if($PHP_SELF==='/one.php'){exit;}
print'ok';
?>--▶



2.
웹상에서의 루트 디렉토리 보다 상위에 inc 디렉토리를 만들고, safe_mode on 을 주게 되면, include는 그냥 되나, 웹에서의 접근은 아예 접근 자체가 안되게 됩니다. 생각go 보니 safe_mode 까지 줄필요도 없겠군요..
 
인클루드 전용 파일은 .inc 로 하고, 아파치에서 \\.inc$ 를 deny 줘버릴 수도 있지요.


3.
get_included_files() 를 이용하는 방법도 좋습니다

$included = get_included_files();
if (array_search('filename.php',$included) === false) {
//인클루드를 하던가 에러메시지
}




4.
if ($_SERVER["PATH_TRANSLATED"] == realpath(__FILE__))을 사용해서는 아니됩니다. windows에서는 $_SERVER["PATH_TRANSLATED"]은 \\을 \\\\으로 나오는데, $__FILE__은 \\을 \\으로 보입니다 스트립슬래쉬를 넣거나, 사용하지 않아야 할 듯 합니다.
 
$_SERVER["PATH_TRANSLATED"]도 realpath를 걸어주면 되겠군요^^
if (realpath($_SERVER["PATH_TRANSLATED"]) == realpath(__FILE__)) {
echo "직접 호출되어서 거부함";
exit;
}



5.
▶ 단독호출 금지
if (__FILE__== $SCRIPT_FILENAME){ # 단독호출금지
$IP= $_SERVER[REMOTE_ADDR];
echo "해킹은 위법입니다. 접속하신 IP=($IP)";
exit;
}

관련자료

등록된 댓글이 없습니다.
Today's proverb
우리에게 남는 것은 다른 사람에게 준 것뿐이다. (긴스버그)