2010-08-29 7 views
6

मैं अभी भी PHP के लिए नौसिखिया हूं, इसलिए अगर यह मूर्खतापूर्ण लगता है तो इस सवाल का बहाना है, लेकिन मैं सोच रहा था कि यह $_SERVER['PHP_SELF'] का सुरक्षित उपयोग है या नहीं।

इसके बारे में पढ़ने के बाद (इंजेक्शन के लिए प्रवण), मैं सोच रहा था कि यह तुलना करने के लिए सुरक्षित है या नहीं।

उदाहरण के लिए, मैं PHP/CSS स्टाइलशीट पेज व्यक्ति पर है, के आधार पर बदलना चाहते PHP/सीएसएस में ऐसा है, तो यह एक if बयान $_SERVER['PHP_SELF'] जाँच को देखने के लिए होता है पेज उनकी यात्रा के लिए एक अलग की आवश्यकता है शैली पत्रक।

उदाहरण:

if ($_SERVER['PHP_SELF'] === $thisPage) { } 

दुर्भावनापूर्ण कोड मुझे इस तरह से प्रभावित कर सकते हैं? क्या मैं बस इसे सत्यापित/साफ कर सकता हूं, फिर इसका उपयोग कर सकता हूं?

उत्तर

5

एक बेहतर कोड उदाहरण होगा:

if ($_SERVER['SCRIPT_NAME'] === $thisPage) { } 

फिर भी, यह $ thisPage की सामग्री पर निर्भर करता है। $ ThisPage $_SERVER['PHP_SELF'] भी शामिल है, तो आप $_SERVER['SCRIPT_NAME']


करने के लिए कि क्या तुम सच में बदलने के __FILE__ और $_SERVER['SCRIPT_NAME'] तरह के विकल्प का उपयोग नहीं कर सकते हैं, और सुनिश्चित करें कि आप शामिल चेकों को समझने हाँ बनाना चाहिए।

उदाहरण के लिए, इस यूआरएल: http://example.com/sick.php/mwuahahahaha देता है:

/sick.php/mwuahahahaha 

की तुलना सीएसएस की तरह गैर महत्वपूर्ण बातों के लिए, अनुमति दी है।

