免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2312 | 回复: 11
打印 上一主题 下一主题

[文件目录]文件名安全处理  关闭 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-10-17 21:29 |只看该作者 |倒序浏览
$file_root="/home/file";
$file=$_REQUEST["filename"];

fopen("$file_root/$file";

请教最简单有效的方法防止用户恶意操作越过$file_root目录访问其他目录的文件。例如:filename="../../etc/anyfile"。

论坛徽章:
0
2 [报告]
发表于 2005-10-17 22:12 |只看该作者

[文件目录]文件名安全处理

可以尝试一下做法, 比较安全. 当然也可以简单的判断文件名里是否含有 './'

  1. if (strncmp(realpath($file_root . '/' . $file), $file_root, strlen($file_root)) exit ('滚');
复制代码

论坛徽章:
0
3 [报告]
发表于 2005-10-17 22:42 |只看该作者

[文件目录]文件名安全处理

还有其他办法吗?realpath不能彻底解决问题,如果文件名为新文件时,realpath()就会返回空串了。假如目录里面只有一个名为list.txt的文件,执行以下命令可以证明问题了:
C:\我的音乐>;php -r "echo realpath('c:\我的音乐\list.txt');"
c:\我的音乐\list.txt
C:\我的音乐>;php -r "echo realpath('c:\我的音乐\1.mp3');"

C:\我的音乐>;

论坛徽章:
0
4 [报告]
发表于 2005-10-18 10:31 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
5 [报告]
发表于 2005-10-18 13:16 |只看该作者

[文件目录]文件名安全处理

楼上老兄,define()跟这个问题有关系吗?

论坛徽章:
0
6 [报告]
发表于 2005-10-18 23:45 |只看该作者

[文件目录]文件名安全处理

过滤一下:
  1. $file = eregi_replace("^.*\/", "", $file);
复制代码

论坛徽章:
0
7 [报告]
发表于 2005-10-19 00:21 |只看该作者

[文件目录]文件名安全处理

$file = eregi_replace("^.*\/", "", $file);
处理不了这种情况:
$dir="c:/work/php"
$file="win/../../hello.txt"

我对你的代码改进了,不知这样做还有没有其他漏洞?
C:\work>;type test.php
<?php
$dir="c:/work/php";
$file="/win/../../hello.txt";
echo "$dir/$file\n";
$real=ereg_replace("\.{2,}\/","/","$dir/$file";  //删除多余的点
$real=ereg_replace("\/+","/",$real);  //删除多余的斜线
echo $real;
?>;

C:\work>;php test.php
c:/work/php//win/../../hello.txt
c:/work/php/win/hello.txt
C:\work>;

论坛徽章:
0
8 [报告]
发表于 2005-10-19 00:27 |只看该作者

[文件目录]文件名安全处理

处理不了这种情况:
$dir="c:/work/php"
$file="win/../../hello.txt"

为什么呢?

论坛徽章:
0
9 [报告]
发表于 2005-10-19 00:34 |只看该作者

[文件目录]文件名安全处理

  1. <?php
  2. $dir="c:/work/php";
  3. $file="/win/../../hello.txt";
  4. echo "$dir/$file\n";
  5. $file = eregi_replace("^.*\/", "", $file);
  6. echo "$dir/$file\n";
  7. ?>;
复制代码

输出:
  1. c:/work/php//win/../../hello.txt
  2. c:/work/php/hello.txt
复制代码

论坛徽章:
0
10 [报告]
发表于 2005-10-19 00:41 |只看该作者

[文件目录]文件名安全处理

  1. <?php
  2. $dir="c:/work/php";
  3. $file=$_GET['filename'];
  4. echo "$dir/$file\n";
  5. $file = eregi_replace("^.*\/", "", $file);
  6. echo "$dir/$file\n";
  7. ?>;
复制代码

可使用http://realwo.51.net/fles.php?filename=xxxxx
测试

测试过期,已删除!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP