PHP脚本/目录有什么权限?

时间:2010-01-19 19:07:14

标签: php sql apache permissions

我正在努力帮助朋友将网站从一个网站迁移到另一个网站。 旧的地方已经关闭,我只有一个平坦的tar文件,里面有它。

该网站包含HTML文档,可以下载一个小型Java应用程序(将在手机上加载)以将数据发送到网站。

移动Java应用程序向URL=<HOST>/php/register.php发送了一个字符串。这个php脚本包含另一个php脚本(../inc/db_login.php),它使用$link=mysql_connect()连接到SQL DB。另一个文件register.php执行了SQL插入,用于将新发送的数据放入数据库中。

我的问题是基本的,我应该在新网站上放置这2个PHP文件以及目录和文件应该具有哪些权限?

旧的Web服务器显然有/php/inc个目录。这些都不存在于新的Web服务器上。我应该创建它们吗?他们应该获得什么许可?我想在单独的PHP文件中使用密码的原因是安全性。 /php/inc目录可能具有不同的权限。

新服务器有目录:

  • /httpdos
  • /httpsdos
  • /cgi-bin
  • /conf(以及其他一些可能不相关的内容)

我的问题

  1. 文件扩展名(.php)是否对服务器有意义:因为PHP脚本被“包含”在HTML代码中(<?...?>之间),服务器是否需要查看文件后缀还是无关紧要?(我知道服务器对<?...?>做出反应,当然)

  2. 应该将公共文件(在我的情况下为register.php)放在httpdocs/目录中,还是服务器(我认为是apache)对某些事情做出反应并将其提取到另一个目录中?< / p>

  3. PHP脚本是否应具有权限R-X(读取和执行),--X(执行)或R--(读取)?从操作系统的角度来看,我猜apache只是读取这些文件,这意味着它们应该是R--,但这意味着如果PHP服务被“停止”,客户端将在其浏览器中获取所有PHP代码(?) 。我希望它是--X,但由于这既不是二进制也不是#!,我想它必须是--R

  4. 如果公共PHP脚本可以放在另一个目录中(例如/php而不是/httpdocs/php(和脚本)应该获得哪些权限?我想服务器必须知道这个/php目录(或者通常有默认值吗?)

  5. 包含的PHP脚本(../inc/db_login.php,包含SQL密码)不应该在/httpdocs以下。这意味着我的register.php包含的文件不在/httpdocs子树下。这有用吗?服务器需要知道吗?

  6. 据我所知,您可能需要了解服务器配置。只需假设答案中的默认值(如果有的话,你可以知道它的变化)。

6 个答案:

答案 0 :(得分:51)

目录必须具有可执行的执行权限。通常这是0755。通过mod_php运行的PHP脚本不会被执行,而是被读取; 0644就足够了。必须写入的目录需要由Web服务器运行的用户拥有。可能存在关于权限的其他问题,例如SELinux,但上面的内容将帮助您了解基础知识。

其他用户或外部客户端不得访问的文档应为0600,由Web服务器用户拥有,位于DocumentRoot之外。请注意,在安全模式下运行mod_php将阻止脚本包含DocumentRoot之外的任何内容;一个可悲的缺陷。

答案 1 :(得分:12)

将php文件设置为640

  

对于 最高安全性 ,您应该设置最低权限   是 640

  • 所有者6 将是上传文件的人。
  • 第4组将是提供该文件的人。让apache成为小组成员。
  • nobody 0 表示没有其他用户可以阅读此文件。它非常重要,因为php脚本有时会有密码和其他敏感数据。

绝不允许所有人阅读php脚本。

  

有用的命令:

chmod 640 file.php
chown user:group file.php
usermod -a -G group apache
  

这些命令正在做什么:

  1. 更改file.php的所有权,以便用户可以读写,分组阅读。
  2. 将file.php的所有权更改为所选的用户名和组名。
  3. 将apache添加到组中,以便apache可以为该文件提供服务。否则640将无效。

答案 2 :(得分:1)

1)以.php扩展名结尾的文件由Apache传递给PHP编译器。如果没有设置正确的配置,PHP文件将由服务器作为文本文件提供。 httpd.conf文件中的Apache配置行“AddHandler php5-script php”是PHP5设置它的方法。

2)register.php需要在http://www.example.com/php/register.php访问,因为java应用正在寻找它,所以在Apache htdocs文件夹中,需要有一个带有register.php文件的“php”文件夹在它。

3)PHP文件需要运行Apache服务的用户具有读访问权限。使用PHP作为Apache模块没有'服务'可以说PHP的单独。相反,当Apache服务获得对PHP文件的请求时,它会对PHP二进制文件进行shell调用以解析文件,并将Apache服务的结果交给客户端。只有当您从命令行使用PHP(CLI设置)时,脚本才需要执行权限,并以#!/path/to/php-bin行开头。

4)请求的文件(register.php)需要在htdocs中才能由Apache提供服务。如果PHP在禁用“安全模式”的情况下运行,则register.php可能包含一个位于htdocs文件夹之外的文件。

5)路径“../inc/db_login.php”是相对于最初提取的PHP脚本(register.php),所以,因为register.php在htdocs/php/register.php中,所以会放入db_login.php在htdocs/inc/db_login.php

答案 3 :(得分:0)

我编写了一个函数来解决PHP / SuPHP和类似的权限问题:

function realChmod($path, $chmod = null)
{
    if (file_exists($path) === true)
    {
        if (is_null($chmod) === true)
        {
            $chmod = (is_file($path) === true) ? 644 : 755;

            if (in_array(get_current_user(), array('apache', 'httpd', 'nobody', 'system', 'webdaemon', 'www', 'www-data')) === true)
            {
                $chmod += 22;
            }
        }

        return chmod($path, octdec(intval($chmod)));
    }

    return false;
}

也许它对你有用。

答案 4 :(得分:0)

所有旨在通过URL直接寻址的PHP文件都可以很好地驻留在与静态内容相同的目录中(这是通常的做法)。

最好在Web服务器可见的目录之外至少有一个目录来保存包含文件,但PHP包含路径仍应包含'。'。

我建议不要在你的根文件系统中放置很多非标准目录 - 默认的webroot因发行版而异,但我通常会选择以下内容:

/ var / www / htdocs - 作为文档根目录 / usr / local / php - 包含文件

显然,如果你打算运行你的webserver chrrot,那么应该相应地映射它们。

所有文件必须由运行Web服务器的uid读取,但是如果您可以尽可能地限制此uid可写的内容,则关闭潜在的攻击媒介。

我通常设置我的目录为drwxrwSr-x由webdev组成员拥有,其中团队所有权为webdev团队,(httpd uid不在webdev组中),因此文件是-rw- rw-r--所以webdex组中的任何人都可以更改文件,而httpd uid只能读取文件。

  

1)文件扩展名(.php)对服务器意味着什么:

是 - 请阅读PHP安装指南。

下进行。

答案 5 :(得分:0)

假设您的SFTP / FTP用户为johndoe,而Web服务器组为www-datajohndoe仅读取,写入文件,但不执行文件(就我而言,永远不会)。通常来自www-data组的Web服务器软件Apache / Nginx可以读取/写入/执行文件。其他用户?他们在这里做什么??? 因此,我曾经设置0670rw-rwx---)并始终为我工作:)