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;
}

관련자료

댓글 0
등록된 댓글이 없습니다.
Today's proverb
행복해지고 싶다면, 잠시 동안만이라도 가슴에 손을 얹고 생각해 보라. 그러면 진정한 즐거움은, 발치에 돋아나는 잡초나 아침 햇살에 빛나는 꽃의 이술과 같이 우리 주변에 무수히 널려 있다는 것을 알 수 있을 것이다. 《하루 5분 생각이 인생을 결정한다 》 (이범준)