एक php में सीधे पहुंच को रोकें फ़ाइल शामिल हैं


166

मेरे पास एक php फ़ाइल है जिसे मैं विशेष रूप से शामिल के रूप में उपयोग करूंगा। इसलिए मैं इसे निष्पादित करने के बजाय एक त्रुटि फेंकना चाहूंगा जब इसे शामिल किए जाने के बजाय सीधे URL में टाइप करके एक्सेस किया जाएगा।

मूल रूप से मुझे php फ़ाइल में निम्नानुसार एक चेक करने की आवश्यकता है:

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

क्या इसे करने का कोई आसान तरीका है?


10
मरने के बजाय () आपको हेडर का परीक्षण करना चाहिए ("HTTP / 1.1 404 फ़ाइल नहीं मिला", 404); बाहर जाएं;'। यह (कम से कम अपाचे पर) सर्वर को सामान्य 404 पृष्ठ वापस कर देगा।
ग्नुद

यहाँ दो आसान तरीके दिए गए हैं जिनकी मैंने PHP में प्रत्यक्ष पहुंच को अक्षम करने के लिए फाइलें शामिल की हैं - कोडस्पेडी.com
अहमद

जवाबों:


174

जेनेरिक "PHP ऐप के लिए एक अपाचे सर्वर पर चलने वाला सबसे आसान तरीका है जिसे आप पूरी तरह से नियंत्रित कर सकते हैं या नहीं कर सकते हैं" स्थिति एक निर्देशिका में अपनी निर्देशिका में शामिल करने और उस निर्देशिका तक पहुंचने से इनकार करने की है। Googling की परेशानी से लोगों को बचाने के लिए, यदि आप Apache का उपयोग कर रहे हैं, तो इसे ".htaccess" नामक फ़ाइल में उस निर्देशिका में रखें जिसे आप एक्सेस नहीं करना चाहते हैं:

Deny from all

यदि आपके पास वास्तव में सर्वर का पूर्ण नियंत्रण है (इन दिनों जब मैं पहली बार यह उत्तर लिखता हूं तो बहुत कम ऐप्स के लिए भी अधिक सामान्य), सबसे अच्छा तरीका यह है कि आप उन फ़ाइलों को छड़ी कर सकते हैं जिन्हें आप निर्देशिका के बाहर सुरक्षित करना चाहते हैं जो आपका वेब सर्वर से सेवा कर रहा है। । इसलिए यदि आपका ऐप अंदर है /srv/YourApp/, तो सर्वर को फ़ाइलों से सेवा देने के लिए सेट करें /srv/YourApp/app/और इसमें शामिल करें /srv/YourApp/includes, इसलिए शाब्दिक रूप से कोई भी URL नहीं है जो उन्हें एक्सेस कर सके।


1
धन्यवाद, चूंकि मेरे पास सर्वर पर पूर्ण नियंत्रण है, जहां मैं इस ऐप को चलाता हूं, यही वह उत्तर है जिसके साथ मैं गया था।
एलर्टलाइफ़

24
यदि आपके पास सर्वर का पूर्ण नियंत्रण है तो बेहतर है यदि आप वर्चुअल डायरेक्ट्री फ़ाइल में डायरेक्टरी डायरेक्टिव में कॉन्फिगर करते हैं। अपाचे ने इसे केवल एक बार स्टार्टअप पर पढ़ा, .htaccess को हर एक्सेस पर पढ़ा जाता है और सर्वर को धीमा कर देता है
Eineki

22
इस उत्तर के भाग के रूप में एक .htaccess फ़ाइल का होना अच्छा होगा।
ग्राहम ले

7
<Files ~ "\.inc$"> Order Allow,Deny Deny from All </Files>
द्राकोरत

11
@ नाम: इसके अलावा, हर किसी को नहीं लगता है कि स्टैक ओवरफ्लो "plz send teh codez" साइट होनी चाहिए। यदि यह स्पष्ट रूप से प्रश्न का उत्तर देता है, तो यह एक अच्छा उत्तर है। एक उदाहरण प्रदान करना जहां किसी की जरूरत नहीं है, केवल कॉपी-एंड-पेस्ट कोडिंग को प्रोत्साहित करता है।
चक

188

इसे उस पेज पर जोड़ें जिसे आप केवल शामिल करना चाहते हैं

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

फिर उन पृष्ठों पर जो इसे शामिल करते हैं

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

3
मुझे वास्तव में जल्दी टाइप करना सीखना होगा। यह उसी तरह है जो मैं सुझाऊंगा, क्योंकि इसकी विधि से अधिक सुरक्षित है जो जांचने के लिए एक चर का उपयोग करता है। चूंकि कुछ PHP सेटअप के साथ चर को ओवरराइड करना संभव हो सकता है।
मार्क डेविडसन

3
यह कैसे कुछ 'मुख्यधारा' अनुप्रयोगों को संभालता है। मुझे पता है कि जूमला इसे इस तरह से करता है और मुझे लगता है कि विकी, वर्डप्रेस, और अन्य भी।
UnwwnTech

1
हो सकता है कि संदेश किसी हैकर के लिए बहुत उपयोगी हो (कोई वास्तविक उपयोगकर्ता इन पृष्ठों को नहीं ढूंढेगा), आप बस रीडायरेक्ट हेडर भेज सकते हैं और php प्रोसेसिंग को रोक सकते हैं।
बंदी

7
बस एक 404 हेडर और बाहर निकलें - त्रुटि पृष्ठ सामान्य 404 पृष्ठों (कम से कम अपाचे) के समान दिखाई देगा।
ग्नुद

4
@ Smile.Hunter: यह आपकी शामिल / लाइब्रेरी स्क्रिप्ट फ़ाइलों को सीधे देखने के लिए पहुंच को अवरुद्ध करने के बारे में है, उत्तर काम करता है। यदि उन्होंने somefile.phpआपके सर्वर पर बनाया है और उसमें आपका डिफाइन जोड़ा है, तब भी वह उन्हें सीधे फाइल में शामिल नहीं होने देता है। यह उन्हें आपकी लाइब्रेरी फ़ाइलों को "शामिल" करने देगा, लेकिन यदि वे आपके सर्वर पर फ़ाइलों को बनाने और आपके परिभाषित / स्क्रिप्ट को जानने के लिए बहुत दूर हैं, तो आपके पास अन्य मुद्दे हैं जो संभवत: पहली बार में आपके परिभाषित के साथ अपनी खुद की फाइल लिखने की उपेक्षा करते हैं। ।
जेम्स

114

मेरे पास एक फ़ाइल है जिसे मुझे अलग-अलग कार्य करने की आवश्यकता है जब इसे शामिल किया जाता है जब इसे सीधे एक्सेस किया जाता है (मुख्यतः एक print()बनाम return()) यहां कुछ संशोधित कोड है:

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

एक्सेस की जा रही फ़ाइल हमेशा शामिल फ़ाइल होती है, इसलिए == 1।  


12
यह वास्तव में एक विचार का एक नरक है, जिसमें शामिल फ़ाइल गणना की जांच करना शामिल है। मुझे आश्चर्य है कि कौन सा बेहतर है: परिभाषित करना, या इस पद्धति का उपयोग करना? यह अधिक आत्म-निहित लगता है।
एको मीक्सएक्स

पहली बार मैंने कभी किसी को इस के साथ आते देखा है। मैं नहीं जानता कि हालांकि, क्योंकि यह लगता है कि स्वयं के रूप में निहित हो सकता है, और यह सीधे माप रहा है कि आप वास्तव में क्या जानना चाहते हैं (यदि शामिल है या नहीं) कुछ को मापने के बजाय जुड़ा हुआ माना जाता है (जैसे एक निश्चित निरंतर या .htaccess द्वारा प्रतिबंधित कुछ स्थान)। सुंदर।
जिम्बो जॉनी

यह वास्तव में अच्छा है क्योंकि सभी .php फ़ाइलों को ब्लॉक करने के लिए .htaccess का उपयोग करना हर समय संभव नहीं हो सकता है क्योंकि एक ही निर्देशिका में कुछ फाइलें हो सकती हैं जिन्हें सीधे या यहां तक ​​कि javascripts द्वारा बुलाया जाना चाहिए। इस महान विचार के लिए धन्यवाद!
अनुज

3
यह केवल PHP5 और ऊपर में काम करता है। पूर्व PHP5 आप 1 के बजाय फिर से 0 की तुलना करना चाहते हैं
jmucchiello

यह वास्तव में एक चतुर समाधान है और आपको प्रत्यक्ष पहुंच को नियंत्रित करने की अनुमति देता है, न कि इसे अवरुद्ध करें - यही मुझे पसंद है। मैं आमतौर पर फाइलों में इकाई परीक्षण खुद शामिल करता हूं, और इस तरह से मैं इस कथन में अपनी इकाई परीक्षण को लपेट सकता हूं। आश्चर्य है कि यह कितना कुशल है ..
व्हाइट जूल

