——此文章摘自《完全手册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页面将不会包含远程文件并显示相应的错误信息