[php] PHP 포함 파일에 직접 액세스 방지

포함으로 독점적으로 사용할 PHP 파일이 있습니다. 따라서 포함되지 않고 URL을 입력하여 직접 액세스 할 때 오류를 실행하는 대신 오류를 발생시키고 싶습니다.

기본적으로 PHP 파일에서 다음과 같이 확인해야합니다.

if ( $REQUEST_URL == $URL_OF_CURRENT_PAGE ) die ("Direct access not premitted");

이 작업을 수행하는 쉬운 방법이 있습니까?



답변

일반적인 “완전히 제어 할 수도 있고 아닐 수도있는 Apache 서버에서 실행되는 일반적인 PHP 앱”의 가장 쉬운 방법은 디렉토리에 포함을 넣고 .htaccess 파일에서 해당 디렉토리에 대한 액세스를 거부하는 것입니다. 사람들이 인터넷 검색 문제를 해결하기 위해 Apache를 사용하는 경우 액세스하지 않으려는 디렉토리의 “.htaccess”라는 파일에 파일을 넣으십시오.

Deny from all

실제로 서버를 완전히 제어 할 수 있다면 (이 답변을 처음 쓸 때보 다 작은 앱에서도 더 일반적입니다) 가장 좋은 방법은 웹 서버가 제공하는 디렉토리 외부에서 보호하려는 파일을 고정하는 것입니다 . 따라서 앱이에있는 경우 /srv/YourApp/서버가 파일을 제공 /srv/YourApp/app/하고 포함을 넣 도록 설정하십시오 /srv/YourApp/includes. 따라서 문자 그대로 액세스 할 수있는 URL이 없습니다.


답변

포함시키고 자하는 페이지에 추가하십시오

<?php
if(!defined('MyConst')) {
   die('Direct access not permitted');
}
?>

그런 다음 포함 된 페이지에서

<?php
define('MyConst', TRUE);
?>


답변

포함 된 경우와 직접 액세스 한 경우 (주로 print()vs return()) 다르게 행동 해야하는 파일이 있습니다. 다음은 수정 된 코드입니다.

if(count(get_included_files()) ==1) exit("Direct access not permitted.");

액세스되는 파일은 항상 포함 된 파일이므로 == 1입니다.  


답변

파일에 직접 액세스하지 못하게하는 가장 좋은 방법은 파일을 웹 서버 문서 루트 외부 (일반적으로 한 수준 위)에 두는 것입니다. 여전히 포함 할 수 있지만 http 요청을 통해 누군가가 액세스 할 가능성은 없습니다.

나는 보통 끝까지 가고 모든 웹 사이트 / 애플리케이션을 라우팅하기 시작하는 문서 루트의 고독한 index.php- 부트 스트랩 파일을 제외하고 모든 PHP 파일을 문서 루트 외부에 배치한다 .


답변

1 : 포함 된 파일 수 확인

if( count(get_included_files()) == ((version_compare(PHP_VERSION, '5.0.0', '>='))?1:0) )
{
    exit('Restricted Access');
}

논리 : 최소 포함 횟수에 맞지 않으면 PHP가 종료됩니다. PHP5 이전에는 기본 페이지가 포함으로 간주되지 않습니다.


2 : 글로벌 상수 정의 및 확인

// In the base page (directly accessed):
define('_DEFVAR', 1);

// In the include files (where direct access isn't permitted):
defined('_DEFVAR') or exit('Restricted Access');

논리: 상수가 정의되어 있지 않으면 기본 페이지에서 실행이 시작되지 않아 PHP 실행이 중지됩니다.

참고 이 크게 변경 하드 코딩 된 모든 단일 파일에있을 필요하지 않으므로 오버 헤드 코딩 줄일이 인증 방법의 모듈을 업그레이드하고 미래의 변화 이식성을 위해서, 대한.

// Put the code in a separate file instead, say 'checkdefined.php':
defined('_DEFVAR') or exit('Restricted Access');

// Replace the same code in the include files with:
require_once('checkdefined.php');

이러한 방법으로 로깅 및 분석 목적과 적절한 응답 생성 위해 추가 코드를 추가 할 수 있습니다 checkdefined.php .