34

फ़ाइलों तक सीधे पहुंच को रोकने का सबसे अच्छा तरीका उन्हें वेब-सर्वर दस्तावेज़ रूट (आमतौर पर, एक स्तर ऊपर) के बाहर रखना है। आप अभी भी उन्हें शामिल कर सकते हैं, लेकिन http अनुरोध के माध्यम से किसी के उन तक पहुंचने की कोई संभावना नहीं है।

मैं आम तौर पर सभी तरह से जाता हूं, और अपने सभी PHP फाइलों को बूट रूटैप फाइल से अलग डॉक्यूमेंट रूट के बाहर रखता हूं - डॉक्यूमेंट रूट में एक अकेला इंडेक्स।पीएफ जो पूरी वेबसाइट / एप्लिकेशन को रूट करना शुरू करता है।


3
यदि आप ऐसा करने में सक्षम हैं तो यह एक शानदार उपाय है। मुझे हाल ही में साझा किए गए वेबहोस्ट के साथ काम करना शुरू करना पड़ा और कई परेशानियों में से एक की खोज की कि सब कुछ डोकरो के अंदर होना चाहिए।
ब्यू सिमेंसन

3
प्रत्येक होस्टिंग प्रदाता के साथ मैंने हमेशा काम किया है जो दस्तावेज़ रूट के ऊपर (बिल्कुल) एक स्तर तक पहुंच था।
एरन गैपरिन 21

3
कुछ मेजबानों पर (मेरे वर्तमान एक सहित), आप अपने डोमेन को जिस भी फ़ोल्डर में चाहें, इंगित कर सकते हैं।
दीना

