2010-08-29 93 views
6

我還是PHP的新手,所以如果看起來很愚蠢,請原諒這個問題,但我想知道這是否安全使用$_SERVER['PHP_SELF']

從我的閱讀中可以看出它有什麼問題(容易注射),我想知道是否可以比較它是否安全。例如,我希望PHP/CSS樣式表根據用戶所在的頁面進行更改,因此在PHP/CSS中,它會有一個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'],並確保你瞭解所涉及的檢查,是的。

例如,這個URL:http://example.com/sick.php/mwuahahahaha給出:

/sick.php/mwuahahahaha 

比較是允許的,像CSS非關鍵的東西。

如果不需要獲取請求的路徑(不重寫URL),請使用$_SERVER['SCRIPT_NAME']。 如果你真的需要$_SERVER['PHP_SELF'](rewrited URL),輸出(使用htmlentities($_SERVER['PHP_SELF'])時逃脫他們

變量概述:

  • __FILE__:包含從活動腳本的完整文件系統路徑,例如:
    <?php /*test.php*/ include 'file.php';?>
    <?php /*file.php*/ echo __FILE__;?>
    請求的test.php給出類似:/var/www/file.php(而不是/var/www/test.php
  • $_SERVER['SCRIPT_FILENAME']:包含請求腳本的文件系統路徑,例如/var/www/test.php
  • $_SERVER['SCRIPT_NAME']:包含請求腳本的路徑(如文件系統一,但文檔根被剝離) /test.php(即使使用rewrited的URL)
  • $_SERVER['PHP_SELF']:包含翻譯路徑(// - >/...解決),但與其他路徑信息。
  • $_SERVER['REQUEST_URI']:最糟糕的是,它包含請求中的原始字符串,如GET [REQUEST_URI] HTTP/1.0。 (轉義)nullbytes在這裏仍然可見。這只是GET(或任何梅索德您使用)和HTTP/1.0(或任何HTTP版本使用)

這些變量的比較之間的原始數據:我nc進行這個測試

,但telnet也應該足夠了。服務器從http://xampp.org/。所請求的文件是test.php,其中包含:

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

結論:在大多數情況下,使用最安全的變量是$_SERVER['SCRIPT_NAME']

+0

+1這是濫用我所知的PHP_SELF的唯一可能方式。如果用作表單或其他東西的基本URL,它可能會在某些情況下產生問題,但在OP中顯示的比較中可以安全使用。 – 2010-08-29 20:02:36

+0

我相信你有錯。 $ _SERVER ['PHP_SELF']始終包含正在運行的腳本的路徑。你正在考慮REQUEST_URI。 – Codeacula 2010-08-29 20:05:22

+0

我只是再次測試它:'http://localhost/xampp/phpinfo.php/whatDidYouSay?%25'給出:'_SERVER [「PHP_SELF」] \t/xampp/phpinfo.php/whatDidYouSay'。 REQUEST_URI更糟糕:'/xampp/phpinfo.php/whatDidYouSay?%25'。這個'功能'被稱爲['Pathinfo'](http://httpd.apache.org/docs/current/mod/core.html#acceptpathinfo) – Lekensteyn 2010-08-29 20:14:07

0

是的,答案很簡單而且簡短:
如果你的文件被直接調用,就像http://www.example.com/news.php,你的代碼是沒問題的。
沒有惡意代碼可以這種方式影響您的網站。