V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
just1
V2EX  ›  问与答

php 如何进行环境隔离

  •  
  •   just1 · 2016-10-05 22:17:01 +08:00 · 2804 次点击
    这是一个创建于 2978 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我的博客是 wordpress ,总是担心放在日常服务器不安全,因为 php 可以访问其他的 777 权限目录, 777 目录在有的地方难免有,有没有办法解决这个问题,让 php 只能在自己这个目录执行。

    ovear
        1
    ovear  
       2016-10-05 22:18:52 +08:00   ❤️ 1
    open_basedir
    kungfuchicken
        2
    kungfuchicken  
       2016-10-05 22:22:33 +08:00   ❤️ 1
    上 docker
    just1
        3
    just1  
    OP
       2016-10-05 22:26:23 +08:00
    @ovear 如果有多个 vhost , open_basedir 应该也没用吧(跨站)
    just1
        4
    just1  
    OP
       2016-10-05 22:26:39 +08:00
    @kungfuchicken docker 不持久化啊,而且不方便
    kungfuchicken
        5
    kungfuchicken  
       2016-10-05 22:28:01 +08:00
    @just1 docker 可以挂载 host 的目录啊....挂载后 docker 里面访问不到 host 的其他目录
    just1
        6
    just1  
    OP
       2016-10-05 22:29:06 +08:00
    @kungfuchicken 好麻烦 TAT ,虽然确实是一个方法
    ovear
        7
    ovear  
       2016-10-05 22:35:01 +08:00
    @just1 对每个 vhost 指定不同 open_basedir 就好
    jybox
        8
    jybox  
       2016-10-05 22:40:35 +08:00
    难道不是应该考虑为什么有 777 的目录么
    just1
        9
    just1  
    OP
       2016-10-05 23:01:21 +08:00
    @ovear OK ,多谢
    just1
        10
    just1  
    OP
       2016-10-05 23:02:37 +08:00
    @jybox 因为方便又想要安全(∩_∩)
    imlonghao673
        11
    imlonghao673  
       2016-10-05 23:09:57 +08:00 via Android
    @just1 安全???.jpg
    msg7086
        12
    msg7086  
       2016-10-05 23:12:32 +08:00
    除了 /tmp 之类的地方以外想不到什么地方是应该用 777 的。
    ryd994
        13
    ryd994  
       2016-10-05 23:21:14 +08:00 via Android   ❤️ 1
    1docker
    2chroot
    3 所有地方都不应该 777 ,以及 777 的都是可以公开的
    4chroot 设置起来更麻烦,最后还是 docker 方便
    lhbc
        14
    lhbc  
       2016-10-05 23:23:53 +08:00
    我想知道为什么“ 777 目录在有的地方难免有”
    我们都恨不得上 SELinux+ACL ,居然还有人给 777 目录
    shiji
        15
    shiji  
       2016-10-05 23:57:55 +08:00
    open_basedir 是很有用的,但是你得动手试一试,不能大嘴一撇随口一说。因为这里面是有坑的 : ) 要记得把 /tmp 也写进去, linux 系统用冒号分隔多个目录,对于早期 PHP 版本,目录后面加不加斜杠也是有讲究的

    关于文件权限:
    我自己的配置一般是 项目里面的文件夹 770 , 文件 640 (这个配置不适用于 CLI 模式)
    owner 是 root 或者你自己的账户, group 是 www-data
    DesignerSkyline
        16
    DesignerSkyline  
       2016-10-06 00:02:10 +08:00
    如果 WP 暂时需要更新升级,这个时候肯定是需要 777 的,需要的时候改一下,不需要的时候把权限给改回来就行。
    ivmm
        17
    ivmm  
       2016-10-06 00:03:51 +08:00
    chown -R $user /dir
    tabris17
        18
    tabris17  
       2016-10-06 00:05:58 +08:00
    open_basedir 只防 fopen ,能读写文件的方法多了去了
    shiji
        19
    shiji  
       2016-10-06 03:04:19 +08:00 via Android
    @tabris17 举个近代版本(>=5.6)的例子?/或者发个链接?我想了解一下
    cxbig
        20
    cxbig  
       2016-10-06 05:27:35 +08:00
    1. 环境隔离可以用 docker
    2. 777 是最糟糕的权限方式,你倒不如研究下如何避免使用它
    gdtv
        21
    gdtv  
       2016-10-06 06:59:51 +08:00 via iPhone
    @tabris17 求突破 open_basedir 的方法,谢谢
    tabris17
        22
    tabris17  
       2016-10-06 10:09:33 +08:00
    @shiji
    @gdtv

    利用 mysql 的 select ...... into outfile ......
    shiji
        23
    shiji  
       2016-10-06 10:23:27 +08:00
    @tabris17
    我觉得首先呢,这个方法跟 PHP 没关系啊,需要拿到 MySQL 的权限。
    其次,这个 SQL 需要当前 SQL 用户有 FILE 权限,通常来说创建的新用户默认都不会带有任何数据库核心权限( FILE,PROCESS,SHUTDOWN 之类的)。除非用户脑残,所有程序都用数据库的 root 账户跑。。

    参看: http://dev.mysql.com/doc/refman/5.7/en/select-into.html
    The SELECT ... INTO OUTFILE 'file_name' form of SELECT writes the selected rows to a file. The file is created on the server host, so you must have the FILE privilege to use this syntax.
    tabris17
        25
    tabris17  
       2016-10-06 10:43:43 +08:00
    @shiji

    还想到一个,利用.htaccess 覆盖 php.ini 配置,不过没侧过,不知道是否有效
    kn007
        26
    kn007  
       2016-10-06 10:44:54 +08:00
    如今居然还有 777 需求
    tabris17
        27
    tabris17  
       2016-10-06 10:59:26 +08:00
    @shiji

    另外 利用执行外部命令也一样可以绕过

    比如:
    shell_exec("echo sometext>/other/path/bypass.txt");
    shiji
        28
    shiji  
       2016-10-06 11:14:44 +08:00
    @tabris17 .htaccess 如果 Apache 对项目目录设置了 AllowOveride All 或者 Options 的话,应该可行.
    shell_exec 。。这个。。属于作弊!相当于已经有了木马了
    iyaozhen
        29
    iyaozhen  
       2016-10-06 11:19:01 +08:00 via Android
    @shiji 所以还是要从源头解决问题,楼主为什么要那么多 777 。😱
    regist
        30
    regist  
       2016-10-06 12:50:15 +08:00
    难道只有我一个人用 700 600 么...
    sutra
        31
    sutra  
       2016-10-06 15:38:04 +08:00
    FreeBSD Jail
    chemandy
        32
    chemandy  
       2016-10-06 18:45:22 +08:00
    从来没有 777 的路过...
    just1
        33
    just1  
    OP
       2016-10-06 18:52:43 +08:00
    尴尬、、、、
    赶快下沉主题 TAT 我比较懒而已嘛
    rainysia
        34
    rainysia  
       2016-10-06 20:59:07 +08:00
    我只能说给 777 的, 你 nginx/apache, php 绝对没配对, 而你也不知道为什么
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   999 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 19:40 · PVG 03:40 · LAX 11:40 · JFK 14:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.