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


166

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

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

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

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


10
die () 대신 'header ( "HTTP / 1.1 404 File Not Found", 404)를 테스트해야합니다. 출구;'. 이것은 (적어도 아파치에서) 서버가 정상적인 404 페이지를 반환하게합니다.
gnud

다음은 PHP 포함 파일에서 직접 액세스를 비활성화하는 두 가지 쉬운 방법입니다.- codespeedy.com
disable

답변:


173

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

Deny from all

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


1
감사합니다.이 응용 프로그램을 실행하는 서버를 완전히 제어 할 수 있기 때문에 이것이 내가 함께 한 대답입니다.
Alterlife

24
서버를 완전히 제어 할 수있는 경우 구성을 디렉토리 지정 문에 가상 호스트 구성 파일에 넣으면 더 좋습니다. 아파치는 시작할 때 한 번만 읽고, .htaccess는 모든 액세스에서 읽고 서버 속도를 늦 춥니 다
Eineki

22
이 답변의 일부로 예제 .htaccess 파일이 있으면 좋을 것입니다.
Graham Lea

7
<Files ~ "\.inc$"> Order Allow,Deny Deny from All </Files>
Dracorat

11
@James : 또한, 모든 사람들이 Stack Overflow가 "plz send teh codez"사이트 여야한다고 생각하지는 않습니다. 질문에 명확하게 대답하면 좋은 대답입니다. 필요하지 않은 예제를 제공하면 복사하여 붙여 넣기 코딩 만 권장됩니다.

188

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

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

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

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

3
더 빨리 타이핑하는 법을 배워야합니다. 이것은 변수를 사용하여 확인하는 방법보다 안전하기 때문에 제안하는 것과 같은 방법입니다. 일부 PHP 설정에서는 변수를 무시할 수 있습니다.
마크 데이비슨

3
이것이 몇 가지 '주류'응용 프로그램이 처리하는 방식입니다. Joomla가 이런 식으로 작동한다는 것을 알고 Wiki, Wordpress 및 기타 사람들도 생각합니다.
UnkwnTech

1
메시지가 해커에게 너무 도움이 될 수 있습니다 (실제 사용자는 이러한 페이지를 찾지 못할 것입니다). 리디렉션 헤더를 보내고 PHP 처리를 중지 할 수 있습니다.
bandi

7
404 헤더를 보내고 종료하면 오류 페이지가 일반 404 페이지와 동일하게 보입니다 (적어도 Apache에서는).
gnud

4
@ Smile.Hunter : 포함 / 라이브러리 스크립트 파일을 직접 볼 수있는 액세스를 차단하는 것입니다. 이들이 somefile.php서버에서 작성 하고 정의를 추가 한 경우 여전히 포함 파일에 직접 액세스 할 수 없습니다. 라이브러리 파일을 "포함"할 수는 있지만 서버에서 파일을 작성하고 정의 / 포함 스크립트를 알기에 충분할 경우 정의를 사용하여 자신의 파일을 작성하지 못하게하는 다른 문제가 있습니다. .
제임스

114

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

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

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


12
그것은 실제로 포함 된 파일 수를 확인하는 아이디어의 지옥입니다. 정의를 사용 하거나이 방법을 사용하는 것이 더 낫습니다. 이것은 더 독립적 인 것 같습니다.
Akoi Meexx

나는 처음으로 누군가 이것을 생각해 냈습니다. 나는 그 자체가 가능한 한 포함되어있는 것처럼 보이기 때문에 왜 그런지 모르겠습니다. (일정한 상수 또는 .htaccess에 의해 금지 된 특정 위치). 아름다운.
Jimbo Jonny

이것은 .htaccess를 사용하여 모든 .php 파일을 차단하기 때문에 항상 가능하지는 않습니다. 동일한 디렉토리에 직접 또는 심지어 자바 스크립트로 호출 해야하는 파일이있을 수 있기 때문입니다. 이 좋은 아이디어에 감사드립니다!
Anuj

3
이것은 PHP5 이상에서만 작동합니다. Pre-PHP5 1 대신에 0을 다시 비교하고 싶습니다.
jmucchiello

이것은 정말 영리한 솔루션이며 직접 액세스를 제어하고 차단하는 것이 아니라 내가 좋아하는 것입니다. 나는 보통 파일 자체에 단위 테스트를 포함시키고, 이런 식으로 단위 테스트를이 if 문으로 묶을 수있다. 그것이 얼마나 효율적인지 궁금합니다 ..
whiteatom

