2010-01-19 103 views
21

我正试图帮助一个朋友从一个网络酒店移动到另一个网站。 旧的地方已经关闭,我只有一个平坦的tar文件。PHP脚本/目录有什么权限?

该网站包含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目录。这些都不存在于新的网络服务器上。我应该创建它们吗?他们应该有什么权限?我猜想在一个单独的PHP文件中拥有密码的原因是安全性。 /php/inc目录可能具有不同的权限。

新服务器的目录:

  • /httpdos
  • /httpsdos
  • /cgi-bin
  • /conf(和其他一些人可能不相关)

我的问题

  1. 请问文件扩展名(.php)意味着什么服务器:为PHP脚本的HTML代码“包含”(<?...?>之间,并在服务器需要看文件后缀或者是无关紧要的? (据我所知,在服务器上<?...?>反应,当然)

  2. 应的公共文件(register.php在我的情况)被放置在httpdocs/目录或不服务器(Apache的我认为)反应的东西和其取出在另一个目录?

  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子树下的文件。这是否工作?服务器需要知道吗?

我知道您可能需要了解服务器配置。在你的答案中假设默认值(如果是的话,你可以知道它在哪里更改)。

回答

46

目录必须具有执行权限才能使用。通常这是0755。通过mod_php运行的PHP脚本不会被执行,而是被读取; 0644就足够了。必须编写的目录需要由运行Web服务器的用户拥有。可能还有一些关于权限的问题,例如, SELinux,但上面的内容会让你了解基础知识。

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

+0

感谢您的回答。我会把register.php放在httpdocs/php中。 现在我试着创建/ inc并包含../../inc/db_login.php,但是创建/ inc被拒绝了......应该将db_login.php放在cgi-bin中然后呢?如果apache处于安全模式,那么db_login必须位于httpdocs树中......这不是安全风险吗? – 2010-01-19 20:44:34

+0

CGI脚本应该放在'cgi-bin'中。是的,在DocumentRoot下有配置文件是潜在的安全风险; PHP可以通过配置选项来解决这个问题,该选项指定了一个可以明确包含的额外目录。但事实并非如此。 – 2010-01-19 20:48:54

+0

但是,如果register.php和db_login.php都在html文档根目录下并且它们的权限相同,那么它们在2个不同文件中的增益(安全性)是什么。我认为这个想法是围绕db_login中包含的密码提供“更多的安全性”...?如果PHP失败,代码到达客户端是不是有风险?再一次,很多人非常感谢你的时间。/C – 2010-01-19 21:26:22

1

我编写一个函数来解决这两个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; 
} 

也许这是对您有用。

+0

您应该考虑使用八进制文字而不是处理octdec()cruft,并使用'| ='而不是'+ ='。 – 2010-01-19 19:31:25

+1

您正在使用PHP脚本修复PHP脚本的权限?如果服务器的权限不足并且不允许PHP脚本运行,那么这个脚本也不会运行。虽然如果您手动修复此脚本的权限,那么您可以使用它来对其他人进行批量恢复。不过,从命令行使用'chmod -R'可能会更快。 – MidnightLightning 2010-01-19 19:34:29

+0

@MidnightLightning:即使它在Web服务器中无法正常工作,仍然可以通过CLI运行PHP脚本,假设您有shell访问权限。另外,'chmod -R'可能很危险,最好使用恰当制作的'find'代替。 – 2010-01-19 20:51:55

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服务交付给客户端的结果。只有从命令行(CLI设置)使用PHP时,脚本才需要执行权限,并且从#!/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

+0

第3点:CLI和CGI设置都需要执行权限。 – 2010-01-19 19:33:46

0

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

这是一个很好的做法,至少有一个目录在web服务器以外的地方可以保存包含文件,但PHP包含路径仍应包含'。'。

我建议你不把大量的非标准目录的根文件系统 - 默认的根目录的分布有所不同,但我通常喜欢的东西去:

/无功/网络/ htdocs目录 - 作为文档根 /usr/local/php - 用于包含文件

显然,如果您打算运行您的web服务器chrrot,则应该相应地映射它们。

所有的文件必须通过服务器在其下运行的UID可读,但是如果你可以限制,那么你关闭掉潜在的攻击向量什么是这个UID尽可能多地写。

我通常会将我的dirs设置为drwxrwSr-x,作为webdev团队的组所有者的webdev组成员拥有的drwxrwSr-x(httpd uid不在webdev组中),因此文件是-rw -rw-r--所以webdex组中的任何人都可以更改文件,并且httpd uid只能读取文件。

1)完成了文件的扩展名(.php)意味着什么服务器:

是 - 去阅读PHP的安装指南。

C.

9

设置PHP文件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将无法工作。