0

We have a little CMS where we create folders for specific content. Everything was working fine until we moved to a new server; I noticed that on the new server the "user" from PHP (CMS action) is different from the FTP user. This was not happening before, but now every time a new folder is created through the PHP script it can not be modified through FTP.

I noticed that the owner of the PHP folders is 99 99 which I thing is 'nobody'.

What do I need to do in order for it to work as it was working in the previous server? On my PHP scripts the permissions are set to 0777 so I really don't know what else to do.

I have access to SSH, WHM and cpanel, maybe there is something inside the PHP settings or APACHE settings that I can modify, maybe straight through WHM.

Please, if there is something to work on the command shell describe it step by step as I mostly know nothing about shell scripting.

This is the code I use in PHP to create my folders:

$year_folder = date(Y)."/";
$user_folder = $year_folder."$alias/";
$section_folder = $user_folder."$section/";

//CREATE YEAR FOLDER and persmissions (Forbiden to access directly)
if (!file_exists($year_folder)) {
    mkdir("$year_folder", 0711);// create directory
}

//CREATE USER FOLDER
if (!file_exists($user_folder)) {
    mkdir("$user_folder", 0777);// create directory
}           

    //CREATE CLASS FOLDER
if (!file_exists($section_folder)) {
    mkdir("$section_folder", 0777);
}

Thanks!

4

2 に答える 2

0

chown (http://php.net/manual/en/function.chown.php) を試すこともできますが、サーバーが Web サーバーによるファイルの変更を許可するかどうかによって異なります。

于 2012-06-21T20:46:32.333 に答える
0

まず、ファイルを 0777 に設定しないでください。その必要はありません。アプリケーションから指示された場合は、危険なセキュリティ上の欠陥が発生する可能性があるため、そのアプリケーションの実装を再考する必要があります。

Apache はどのユーザーで実行されていますか? このフォルダへのアクセスが必要なユーザーは?

次に、chmodまたはchgrpを使用します。

唯一の方法ではありませんが、最も安全な方法の 1 つは、chgrpを使用して、アクセスが必要なユーザーまたはユーザーのグループにフォルダーを割り当てることです。

所有者とグループ (たとえば 760 または 770 など) に読み取り/書き込みアクセスを許可し、その他を 0 のままにしておくと、自分自身とグループ内の他のユーザーにアクセスを許可しながら、アプリケーションを保護できます。

chgrp または chmod コマンドを追加するフォルダーを作成する PHP CMS スクリプトを編集してもよろしいですか? アップデート

ディレクトリを 3 回作成する代わりに、再帰を使用して 1 回作成できます。

$year_folder = date(Y)."/";
$user_folder = $year_folder."$alias/";
$section_folder = $user_folder."$section/";

//CREATE Folder
if (!is_dir($section_folder)) { // changed to is_dir to keep syntax within context
    if(!mkdir($section_folder, 0764, true)){
        echo "Failed to create directory: $section_folder";
    }
}

デバッグ手順として、上記のコードの後に​​次を追加して権限を確認できます。

$perms = fileperms($section_folder);

if (($perms & 0xC000) == 0xC000) {
    // Socket
    $info = 's';
} elseif (($perms & 0xA000) == 0xA000) {
    // Symbolic Link
    $info = 'l';
} elseif (($perms & 0x8000) == 0x8000) {
    // Regular
    $info = '-';
} elseif (($perms & 0x6000) == 0x6000) {
    // Block special
    $info = 'b';
} elseif (($perms & 0x4000) == 0x4000) {
    // Directory
    $info = 'd';
} elseif (($perms & 0x2000) == 0x2000) {
    // Character special
    $info = 'c';
} elseif (($perms & 0x1000) == 0x1000) {
    // FIFO pipe
    $info = 'p';
} else {
    // Unknown
    $info = 'u';
}

// Owner
$info .= (($perms & 0x0100) ? 'r' : '-');
$info .= (($perms & 0x0080) ? 'w' : '-');
$info .= (($perms & 0x0040) ?
            (($perms & 0x0800) ? 's' : 'x' ) :
            (($perms & 0x0800) ? 'S' : '-'));

// Group
$info .= (($perms & 0x0020) ? 'r' : '-');
$info .= (($perms & 0x0010) ? 'w' : '-');
$info .= (($perms & 0x0008) ?
            (($perms & 0x0400) ? 's' : 'x' ) :
            (($perms & 0x0400) ? 'S' : '-'));

// World
$info .= (($perms & 0x0004) ? 'r' : '-');
$info .= (($perms & 0x0002) ? 'w' : '-');
$info .= (($perms & 0x0001) ?
            (($perms & 0x0200) ? 't' : 'x' ) :
            (($perms & 0x0200) ? 'T' : '-'));

echo $info;

上記はエコーするはずです:

-rwxrw--r--
于 2012-06-21T21:57:51.037 に答える