34

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

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


3
이것이 가능하다면 훌륭한 솔루션입니다. 나는 최근에 공유 웹 호스트와 작업을 시작해야했으며 모든 것이 docroot 안에 있어야한다는 많은 성가심 중 하나를 발견했습니다.
Beau Simensen

3
내가 일했던 모든 호스팅 제공 업체에서 항상 문서 루트보다 한 수준 높은 (정확하게) 액세스 할 수있었습니다.
Eran Galperin

3
현재 호스트를 포함하여 일부 호스트에서는 도메인을 원하는 폴더로 지정할 수 있습니다.
Dinah

1
preg_match 사용-> if (preg_match ( "~ globalfile \ .php ~ i", $ _SERVER [ 'PHP_SELF'])) {die ( '<h3 style = "color : red"> 어플라이언스 보안 경고-직접 액세스가 허용되지 않습니다! IP가 기록되었습니다! <h3> '); // 추가 실행 중지}
MarcoZen

그 URL devzone.zend.com/node/view/id/70 은 현재 404입니다. 답변에는 존재하지 않는 URL에서 원래 사용 된 코드가 포함되어야합니다.
Funk Forty Niner

31

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 서버가 해당 파일에 액세스 할 수 있고 핫 링크는 사용자에게 거부됩니다.
  • 웹 서버의 파일 시스템 액세스 구성이 제대로 수행되지 않은 경우에도이 방법은 해당 파일이 실수로 공개되는 것을 방지합니다.

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


나는 숫자 2를 좋아한다
Baim Wrong

26

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

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

내가 믿는 .inc.php를 사용하는 것이 더 좋을 것입니다. 일반적인 관행입니다
Lis

14

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

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

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


8

나는이 문제를 한 번 겪었다.

if (strpos($_SERVER['REQUEST_URI'], basename(__FILE__)) !== false) ...

그러나 이상적인 해결책은 다른 답변에서 언급 한 것처럼 파일을 웹 서버 문서 루트 외부에 배치하는 것입니다.


7

하나의 진입 점으로 응용 프로그램을 빌드하는 것이 좋습니다. 즉 모든 파일은 index.php에서 도달해야합니다.

이것을 index.php에 넣으십시오.

define(A,true);

이 검사는 링크 된 각 파일에서 실행해야합니다 (필수 또는 포함을 통해).

defined('A') or die(header('HTTP/1.0 403 Forbidden'));

7

PHP 파일 에 대한 액세스를 직접 제한하고 싶지만을 통해 파일을 호출 할 수도 있습니다 jQuery $.ajax (XMLHttpRequest). 여기 나를 위해 일한 것이 있습니다.

if (empty($_SERVER["HTTP_X_REQUESTED_WITH"]) && $_SERVER["HTTP_X_REQUESTED_WITH"] != "XMLHttpRequest") {
    if (realpath($_SERVER["SCRIPT_FILENAME"]) == __FILE__) { // direct access denied
        header("Location: /403");
        exit;
    }
}

3

가장 쉬운 방법은 호출에 포함하는 파일에 일부 변수를 설정하는 것입니다.

$including = true;

그런 다음 포함되는 파일에서 변수를 확인하십시오.

if (!$including) exit("direct access not permitted");

2
register_globals가 켜져 있으면 위험합니다.
jmucchiello

25
register_globals가 켜져 있으면 PHP 는 위험합니다.
David Precious

3

.htaccess 방법 외에도 다양한 프레임 워크 (예 : 루비 온 레일)에서 유용한 패턴을 보았습니다. 응용 프로그램 루트 디렉토리에는 별도의 pub / 디렉토리가 있으며 라이브러리 디렉토리는 pub / 와 동일한 레벨의 디렉토리에 있습니다. 이와 같은 것 (이상적이지는 않지만 아이디어를 얻음) :

app/
 |
 +--pub/
 |
 +--lib/
 |
 +--conf/
 |
 +--models/
 |
 +--views/
 |
 +--controllers/

pub /를 문서 루트로 사용하도록 웹 서버를 설정했습니다. 이를 통해 스크립트를보다 효과적으로 보호 할 수 있습니다. 스크립트는 문서 루트에서 접근하여 필요한 구성 요소를로드 할 수 있지만 인터넷에서 구성 요소에 액세스하는 것은 불가능합니다. 보안 외에 다른 이점은 모든 것이 한 곳에 있다는 것입니다.

이 설정은 "access not allowed"메시지가 공격자에게 실마리가되기 때문에 포함 된 모든 단일 파일에서 검사를 만드는 것보다 낫고, 화이트리스트 기반이 아니기 때문에 .htaccess 구성보다 낫습니다. lib /, conf / 등 디렉토리에는 보이지 않습니다.


오랜 시간이 지난 후에 위에서 설명한 모델이 MVC (Model-View-Controller) 모델이라고 언급하고 싶습니다. 원하는 경우 Google을 확인하고 답변에 정보를 추가하십시오. 또한 MVC는 Ruby on Rails 및 ASP.NET 애플리케이션뿐만 아니라 PHP도 지원합니다 (Lavarel, CakePHP 참조).

3

무슨 줌라! 루트 파일에 상수를 정의하고 포함 된 파일에 상수가 정의되어 있는지 확인합니다.

defined('_JEXEC') or die('Restricted access');

그렇지 않으면

CodeIgniter와 같은 대부분의 프레임 워크에서 권장하는 것처럼 웹 루트 디렉토리 외부에 파일을 배치하여 모든 파일을 http 요청의 범위 밖에 유지할 수 있습니다.

또는 include 폴더 내에 .htaccess 파일을 넣고 규칙을 작성하여 직접 액세스하지 못하게 할 수 있습니다.



3

내 답변은 접근 방식이 다소 다르지만 여기에 제공된 많은 답변이 포함되어 있습니다. 여러 가지 방법을 권장합니다.

  1. .htaccess 및 Apache 제한 사항
  2. defined('_SOMECONSTANT') or die('Hackers! Be gone!');

그러나이defined or die 접근 방식은 실패의 번호가 있습니다. 첫째, 테스트하고 디버깅하는 것은 가정에서 큰 고통입니다. 둘째, 마음이 바뀌면 끔찍하고 정신없이 지루한 리팩토링이 필요합니다. "찾기 및 교체!" 당신은 말합니다. 예, 그러나 그것이 정확히 어디에서나 똑같이 쓰여 졌음을 확신합니까? 이제 수천 개의 파일로 곱하십시오 ... oO

그리고 .htaccess가 있습니다. 관리자가 그렇게 신중하지 않은 사이트에 코드를 배포하면 어떻게됩니까? 파일을 보호하기 위해 .htaccess에만 의존하는 경우 a) 백업, b) 눈물을 말릴 수있는 티슈 상자, c) 사람들로부터 모든 혐오에 화염을내는 소화기 코드를 사용하여.