1
यह एक अच्छा विकल्प है और साथ ही .. preg_match -> if (preg_match ("~ globalfile \ .php ~ i", $ _SERVER ['PHP_SELF']))) {die ('<h3 style = "color: red">> का उपयोग करके एक अच्छा विकल्प है। उपकरण सुरक्षा चेतावनी - डायरेक्ट एक्सेस अस्वीकृत है! आपका IP लॉग हो गया है! <H3> '); // आगे के निष्पादन को रोकें}
MarcoZen

यही कारण है कि यूआरएल devzone.zend.com/node/view/id/70 404 अब है। उत्तर में वह कोड शामिल होना चाहिए जो मूल रूप से उस गैर-मौजूद url से उपयोग किया गया था।
फंक फोर्टी निनेर

31

1: शामिल फ़ाइलों की गिनती की जाँच करना

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

तर्क: यदि न्यूनतम शामिल गणना पूरी नहीं हुई है, तो पीएचपी बाहर निकलता है। ध्यान दें कि 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: प्लेसिंग में साइट के रूट में एक सुरक्षित निर्देशिका OUTSIDE शामिल है

सर्वर वातावरण में पहुंच सीमाओं के कारण कम से कम पसंद किया जाता है, लेकिन यदि आप फ़ाइल-सिस्टम तक पहुंच रखते हैं, तो यह एक शक्तिशाली तरीका है।

//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 पसंद है
बैम गलत

26

चक के समाधान के लिए एक विकल्प (या पूरक) अपनी .htaccess फ़ाइल में कुछ इस तरह से डालकर एक विशिष्ट पैटर्न से मेल खाने वाली फ़ाइलों तक पहुंच से इनकार करना होगा।

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

उपयोग करने के लिए बेहतर होगा .inc.php मेरा मानना ​​है, और यह एक सामान्य अभ्यास है
लिस

14

वास्तव में मेरी सलाह है कि आप इन सभी सर्वोत्तम प्रथाओं को करें।

  • वेबरूट के बाहर या एक निर्देशिका में दस्तावेजों को वेबसर्वर और एएनआर द्वारा उपयोग से वंचित रखें
  • अपने दृश्यमान दस्तावेज़ों में एक परिभाषित का उपयोग करें जिसे छिपे हुए दस्तावेज़ों की जाँच करें:
      if (!defined(INCL_FILE_FOO)) {
          header('HTTP/1.0 403 Forbidden');
          exit;
      }

इस तरह अगर फाइलें किसी तरह गलत हो जाती हैं (एक गलत एफटीपी ऑपरेशन) तो वे अभी भी संरक्षित हैं।


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
अगर रजिस्टर_ग्लोबल्स चालू है तो PHP खतरनाक है।
डेविड प्रेशस

3

.Htaccess रास्ते के अलावा, मैंने विभिन्न चौखटे में एक उपयोगी पैटर्न देखा है, उदाहरण के लिए रेल पर रूबी। उनके पास एप्लिकेशन रूट निर्देशिका में एक अलग पब / निर्देशिका है और पुस्तकालय निर्देशिकाएं पब / के समान स्तर पर निर्देशिका में रह रही हैं । कुछ इस तरह (आदर्श नहीं है, लेकिन आपको यह विचार मिलता है):

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

आप पब / दस्तावेज़ रूट के रूप में उपयोग करने के लिए अपना वेब सर्वर सेट करते हैं। यह आपकी स्क्रिप्ट को बेहतर सुरक्षा प्रदान करता है: जबकि वे आवश्यक घटकों को लोड करने के लिए दस्तावेज़ रूट से बाहर पहुंच सकते हैं, इंटरनेट से घटकों को एक्सेस करना असंभव है। सुरक्षा के अलावा एक और लाभ यह है कि सब कुछ एक ही स्थान पर है।

यह सेटअप हर एक सम्मिलित फ़ाइल में केवल चेक बनाने से बेहतर है क्योंकि "एक्सेस की अनुमति नहीं है" संदेश हमलावरों के लिए एक संकेत है, और यहhtaccess कॉन्फ़िगरेशन से बेहतर है क्योंकि यह श्वेत-सूची आधारित नहीं है: यदि आप फ़ाइल एक्सटेंशन को स्क्रू करते हैं। यह lib /, conf / etc निर्देशिकाओं में दिखाई नहीं देगा।


एक लंबे समय के बाद मैं केवल यह टिप्पणी करना चाहता हूं कि आप जिस मॉडल का वर्णन एमवीसी (मॉडल - दृश्य - नियंत्रक) मॉडल से करते हैं। यदि आप कृपया, Google की जाँच करें और अपने उत्तर में कुछ और जानकारी जोड़ें। इसके अलावा MVC न केवल रूबी रेल्स और ASP.NET अनुप्रयोगों पर समर्थन करता है, बल्कि PHP (Lavarel, CakePHP भी देखें)।

3

क्या जूमला! एक कॉन्स्टेंट को रूट फाइल में परिभाषित करता है और जाँचता है कि क्या वही शामिल फाइलों में परिभाषित है या नहीं।

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

वरना

सभी फाइलों को एक वेब http निर्देशिका की पहुंच के बाहर रख सकते हैं, जैसा कि कोडआईग्निटर की सिफारिश के अनुसार अधिकांश रूपरेखाएं होती हैं।

या यहां तक ​​कि शामिल फ़ोल्डर और लेखन नियमों के भीतर एक .htaccess फ़ाइल रखकर, आप सीधे पहुंच को रोक सकते हैं।



3

मेरा उत्तर दृष्टिकोण में कुछ भिन्न है, लेकिन यहाँ दिए गए कई उत्तर शामिल हैं। मैं एक बहुस्तरीय दृष्टिकोण की सिफारिश करूंगा:

  1. .htaccess और अपाचे सुनिश्चित करने के लिए प्रतिबंध
  2. defined('_SOMECONSTANT') or die('Hackers! Be gone!');

हालांकिdefined or die दृष्टिकोण असफलताओं की एक संख्या है। सबसे पहले, यह मान्यताओं के साथ परीक्षण और डीबग करने के लिए वास्तविक दर्द है। दूसरे, इसमें भयानक रूप से, मन-क्रमिक रूप से उबाऊ refactoring शामिल है यदि आप अपना दिमाग बदलते हैं। "ढूँढें और बदलें!" तुम कहो। हां, लेकिन आप कितने आश्वस्त हैं कि यह बिल्कुल हर जगह समान रूप से लिखा गया है, हम्म? अब हजारों फ़ाइलों के साथ गुणा करें ... ओओ

और फिर .htaccess है। यदि आपका कोड उन साइटों पर वितरित किया जाता है, जहां व्यवस्थापक इतना साफ़ नहीं है? यदि आप अपनी फाइलों को सुरक्षित करने के लिए केवल .htaccess पर भरोसा करते हैं, तो आपको अपने आँसुओं को सूखने के लिए a) बैकअप, b) टिशूज़ का एक बॉक्स भी चाहिए, c) आग बुझाने की मशीन, आग की लपटों को सभी लोगों के बीच पहुँचाने के लिए अपने कोड का उपयोग कर।

