——此文章摘自《完全手冊PHP網絡開發詳解》定價
¥
特價
¥
詳細>>
http://track
linktech
cn/?m_id=dangdang&a_id=A
&l=
&l_type
=
width=
height=
border=
nosave>
由於PHP支持使用相同的函數對本地文件和遠程文件進行操作因此一些惡意用戶通過強行使網站上的PHP代碼包含自己的文件來實現執行自己腳本的目的以下代碼實現了根據浏覽器地址欄參數的文件名稱包含不同文件的功能
<?php
$file_name = $_GET[filename]; //獲得當前文件名
include($file_name ); //包含文件
//一些其他操作
?>
這時通過在地址欄上指定不同的文件名就可以實現包含不同文件並執行的功能例如通過在浏覽器上訪問http://localhost/testphp?filename=myincphp就可以在代碼中包含並執行myincphp文件
由於上面的代碼沒有進行任何錯誤處理在浏覽器上不加參數運行所以將得到以下運行結果
Warning: include(php) [functioninclude]: failed to open stream: No such file or directory in C:\Program Files\xampp\htdocs\Bugs\testphp on line
Warning: include() [functioninclude]: Failed opening php for inclusion (include_path=;C:\Program Files\xampp\php\pear\) in C:\Program Files\xampp\htdocs\Bugs\testphp on line
訪問者通過讀取這段錯誤信息可以得知當前的操作是一個文件包含操作這時可以在自己的服務器上放置一個相應的腳本程序需要注意的是PHP在獲取遠程文件時獲得的是遠程服務器的最終輸出結果而不是文件本身該腳本程序位於服務器上文件名為hellotxt腳本代碼如下所示
<?php
echo hello world!;
?>
這時通過在浏覽器中訪問http://localhost/testphp?filename=http:///hellotxt就可以運行hellotxt中的腳本了
為了解決這個問題一種方法是完善程序的錯誤信息使訪問者無法知道當前腳本正在包含參數中指定的文件修改後的代碼如下所示
<?php
$file_name = $_GET[filename]; //獲得當前文件名
if(!@include($file_namephp)) //包含文件
{
die(頁面在浏覽過程中出現錯誤);
}
//一些其他操作
?>
修改後如果在被包含的文件無法找到時將出現頁面在浏覽過程中出現錯誤的錯誤信息訪問者將無法獲得當前頁面的具體操作信息
第二種方法可以更加有效地防止遠程文件包含攻擊方法是替換地址欄參數中的斜線/這樣在地址欄參數中輸入遠程文件地址時程序將無法正確地獲得參數修改後的代碼如下所示
<?php
$file_name = str_replace(/ $_GET[filename]); //獲得當前文件名
if(!@include($file_namephp)) //包含文件
{
die(頁面在浏覽過程中出現錯誤);
}
//一些其他操作
?>
這樣在浏覽器中訪問http://localhost/testphp?filename=http:///hellotxt 時實際上PHP代碼獲得的包含文件名稱是http:bugstest_test頁面將不會包含遠程文件並顯示相應的錯誤信息
From:http://tw.wingwit.com/Article/program/PHP/201311/21455.html