그래서 질문이 "가장 쉬운"을 요구한다는 것을 알고 있지만, 이것이 요구하는 것은 더 "방어적인 코딩"이라고 생각합니다.

내가 제안하는 것은 :

  1. 스크립트의 전 require('ifyoulieyougonnadie.php');( 하지 include() 및 대체 등 defined or die)
  2. 에서 ifyoulieyougonnadie.php논리 상수를 수행하고 다른 상수를 확인하고 스크립트 호출, 로컬 호스트 테스트 등을 수행 한 다음을 구현하십시오 die(), throw new Exception, 403.

    기본 index.php (Joomla 프레임 워크)와 ajaxrouter.php (내 프레임 워크)의 두 가지 가능한 진입 점이있는 자체 프레임 워크를 만들고 있으므로 진입 지점에 따라 다른 사항을 확인합니다. 이 ifyoulieyougonnadie.php두 파일 중 하나에서 요청 이 없으면, shenanigans가 수행되고 있음을 알고 있습니다!

    그러나 새로운 진입 점을 추가하면 어떻게됩니까? 걱정 마. 난 그냥 변경ifyoulieyougonnadie.php 하고 정렬했으며 '찾기 및 바꾸기'가 없습니다. 만세!

    동일한 상수를 갖지 않는 다른 프레임 워크를 수행하기 위해 일부 스크립트를 이동하기로 결정하면 defined()어떻게됩니까? ... 만세! ^ _ ^

나는이 전략이 개발을 훨씬 더 재미 있고 덜 만든다는 것을 발견했다.