तो मुझे पता है कि सवाल "सबसे आसान" के लिए पूछता है, लेकिन मुझे लगता है कि इस कॉल के लिए अधिक "रक्षात्मक कोडिंग" क्या है।

मेरा सुझाव है:

  1. आपकी किसी भी स्क्रिप्ट से पहले require('ifyoulieyougonnadie.php');( प्रतिस्थापन के लिए और उसके रूप में नहीं )include()defined or die
  2. में ifyoulieyougonnadie.php, कुछ लॉजिक सामान करते हैं - विभिन्न स्थिरांक, कॉलिंग स्क्रिप्ट, लोकलहोस्ट परीक्षण और जैसे - और फिर अपने die(), throw new Exception, 403आदि को लागू करने के लिए जाँच करें ।

    मैं दो संभावित प्रवेश बिंदुओं के साथ अपना ढांचा तैयार कर रहा हूं - मुख्य सूचकांक। एफपी (जूमला ढांचा) और अजाक्स्राउटर। एफपी (मेरा ढांचा) - इसलिए प्रवेश के बिंदु के आधार पर, मैं विभिन्न चीजों की जांच करता हूं। अगर 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://flatnux.altervista.org ) में किया जाता है:

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

1

मुझे यह php-only और अपरिवर्तनीय समाधान मिला जो http और cli दोनों के साथ काम करता है:

एक फ़ंक्शन को परिभाषित करें:

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

उस फ़ाइल में फ़ंक्शन को कॉल करें जिसे आप सीधे पहुंच से रोकना चाहते हैं:

forbidDirectAccess(__FILE__);

इस प्रश्न के ऊपर दिए गए अधिकांश समाधान Cli मोड में काम नहीं करते हैं।


जहां सीएलआई मोड में URL टाइप करना है?
आपका कॉमन सेंस

यह सिर्फ php स्क्रिप्ट के लॉन्च को रोकने के लिए है। कई डेवलपर्स के साथ एक परियोजना में उपयोगी हो सकता है।
का।



1

वेब पहुंच निर्देशिका के बाहर अपनी फ़ाइलों को संग्रहीत करना कुछ समय का उल्लेख किया गया है, और निश्चित रूप से जहां संभव हो एक अच्छी रणनीति है। हालाँकि, एक अन्य विकल्प जिसका मैंने अभी तक उल्लेख नहीं किया है: सुनिश्चित करें कि आपकी फ़ाइलों में कोई भी रन करने योग्य कोड शामिल नहीं है । यदि आपकी फ़ाइलों में केवल फ़ंक्शंस और कक्षाएं परिभाषित हैं, और इसके अलावा कोई कोड नहीं है, तो वे सीधे सीधे एक्सेस किए जाने पर एक रिक्त पृष्ठ का उत्पादन करेंगे।

हर तरह से ब्राउज़र से इस फ़ाइल तक सीधी पहुँच की अनुमति दें: यह कुछ भी नहीं करेगा । यह कुछ कार्यों को परिभाषित करता है, लेकिन उनमें से कोई भी कॉल नहीं किया जाता है, इसलिए उनमें से कोई भी नहीं चलता है।

<?php

function a() {
    // function body
}

function b() {
    // function body
}

वही उन फ़ाइलों पर लागू होता है जिनमें केवल PHP कक्षाएं होती हैं, और कुछ नहीं।


अपनी फ़ाइलों को वेब निर्देशिका के बाहर रखना अभी भी एक अच्छा विचार है जहाँ संभव हो।

  • आप गलती से PHP को निष्क्रिय कर सकते हैं, जिस स्थिति में आपका सर्वर PHP को चलाने और परिणाम भेजने के बजाय ब्राउज़र में PHP फ़ाइलों की सामग्री भेज सकता है। इससे आपका कोड (डेटाबेस पासवर्ड, एपीआई कुंजी, आदि सहित) लीक हो सकता है।
  • वेब निर्देशिका में फ़ाइलें उन URL पर स्क्वाट कर रही हैं, जिन्हें आप अपने ऐप के लिए उपयोग करना चाहते हैं। मैं एक सीएमएस के साथ काम करता हूं जिसमें एक पेज नहीं हो सकता है system, क्योंकि वह कोड के लिए उपयोग किए जाने वाले पथ के साथ संघर्ष करेगा। मुझे यह कष्टप्रद लगता है।

0

कुछ ऐसा करें:

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

यह इसे ब्राउज़र में लोड होने से नहीं रोकेगा।
UnwwnTech

0

आप नीचे दी गई विधि का उपयोग कर सकते हैं हालांकि, इसमें एक दोष है, क्योंकि यह नकली हो सकता है, सिवाय इसके कि आप कोड की एक और पंक्ति जोड़ सकते हैं यह सुनिश्चित करने के लिए कि अनुरोध आपके सर्वर से या तो जावास्क्रिप्ट का उपयोग करके आता है। आप इस कोड को अपने HTML कोड के बॉडी सेक्शन में रख सकते हैं, इसलिए त्रुटि वहां दिखाई देती है।

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

अपना अन्य HTML कोड यहां रखें

<? } ?>

इसे इस तरह से समाप्त करें, इसलिए त्रुटि का आउटपुट हमेशा निकाय अनुभाग में दिखाई देगा, यदि आप चाहते हैं कि यह कैसे हो।


मैं समझता हूं कि सभी HTTP_ * सर्वर हेडर पर भरोसा नहीं किया जाना है, इसलिए आप बेहतर तरीके से इस पद्धति का उपयोग नहीं करते हैं।
andreszs

0

मेरा सुझाव है कि $_SERVERसुरक्षा कारणों से उपयोग न करें ।
आप $root=true;पहले फ़ाइल की तरह एक चर का उपयोग कर सकते हैं जिसमें एक और शामिल था।
और isset($root)दूसरी फ़ाइल की शुरुआत में उपयोग करें जो शामिल हो।


0

आप जो भी कर सकते हैं वह है पासवर्ड को डायरेक्ट्री की सुरक्षा करना और अपनी सभी php स्क्रिप्ट्स को वहाँ रखना, इंडेक्स.फैप फ़ाइल को छोड़कर, टोकेर करना, क्योंकि इसमें पासवर्ड शामिल करने के समय की आवश्यकता नहीं होगी क्योंकि यह केवल http एक्सेस के लिए आवश्यक होगा। ऐसा करने पर आपको अपनी स्क्रिप्ट का उपयोग करने का विकल्प भी मिलेगा, यदि आप चाहते हैं कि आपके पास उस निर्देशिका तक पहुंचने के लिए पासवर्ड होगा। आपको उपयोगकर्ता को प्रमाणित करने के लिए निर्देशिका और .htpasswd फ़ाइल के लिए .htaccess फ़ाइल सेटअप करने की आवश्यकता होगी।

ठीक है, आप ऊपर दिए गए किसी भी समाधान का उपयोग कर सकते हैं यदि आपको लगता है कि आपको उन फ़ाइलों को सामान्य रूप से एक्सेस करने की आवश्यकता नहीं है क्योंकि आप हमेशा उन्हें cPanel आदि के माध्यम से एक्सेस कर सकते हैं।

उम्मीद है की यह मदद करेगा


0

सबसे आसान तरीका यह है कि आप अपनी निर्देशिका को वेब निर्देशिका से बाहर संग्रहीत करें। इस तरह से सर्वर का उपयोग उनके पास होता है लेकिन कोई बाहरी मशीन नहीं। केवल नीचे की ओर आपको अपने सर्वर के इस हिस्से तक पहुंचने में सक्षम होना चाहिए। उल्टा यह कोई सेट अप, कॉन्फ़िगरेशन या अतिरिक्त कोड / सर्वर तनाव की आवश्यकता है।


0

मुझे सुझाव नहीं मिले। यह बहुत अच्छा है क्योंकि यह उस फ़ोल्डर में अन्य सामग्री को ब्लॉक कर सकता है जिसे आप उपयोगकर्ता को एक्सेस करने की अनुमति देना चाहते हैं, यह मेरा समाधान है:

$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 एक में सेट है index.phpफ़ाइल है कि वृक्ष संरचना के निचले भाग में देता है। CI URL को फिर से लिखता है इसलिए स्क्रिप्ट को किसी भी तरह से एक्सेस करने की कोई आवश्यकता नहीं है।
जिमासून

मुझे पता है कि कोई ज़रूरत नहीं है लेकिन अगर कोई ऐसा करने की कोशिश करता है
वर्षा

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
मैं वास्तव में यह नहीं समझता कि यह प्रत्यक्ष पहुंच कैसे रोक सकता है
एडम लिंडसे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.