문제

나 php 파일 내가 사용하는 것으로 독점적으로 포함한다.따라서 나는 오류를 실행하는 대신 액세스할 때 직접 입력하여 URL 을 대신되고 포함됩니다.

기본적으로 필요하에서 다음과 같이 php file:

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입니다.

최고의 방법으로 직접 액세스를 방지하기 위해 파일을 외부 웹 서버의 문서 root(일반적으로,하나의 수준).할 수 있습니다 여전히 그들을 포함하지만,의 가능성은 없에 액세스하는 사람들을 통해 http 요청을 합니다.

나는 일반적으로 가는 모든 방법 및 장소 모두의 내 PHP 파일을 외부의 문서 root 이외에도 트랩 파일 -독 index.php 에서 문서 root 로 시작하는 라우 전체 웹사이트/응용 프로그램입니다.

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

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

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는 실행을 중단합니다.


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

비 정통 코딩 컨벤션을 실례합니다. 모든 피드백에 감사드립니다.

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

  • Webroot 외부 또는 웹 서버의 액세스 거부 디렉토리에 문서를 넣고
  • 숨겨진 문서가 확인한 가시 문서에서 정의를 사용하십시오.
      if (!defined(INCL_FILE_FOO)) {
          header('HTTP/1.0 403 Forbidden');
          exit;
      }

이런 식으로 파일이 어떻게 든 잘못 배치되면 (잘못된 FTP 조작) 여전히 보호됩니다.

나는이 문제가 한 번만 해결되었고 다음과 같이 해결했다.

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

그러나 이상적인 솔루션은 다른 ANWSER에 언급 된 것처럼 파일을 웹 서버 문서 루트 외부에 배치하는 것입니다.

하나의 입구가있는 응용 프로그램을 구축하는 것이 좋습니다. 즉, 모든 파일에 도달해야합니다. index.php

이것을 index.php에 배치하십시오

define(A,true);

이 수표는 각 링크 된 파일에서 실행되어야합니다 (요구 또는 포함을 통해)

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

가장 쉬운 방법은 호출이 포함 된 파일의 일부 변수를 다음과 같이 설정하는 것입니다.

$including = true;

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

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

무슨 요 Does는 루트 파일에서 상수를 정의하고 포함 된 파일에 동일하게 정의되어 있는지 확인합니다.

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

그렇지 않으면

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

또는 폴더 포함 폴더 내에 .htaccess 파일을 배치하고 직접 액세스를 방지 할 수 있습니다.

debug_backtrace() || die ("Direct access not permitted");

나는 접근을 제한하고 싶었다 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;
    }
}

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

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

Pub/ AS 문서 루트를 사용하도록 웹 서버를 설정합니다. 이는 스크립트에 대한 더 나은 보호 기능을 제공합니다. 필요한 구성 요소를로드하기 위해 문서 루트에서 연락 할 수 있지만 인터넷에서 구성 요소에 액세스하는 것은 불가능합니다. 보안 외에 또 다른 이점은 모든 것이 한 곳에 있다는 것입니다.

이 설정은 "액세스 허용되지 않음"메시지가 공격자에 대한 단서이며, 화이트리스트 기반이 아니기 때문에 .htaccess 구성보다 낫기 때문에이 설정은 모든 단일 파일에서 확인을 작성하는 것보다 낫습니다. lib/, conf/ 등에는 보이지 않습니다.

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

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

get_included_files () 포함 된 모든 파일의 이름이 포함 된 인덱스 배열 (파일이 실행 된 경우 포함 된 경우 이름이 포함되어 있고 해당 이름이 배열에 있습니다). 따라서 파일에 직접 액세스 할 때 해당 이름은 배열에서 첫 번째 이름이며 배열의 다른 모든 파일이 포함되었습니다.

<?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
?>

다음 코드는 Flatnux CMS에 사용됩니다 (http://flatnux.altervista.org):

if ( strpos(strtolower($_SERVER['SCRIPT_NAME']),strtolower(basename(__FILE__))) )
{
    header("Location: ../../index.php");
    die("...");
}

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 모드에서는 작동하지 않습니다.

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

내 대답은 접근 방식이 다소 다르지만 여기에 제공된 많은 답변이 포함되어 있습니다. 다수의 접근 방식을 추천합니다.

  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 framework)와 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();

다음과 같은 일을하십시오 :

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

아래에 다음 방법을 사용할 수 있지만 결함이있을 수 있습니다. 결함이있을 수 있습니다. 다른 코드 라인을 추가하여 JavaScript를 사용하여 서버에서만 제공되도록 다른 코드 줄을 추가 할 수있는 경우를 제외하고는 가짜가 될 수 있습니다. 이 코드를 HTML 코드의 본문 섹션에 배치 할 수 있으므로 오류가 표시됩니다.

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

다른 HTML 코드를 여기에 배치하십시오

<? } ?>

이렇게 끝내십시오. 따라서 오류의 출력은 항상 신체 섹션 내에 표시됩니다.

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

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

글쎄, 당신은 또한 cpanel 등을 통해 항상 파일에 액세스 할 수 있기 때문에 해당 파일에 정상적으로 액세스 할 필요가 없다고 생각되는 경우 위에서 제공 한 솔루션을 사용할 수도 있습니다.

도움이 되었기를 바랍니다

가장 쉬운 방법은 웹 디렉토리 외부에 포함 된 내용을 저장하는 것입니다. 그렇게하면 서버가 액세스 할 수 있지만 외부 기계는 없습니다. 유일한 아래쪽은 서버 의이 부분에 액세스 할 수 있어야한다는 것입니다. 상승 여부는 설정, 구성 또는 추가 코드/서버 응력이 필요하지 않다는 것입니다.

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

.htaccess로 제안을 찾지 못했습니다. 사용자가 액세스 할 수 있도록 해당 폴더의 다른 컨텐츠를 차단할 수 있기 때문에 이것이 내 해결책입니다.

$currentFileInfo = pathinfo(__FILE__);
$requestInfo = pathinfo($_SERVER['REQUEST_URI']);
if($currentFileInfo['basename'] == $requestInfo['basename']){
    // direct access to file
}
if ( ! defined('BASEPATH')) exit('No direct script access allowed');

will do the job smooth

You can use phpMyAdmin Style:

/**
 * block attempts to directly run this script
 */
if (getcwd() == dirname(__FILE__)) {
    die('Attack stopped');
}

this is what google uses in their php examples see here

if (php_sapi_name() != 'cli') {
  throw new \Exception('This application must be run on the command line.');
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top