分享

写回答

发帖

[经验] 完全解决win主机下PHP程序路径暴露问题

GoDaddy GoDaddy 1823 人阅读 | 3 人回复

发表于 2010-11-7 04:43:01 | 显示全部楼层 |阅读模式

安装PHPWind的时候发现WIN主机路径暴露的问题,网上也没什么好的解决办法,基本都是针对程序的.
    刚开始想从web.config入手解决的.结果location无法解决,fastcgi权限不够( 查资料的时候发现微软一个站上介绍GODADDY的WIN是WINDOW2008的服务器,不错).
    接着想子文件夹使用php.ini,研究了一下发现需要修改application.config,估计狗爹也不会给改.
    最后没办法了,还是从程序入手吧,头疼医头,脚疼医脚.
   
    先是在discuz里查询了,错误的链接,发现没有任何造成路径暴露的问题(在此否定什么父路径论)
    搞了整一天,到晚上的时候忽然发现MB的DISCUZ模板HEAD部优一个base标签,phpwind也有一个base标签
     看下phpwind的header.htm的头部base
    <base id="headbase" href="$db_bbsurl/">

    再看下$db_bbsurl的定义
     $_G['siteurl'] = htmlspecialchars('http://'.$_SERVER['HTTP_HOST'].preg_replace("/\/+(api)?\/*$/i", '', substr($_G['PHP_SELF'], 0, strrpos($_G['PHP_SELF'], '/'))).'/');     

     其实主要定义就是出在PHP_SELF上

     其实对于大多数主流PHP程序来说,去掉这个<base>标签就行,或者直接自定义href,指定具体的网址
     这个标签一般都是存在于头部文件中

     但是既然是PHP_SELF出问题,我们就可以伪造他,然后全局头部引入,具体做法为

     第一步:
    新建一个auto_prepend_file.php文件,用UTF8编码保存,这个文件包含代码
<?php
    if(strrpos($PHP_SELF, '/')!=0){
    $PHP_SELF=substr($PHP_SELF, strpos($PHP_SELF, '/',2));
}
if(strrpos($_SERVER['PHP_SELF'], '/')!=0){
     $_SERVER['PHP_SELF']=substr($_SERVER['PHP_SELF'], strpos($_SERVER['PHP_SELF'], '/',2));
}
if(strrpos($_SERVER['SCRIPT_NAME'], '/')!=0){
     $_SERVER['SCRIPT_NAME']=substr($_SERVER['SCRIPT_NAME'], strpos($_SERVER['SCRIPT_NAME'], '/',2));
}
if(strrpos($_SERVER['REQUEST_URI'], '/')!=0){
     $_SERVER['REQUEST_URI']=substr($_SERVER['REQUEST_URI'], strpos($_SERVER['REQUEST_URI'], '/',2));
}
?>
之所以没伪造DOCUMENT_ROOT,是因为现在很多程序用这个,容易造成错误,80%的可能性,只好处理PHP_SELF

    第二步:
    上传auto_prepend_file.php至空间根目录


    第三步:
    去空间控制面板找到你的空间绝对路径
     比如:
    D:\Hosting\6902410\html

   第四步:
   在你的根目录下的php.ini最下面加两句代码
   include_path=D:\Hosting\6902410\html
   auto_prepend_file = auto_prepend_file.php;

   如果你没有php.ini,我下面有提供下载,注意改成你自己的绝对路径,上传到空间根目录

   第五步:
   进入iis manage,点recycle app pool

   直至你就一劳永逸的解决了路径问题.

   注意:因为有些程序会把网址固化到数据库或者配置文件中,比如WORDPRESS,PHPWIND.如果你在程序安装后再设定这个,那么会有一部分链接还是有路径问题,除非你能找到他修改的地方,比如WP的设置里.所以建议,在此项设置完成后再装程序

   这个跟那些老的解决路径方法没有什么冲突,应该,不过建议用老方法的都改过来.


   对PHP不熟,搞了12个小时才搞定,郁闷啊,太困了,只测试了phpwind,大家 有兴趣的测试下其他的程序.另外还存在一个问题,访问子文件夹的时候.如果使用http://xxx.com/xx就会暴露路径.用http://xxx.com/xx/就不会,这个应该做个跳转就行了应该

    欢迎大家来交流,QQ:1276011     HTTP://BLOG.SNIU.COM

   J加上上一篇:win主机安装Zend Optimizer以解决SHOEX的安装  http://bbs.idcspy.com/thread-129350-1-1.html
两个主要问题就解决了,以后就能安心做站啦,嘿嘿.

php_ini_auto_prepend_file.zip

737 Bytes, 下载次数: 691

php_ini_auto_prepend_file.zip

回答|共 3 个

sniucom

发表于 2010-11-7 12:16:46 | 显示全部楼层

起来了,谁测试了其它的程序了没

sniucom

发表于 2010-11-7 12:33:49 | 显示全部楼层

抱歉,上面的压缩包里的auto_prepend_file.php给错,那是我做的第一版本,会有点小问题的.
代码应该是
<?php
    if(strrpos($PHP_SELF, '/')!=0){
    $PHP_SELF=substr($PHP_SELF, strpos($PHP_SELF, '/',2));
}
if(strrpos($_SERVER['PHP_SELF'], '/')!=0){
     $_SERVER['PHP_SELF']=substr($_SERVER['PHP_SELF'], strpos($_SERVER['PHP_SELF'], '/',2));
}
if(strrpos($_SERVER['SCRIPT_NAME'], '/')!=0){
     $_SERVER['SCRIPT_NAME']=substr($_SERVER['SCRIPT_NAME'], strpos($_SERVER['SCRIPT_NAME'], '/',2));
}
if(strrpos($_SERVER['REQUEST_URI'], '/')!=0){
     $_SERVER['REQUEST_URI']=substr($_SERVER['REQUEST_URI'], strpos($_SERVER['REQUEST_URI'], '/',2));
}
?>
也就是上面贴出来的,大家注意

sniucom

发表于 2010-11-7 21:59:52 | 显示全部楼层

今天又重装了SHOPEX,发现路径也是通过了
您需要登录后才可以回帖 登录 | 注册

本版积分规则