यदि अनुरोधित पथ (कोई यूआरएल पुनः लिखने) की आवश्यकता नहीं है, तो $_SERVER['SCRIPT_NAME'] का उपयोग करें। तुम सच में $_SERVER['PHP_SELF'] (rewrited यूआरएल) की जरूरत है, उन्हें जब outputting (htmlentities($_SERVER['PHP_SELF']) का उपयोग कर से बचने के

चर का अवलोकन:।

  • __FILE__: सक्रिय स्क्रिप्ट से पूरी फाइल सिस्टम पथ है उदाहरण के लिए:।
    <?php /*test.php*/ include 'file.php';?>/var/www/file.php (और नहीं /var/www/test.php)
  • :
    <?php /*file.php*/ echo __FILE__;?>
    test.php का निवेदन की तरह कुछ देता है
  • $_SERVER['SCRIPT_FILENAME']: अनुरोधित स्क्रिप्ट का फाइल सिस्टम पथ शामिल है, उदा। /var/www/test.php
  • $_SERVER['SCRIPT_NAME']: अनुरोधित स्क्रिप्ट का पथ शामिल है (जैसे फाइल सिस्टम एक, लेकिन दस्तावेज़ रूट के साथ), उदा। /test.php (तब भी जब का उपयोग कर rewrited यूआरएल)
  • $_SERVER['PHP_SELF']: एक अनुवाद पथ (// ->/, . और .. का समाधान) शामिल है, लेकिन साथ अतिरिक्त पथ जानकारी।
  • $_SERVER['REQUEST_URI']: इनमें से सबसे खराब, इसमें अनुरोध में कच्ची स्ट्रिंग शामिल है। GET [REQUEST_URI] HTTP/1.0। (बच निकला) नलबाइट अभी भी यहां दिखाई दे रहे हैं।

    मैं nc के साथ इस परीक्षण किया है, लेकिन telnet: यह GET (या जो भी methode आप का उपयोग) और HTTP/1.0 (या जो भी HTTP संस्करण आप उपयोग)

इन चरों की तुलना के बीच सिर्फ कच्चे डेटा है भी पर्याप्त होना चाहिए। सर्वर http://xampp.org/ से था।

<?php 
$properties = array('SCRIPT_FILENAME', 'SCRIPT_NAME', 'PHP_SELF', 'REQUEST_URI'); 
printf("% 15s: %s\n", '__FILE__', __FILE__); 
foreach($properties as $property){ 
    printf('% 15s: %s', $property, $_SERVER[$property]."\n"); 
} 
?> 

टेस्ट:

$ nc localhost 80 
GET ///somedir/./../////test.php/somedata%20here?q%00=%25 HTTP/1.0 


HTTP/1.1 200 OK 
Server: Apache/2.2.14 (Unix) 
[stripped] 

     __FILE__: /opt/lampp/htdocs/test.php 
SCRIPT_FILENAME: /opt/lampp/htdocs/test.php 
    SCRIPT_NAME: /////test.php 
     PHP_SELF: /////test.php/somedata here 
    REQUEST_URI: ///somedir/./../////test.php/somedata%20here?q%00=%25 

RewriteRule ^page/test test.php का उपयोग करना:

$ nc localhost 80 
GET ///somedir/./../page//.////test/somedata%20here?q%00=%25 HTTP/1.0 

HTTP/1.1 200 OK 
Server: Apache/2.2.14 (Unix) 
[stripped] 

     __FILE__: /opt/lampp/htdocs/test.php 
SCRIPT_FILENAME: /opt/lampp/htdocs/test.php 
    SCRIPT_NAME: /test.php 
     PHP_SELF: /test.php 
    REQUEST_URI: ///somedir/./../page//.////test/somedata%20here?q%00=%25 

निष्कर्ष: अनुरोध की गई फ़ाइल test.php है, जो होता है ज्यादातर मामलों में उपयोग करने के लिए सबसे सुरक्षित चर $_SERVER['SCRIPT_NAME'] है।

+0

+1 यह PHP_SELF का दुरुपयोग करने का एकमात्र संभावित तरीका है जिसे मैं जानता हूं। यह कुछ परिस्थितियों में समस्याएं पैदा कर सकता है यदि किसी फॉर्म या किसी चीज़ के लिए बेस यूआरएल के रूप में उपयोग किया जाता है, लेकिन ओपी द्वारा दिखाए गए तुलना में उपयोग में सुरक्षित होगा। –

+0

मेरा मानना ​​है कि आपके पास यह गलत है। $ _SERVER ['PHP_SELF'] में हमेशा चल रहे स्क्रिप्ट का पथ होता है। आप REQUEST_URI के बारे में सोच रहे हैं। – Codeacula

+0

मैंने अभी इसे फिर से परीक्षण किया है: 'http: //localhost/xampp/phpinfo.php/whatDidYouSay?% 25' देता है:' _SERVER ["PHP_SELF"] \t/xampp/phpinfo.php/whatDidYouSay'। REQUEST_URI और भी बदतर है: 'xxp/phpinfo.php/whatDidYouSay?% 25'। इस 'फीचर' को ['Pathinfo'] कहा जाता है (http://httpd.apache.org/docs/current/mod/core.html#acceptpathinfo) – Lekensteyn

0

हाँ, उत्तर सरल और छोटा है:
यदि आपकी फ़ाइलों को सीधे कहा जाता है, जैसे http://www.example.com/news.php, आपका कोड ठीक है।
कोई दुर्भावनापूर्ण कोड आपकी साइट को इस तरह प्रभावित नहीं कर सकता है।

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