一個更好的代碼示例:
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']
。
+1這是濫用我所知的PHP_SELF的唯一可能方式。如果用作表單或其他東西的基本URL,它可能會在某些情況下產生問題,但在OP中顯示的比較中可以安全使用。 – 2010-08-29 20:02:36
我相信你有錯。 $ _SERVER ['PHP_SELF']始終包含正在運行的腳本的路徑。你正在考慮REQUEST_URI。 – Codeacula 2010-08-29 20:05:22
我只是再次測試它:'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