限制PHP执行?

限制PHP执行?,php,mysql,security,Php,Mysql,Security,我们正在用模板系统从头开始制作wordpress类型的系统,我想知道安全性。我们希望有一个SaaS模型,用户将与其他一些用户在同一台服务器上,但我们也希望为他们提供修改自己视图文件的工具,这意味着PHP访问。我们使用Laravel作为框架。作为一个长期使用Dreamhost的用户,我知道你可以将同一台机器划分到多个环境中,但并不确定他们是用什么来实现这一点的 如何防止执行eval()等命令、系统命令,并限制用户对fopen的访问(我假设这主要是通过linux用户权限实现的)。我想让他们直接访问V

我们正在用模板系统从头开始制作wordpress类型的系统,我想知道安全性。我们希望有一个SaaS模型,用户将与其他一些用户在同一台服务器上,但我们也希望为他们提供修改自己视图文件的工具,这意味着PHP访问。我们使用Laravel作为框架。作为一个长期使用Dreamhost的用户,我知道你可以将同一台机器划分到多个环境中,但并不确定他们是用什么来实现这一点的


如何防止执行eval()等命令、系统命令,并限制用户对fopen的访问(我假设这主要是通过linux用户权限实现的)。我想让他们直接访问Views文件夹,并开发他们自己的解决方案,而不是强迫他们通过我,但不会造成太大的危害。如果除了单独的用户之外还有mysql方面的考虑,也可以随意插话。

有几个层需要保护

一些主机错误地依赖PHP“保护”,如open_basedir、safe_模式(较旧的PHP)、disable_函数等

<强>甚至PHP不认为它们是安全特性-< /强>

任何利用PHP的漏洞都可以禁用这些功能,然后整个系统就完蛋了,不要这样做

应该怎样做 底部
  • 每个托管站点的单独操作系统级别/系统用户
  • 正确的权限(其中一个不能查看/编辑另一个的页面)-同时确保子目录具有正确的权限,因为它们将是相似的
  • 单独的会话文件(很多WebHosts将每个PHP托管站点的会话文件放在同一个目录中,这很糟糕
Apache终于为这一点找到了自己的模块-

长话短说:想象一下,当你在机器上给用户一个外壳(在他自己的uid下)——他无法对其他托管站点做任何事情

  • 不同的uid/gid
  • 系统权限
  • framworks如SELinux、AppArmor和类似产品
  • 如果你想成为一个铁杆,那就要保证安全。但是这个系统将更难维护
  • 上升? 您可以使用更多的硬核。我见过的最好的是apache共享库(或您使用的任何东西)-当apache开始使用
    LD_PRELOAD
    时使用该库,它实现了所有潜在的恶意系统调用,如
    system()
    execve()
    ,以及基本上任何其他您认为不好的调用

    我还没有看到一个很好的实现(除了某个地方的自定义实现)——如果我错了,请纠正我

    请确保为此实现一个白名单,例如PHP中的mail()默认执行sendmail,这将不再有效

    结论 在全局php.ini中添加经典的disable_函数、open_basedir等,在每个vhost中添加session.save_路径-将会话放入用户目录。确保用户不共享任何内容

    正确实现底层操作系统级分离

    通过grsec和LD_预加载库挂接系统调用获取硬核


    分离,分离,分离。很快,像Docker这样的系统将提供基于LXC的容器来在内核级别分离用户,但它还没有完全准备好生产(imho)。

    您需要保护好几个层

    一些主机错误地依赖PHP“保护”,如open_basedir、safe_模式(较旧的PHP)、disable_函数等

    <强>甚至PHP不认为它们是安全特性-< /强>

    任何利用PHP的漏洞都可以禁用这些功能,然后整个系统就完蛋了,不要这样做

    应该怎样做 底部
    • 每个托管站点的单独操作系统级别/系统用户
    • 正确的权限(其中一个不能查看/编辑另一个的页面)-同时确保子目录具有正确的权限,因为它们将是相似的
    • 单独的会话文件(很多WebHosts将每个PHP托管站点的会话文件放在同一个目录中,这很糟糕
    Apache终于为这一点找到了自己的模块-

    长话短说:想象一下,当你在机器上给用户一个外壳(在他自己的uid下)——他无法对其他托管站点做任何事情

  • 不同的uid/gid
  • 系统权限
  • framworks如SELinux、AppArmor和类似产品
  • 如果你想成为一个铁杆,那就要保证安全。但是这个系统将更难维护
  • 上升? 您可以使用更多的硬核。我见过的最好的是apache共享库(或您使用的任何东西)-当apache开始使用
    LD_PRELOAD
    时使用该库,它实现了所有潜在的恶意系统调用,如
    system()
    execve()
    ,以及基本上任何其他您认为不好的调用

    我还没有看到一个很好的实现(除了某个地方的自定义实现)——如果我错了,请纠正我

    请确保为此实现一个白名单,例如PHP中的mail()默认执行sendmail,这将不再有效

    结论 在全局php.ini中添加经典的disable_函数、open_basedir等,在每个vhost中添加session.save_路径-将会话放入用户目录。确保用户不共享任何内容

    正确实现底层操作系统级分离

    通过grsec和LD_预加载库挂接系统调用获取硬核


    分离,分离,分离。很快,像Docker这样的系统将提供基于LXC的容器来在内核级别分离用户,但它还没有完全准备好生产(imho)。

    那么,你真正的问题是什么?你可以禁用eval()、exec()等命令,etc使用php.ini
    disable_函数
    directive您可以使用php禁用对外部文件的访问。