/**
 * Hmmm... why is my netbeans debugger only showing a blank white page 
 * for this script (that is being tested outside the framework)?
 * Later... I just don't understand why my code is not working...
 * Much later... There are no error messages or anything! 
 * Why is it not working!?!
 * I HATE PHP!!!
 * 
 * Scroll back to the top of my 100s of lines of code...
 * U_U
 *
 * Sorry PHP. I didn't mean what I said. I was just upset.
 */

 // defined('_JEXEC') or die();

 class perfectlyWorkingCode {}

 perfectlyWorkingCode::nowDoingStuffBecauseIRememberedToCommentOutTheDie();

2

보다 정확하게는이 조건을 사용해야합니다.

if (array_search(__FILE__, get_included_files()) === 0) {
    echo 'direct access';
}
else {
    echo 'included';
}

get_included_files () 는 포함 된 모든 파일의 이름을 포함하는 색인 ​​배열을 리턴합니다 (파일이 실행 된 경우 파일이 포함되었고 해당 이름이 배열에 있음). 따라서 파일에 직접 액세스하면 파일 이름이 배열에서 첫 번째가되고 배열의 다른 모든 파일이 포함됩니다.


1
<?php
if (eregi("YOUR_INCLUDED_PHP_FILE_NAME", $_SERVER['PHP_SELF'])) { 
 die("<h4>You don't have right permission to access this file directly.</h4>");
}
?>

포함 된 PHP 파일의 상단에 위의 코드를 배치하십시오.

전의:

<?php
if (eregi("some_functions.php", $_SERVER['PHP_SELF'])) {
    die("<h4>You don't have right permission to access this file directly.</h4>");
}

    // do something
?>

if (preg_match ( "~ globalfile \ .php ~ i", $ _SERVER [ 'PHP_SELF'])) {die ( '<h3 style = "color : red"> 기기 보안 경고-직접 액세스가 허용되지 않습니다! IP가 기록되었습니다 ! <h3> '); // 추가 실행 중지} whre ~가 구분 기호
MarcoZen


1

http와 cli 모두에서 작동하는이 PHP 전용 및 가변 솔루션을 찾았습니다.

함수를 정의하십시오.

function forbidDirectAccess($file) {
    $self = getcwd()."/".trim($_SERVER["PHP_SELF"], "/");
    (substr_compare($file, $self, -strlen($self)) != 0) or die('Restricted access');
}

직접 액세스하지 못하게하려는 파일의 함수를 호출하십시오.

forbidDirectAccess(__FILE__);

이 질문에 대해 위에서 제공된 대부분의 솔루션은 Cli 모드에서 작동하지 않습니다.


CLI 모드에서 URL을 입력 해야하는 곳은 어디입니까?
당신의 상식

그것은 cli 모드에서 PHP 스크립트 / inlude가 시작되는 것을 막기위한 것입니다. 여러 개발자가있는 프로젝트에서 유용 할 수 있습니다.
카.

1
if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)) { die('Access denied'); };

1
<?php       
$url = 'http://' . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];
  if (false !== strpos($url,'.php')) {
      die ("Direct access not premitted");
  }
?>

1

포함 파일을 웹 액세스 가능 디렉토리 외부에 저장하는 것은 몇 번 언급되었으며, 가능한 경우 좋은 전략입니다. 그러나 아직 언급하지 않은 다른 옵션은 포함 파일에 실행 가능한 코드가 포함되어 있지 않은지 확인하십시오 . 포함 파일이 단순히 함수와 클래스를 정의하고 그 이외의 코드가없는 경우 직접 액세스 할 때 빈 페이지가 생성됩니다.

항상 브라우저에서이 파일에 직접 액세스 할 수 있습니다. 아무것도하지 않습니다 . 일부 함수를 정의하지만 그 중 어느 것도 호출되지 않으므로 실행되지 않습니다.

<?php

function a() {
    // function body
}

function b() {
    // function body
}

PHP 클래스 만 포함하고 다른 것은없는 파일에도 동일하게 적용됩니다.


가능한 경우 파일을 웹 디렉토리 외부에 유지하는 것이 좋습니다.

  • 실수로 PHP를 비활성화 할 수 있습니다.이 경우 서버가 PHP를 실행하고 결과를 보내는 대신 PHP 파일의 내용을 브라우저로 보낼 수 있습니다. 이로 인해 코드 (데이터베이스 비밀번호, API 키 등)가 유출 될 수 있습니다.
  • 웹 디렉토리의 파일이 앱에 사용하려는 URL에 쪼그리고 앉습니다. system코드라는 경로와 충돌하기 때문에 이라는 페이지를 가질 수없는 CMS를 사용합니다. 나는이 성가신 것을 발견한다.

0

다음과 같은 작업을 수행하십시오.

<?php
if ($_SERVER['SCRIPT_FILENAME'] == '<path to php include file>') {
    header('HTTP/1.0 403 Forbidden');
    exit('Forbidden');
}
?>

브라우저에로드되는 것을 막을 수는 없습니다.
UnkwnTech

0

Javascript를 사용하여 서버에서만 요청을 가져 오는 다른 코드 줄을 추가 할 수있는 경우를 제외하고는 위조 될 수 있기 때문에 아래 방법에 결함이 있지만 아래 방법을 사용할 수 있습니다. 이 코드를 HTML 코드의 본문 섹션에 배치하면 오류가 표시됩니다.

<?
if(!isset($_SERVER['HTTP_REQUEST'])) { include ('error_file.php'); }
else { ?>

다른 HTML 코드를 여기에 넣으십시오

<? } ?>

이렇게 끝내십시오. 그래서 원하는 경우 오류 출력이 항상 본문 섹션에 표시됩니다.


모든 HTTP_ * 서버 헤더를 신뢰할 수 없으므로이 방법을 사용하지 않는 것이 좋습니다.
andreszs

0

$_SERVER보안상의 이유로 사용하지 않는 것이 좋습니다 . 다른 파일이 포함 된 첫 번째 파일
과 같은 변수를 사용할 수 있습니다 $root=true;. 포함되는 두 번째 파일의 시작 부분에
사용 isset($root)하십시오.


0

당신이 할 수있는 일은 디렉토리를 비밀번호로 보호하고 index.php 파일을 제외한 모든 PHP 스크립트를 거기에 보관하는 것입니다. 포함시 비밀번호는 http 액세스에만 필요하므로 필요하지 않습니다. 또한 해당 디렉토리에 액세스 할 수있는 비밀번호가 있으므로 원하는 경우 스크립트에 액세스 할 수있는 옵션도 제공합니다. 디렉토리를위한 .htaccess 파일과 사용자를 인증하기 위해 .htpasswd 파일을 설정해야합니다.

cPanel 등을 통해 파일에 항상 액세스 할 수 있기 때문에 해당 파일에 정상적으로 액세스 할 필요가 없다고 생각 될 경우 위에 제공된 솔루션을 사용할 수도 있습니다.

도움이 되었기를 바랍니다


0

가장 쉬운 방법은 웹 디렉토리 외부에 포함을 저장하는 것입니다. 그렇게하면 서버는 서버에 액세스 할 수 있지만 외부 시스템은 액세스 할 수 없습니다. 유일한 단점은 서버의이 부분에 액세스 할 수 있어야한다는 것입니다. 단점은 설정, 구성 또는 추가 코드 / 서버 스트레스가 필요하지 않다는 것입니다.


0

.htaccess에 대한 제안을 찾지 못했습니다. 사용자가 액세스 할 수있는 폴더의 다른 내용을 차단 할 수 있기 때문에 이것이 내 솔루션입니다.

$currentFileInfo = pathinfo(__FILE__);
$requestInfo = pathinfo($_SERVER['REQUEST_URI']);
if($currentFileInfo['basename'] == $requestInfo['basename']){
    // direct access to file
}

0
if ( ! defined('BASEPATH')) exit('No direct script access allowed');

일을 부드럽게 할 것입니다


2
CodeIgnitor에서 붙여 넣기를 복사하십시오. 그것은 시원하지만 실제로 자체적으로 아무것도하지 않습니다. 는 BASEPATH const A의 설정 index.php트리 구조의 맨 아래에 낳는 파일. CI는 URL을 다시 작성하므로 스크립트에 직접 액세스 할 필요가 없습니다.
jimasun

나는 필요가 없다는 것을 알고 있지만, 누군가가 그렇게하려고 시도한다면
Varshaan

0

이전에 언급 한 PHP 버전 확인 솔루션 :

    $max_includes = version_compare(PHP_VERSION, '5', '<') ? 0 : 1;
    if (count(get_included_files()) <= $max_includes)
    {
        exit('Direct access is not allowed.');
    }

2
이것이 어떻게 직접 액세스를 막을 수 있는지 잘 모르겠습니다
Adam Lindsay
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.