신용이 필요한 신용 : 이식성에 대한 훌륭한 아이디어는 이 답변 에서 비롯되었습니다 .


3 : 원격 주소 인증

// Call the include from the base page(directly accessed):
$includeData = file_get_contents("http://127.0.0.1/component.php?auth=token");

// In the include files (where direct access isn't permitted):
$src = $_SERVER['REMOTE_ADDR']; // Get the source address
$auth = authoriseIP($src); // Authorisation algorithm
if( !$auth ) exit('Restricted Access');

내부 요청과 함께 세션 토큰을 제공하지 않는 한이 방법의 단점은 격리 된 실행입니다. 단일 서버 구성의 경우 루프백 주소 또는 다중 서버 또는로드 밸런스 서버 인프라의 주소 화이트리스트를 통해 확인하십시오.


4 : 토큰 인증

이전 방법과 마찬가지로 GET 또는 POST를 사용하여 포함 파일에 권한 부여 토큰을 전달할 수 있습니다.

if($key!="serv97602"){header("Location: ".$dart);exit();}

올바른 방법으로 사용하면 매우 지저분한 방법이지만 동시에 가장 안전하고 다목적입니다.


5 : 웹 서버 별 구성

대부분의 서버에서는 개별 파일 또는 디렉토리에 대한 권한을 할당 할 수 있습니다. 모든 포함을 이러한 제한된 디렉토리에 배치하고 서버가이를 거부하도록 구성 할 수 있습니다.

예를 들어 APACHE에서 구성은 .htaccess파일에 저장 됩니다. 여기 튜토리얼 .

참고 서로 다른 웹 서버에서 휴대 나쁜 때문에 서버 별 구성 날에 의해 권장하지 않습니다 그러나 것을. 거부 알고리즘이 복잡하거나 거부 된 디렉토리 목록이 다소 큰 콘텐츠 관리 시스템과 같은 경우에는 재구성 세션 만 다소 소중하게 만들 수 있습니다. 결국 코드에서 이것을 처리하는 것이 가장 좋습니다.


6 : 사이트 루트 외부의 보안 디렉토리에 포함

서버 환경에서의 액세스 제한 때문에 파일 시스템에 대한 액세스 권한이있는 경우 다소 강력한 방법이 가장 선호됩니다.

//Your secure dir path based on server file-system
$secure_dir=dirname($_SERVER['DOCUMENT_ROOT']).DIRECTORY_SEPARATOR."secure".DIRECTORY_SEPARATOR;
include($secure_dir."securepage.php");

논리:

  • 사용자는 외부의 파일을 요청할 수 없습니다 htdocs링크가 웹 사이트 주소 시스템의 범위를 벗어나므로 폴더 .
  • PHP 서버는 기본적으로 파일 시스템에 액세스하므로 필요한 권한이있는 일반 프로그램처럼 컴퓨터의 파일에 액세스 할 수 있습니다.
  • 포함 파일을이 디렉토리에두면 PHP 서버가 해당 파일에 액세스 할 수 있고 핫 링크는 사용자에게 거부됩니다.
  • 웹 서버의 파일 시스템 액세스 구성이 제대로 수행되지 않은 경우에도이 방법은 해당 파일이 실수로 공개되는 것을 방지합니다.

정통 코딩 규칙을 실례하겠습니다. 모든 의견을 부탁드립니다.


답변

Chuck 솔루션의 대안 (또는 보완)은 .htaccess 파일에 이와 같은 것을 넣어 특정 패턴과 일치하는 파일에 대한 액세스를 거부하는 것입니다

<FilesMatch "\.(inc)$">
    Order deny,allow
    Deny from all
</FilesMatch>


답변

실제로 내 조언은 이러한 모범 사례를 모두 수행하는 것입니다.

  • 문서를 웹 루트 외부에 두거나 웹 서버가 액세스를 거부 한 디렉토리에 넣습니다.
  • 숨겨진 문서에서 확인할 수있는 정의 된 문서를 다음과 같이 정의하십시오.
      if (!defined(INCL_FILE_FOO)) {
          header('HTTP/1.0 403 Forbidden');
          exit;
      }

이런 식으로 파일이 잘못 배치 된 경우 (잘못된 FTP 작업) 여전히 보호됩니다.