1

现在我的网络应用程序在我的本地机器上有这个文件结构

 env
    tutorial
        tutorial
            templates
                home.pt
            static
                pages
                    1.html
                    2.html
                    3.html
                     ....
            views.py
            __init__.py

pages目录下的html文件是由表单生成的。我想让这个 pages 目录可写,以便用户可以通过应用程序向其中添加 html 文件,但使所有其他目录不可写且只能读取。我一直在阅读有关 chmod 的内容,看起来像

chmod a+x env/tutorial/tutorial/static/pages

将使该页面目录可写。但是我怎样才能确保只有那个目录是可写的(所有其他的都是不可写的和只读的)?会不会只是

chmod a-x env

显然我会先执行这个命令。当我执行它时,我应该在哪个目录中。如果我在我的本地机器上正确地完成了所有这些,我是否仍然能够开发(添加代码等)或者我应该等到我全部完成。当我将应用程序放在 Web 服务器上时,这些权限会被保留,还是必须以不同的方式再次执行?

4

2 回答 2

2

在生产环境中,Web 服务器通常以非特权用户身份运行,例如www-data或某事。此类用户通常没有设置登录 shell 并且不拥有文件系统上的文件,因此如果您的应用程序中的缺陷允许攻击者在机器上运行任意代码,他们仍然无法修改任何文件。

因此,在生产环境中,确保 Web 服务器用户无法修改任何文件的最简单方法是将文件的所有权更改为 Web 服务器有效用户以外的其他用户。您的普通登录用户或者root是很好的候选人:

chown -R bigboy:bigboy /opt/where/my/code/is

或者

sudo chown -R root:root /opt/where/my/code/is

正常umask设置将允许 Web 服务器读取文件但不允许写入任何内容。非常适合典型的 Web 应用程序。

因此,要授予网络服务器对某个目录的写入权限,您可以将目录的所有权更改为网络服务器的有效用户:

sudo chown -R www-data /opt/where/my/static/directory/is

开发环境中,您通常以普通登录用户身份运行该pserve命令,因此撤销用户的读取权限是不切实际的,因为您将无法编辑任何文件。最简单的方法是将另一个用户添加到系统,chown将您的静态目录添加到该用户,以该用户身份打开终端外壳并从那里运行服务器。

sudo chown -R testuser:testuser env/tutorial/tutorial/static/pages
sudo su testuser
env/bin/pserve ...

或者,在开发环境中,您可以继续以普通登录用户身份运行所有内容,因为您通常是唯一可以访问服务器的人。

于 2013-02-09T10:52:24.987 回答
1

不,

chmod a+x env/tutorial/tutorial/static/pages

设置该目录的执行位。您想要的是为每个运行 rails 的用户(或可能的组)在该目录上设置写入位。对于当前用户,执行:

chmod +w env/tutorial/tutorial/static/pages

从 chmod 手册页——看看底部的符号模式表(Mac OSX):

MODES
 Modes may be absolute or symbolic.  An absolute mode is an octal number constructed from the sum of one or more
 of the following values:

       4000    (the set-user-ID-on-execution bit) Executable files with this bit set will run with effective uid
               set to the uid of the file owner.  Directories with the set-user-id bit set will force all files
               and sub-directories created in them to be owned by the directory owner and not by the uid of the
               creating process, if the underlying file system supports this feature: see chmod(2) and the
               suiddir option to mount(8).
       2000    (the set-group-ID-on-execution bit) Executable files with this bit set will run with effective gid
               set to the gid of the file owner.
       1000    (the sticky bit) See chmod(2) and sticky(8).
       0400    Allow read by owner.
       0200    Allow write by owner.
       0100    For files, allow execution by owner.  For directories, allow the owner to search in the directory.
       0040    Allow read by group members.
       0020    Allow write by group members.
       0010    For files, allow execution by group members.  For directories, allow group members to search in
               the directory.
       0004    Allow read by others.
       0002    Allow write by others.
       0001    For files, allow execution by others.  For directories allow others to search in the directory.

 For example, the absolute mode that permits read, write and execute by the owner, read and execute by group mem-
 bers, read and execute by others, and no set-uid or set-gid behaviour is 755 (400+200+100+040+010+004+001).

 The symbolic mode is described by the following grammar:

       mode         ::= clause [, clause ...]
       clause       ::= [who ...] [action ...] action
       action       ::= op [perm ...]
       who          ::= a | u | g | o
       op           ::= + | - | =
       perm         ::= r | s | t | w | x | X | u | g | o
于 2013-02-08T21:05:53.683 回答