web-dev-qa-db-fra.com

Quelles autorisations pour PHP scripts / répertoires?

J'essaie d'aider un ami à déplacer un site Web d'un hôtel Web à un autre. L'ancien lieu est déjà fermé, je n'ai qu'un fichier tar plat de ce qu'il y avait dedans.

Le site Web contenait des documents HTML et on pouvait télécharger un petit Java (à charger sur le téléphone mobile) pour envoyer des données au site Web.

L'application mobile Java a envoyé une chaîne à URL=<Host>/php/register.php. Ce script php comprenait un autre script php (../inc/db_login.php), Qui se connectait à une base de données SQL à l'aide de la fonction $link=mysql_connect(). Un autre fichier, register.php, A fait l'insertion SQL pour placer les nouvelles données envoyées dans la base de données.

Ma question est fondamentalement, où dois-je mettre ces 2 PHP sur le nouveau site Web et quelles autorisations les répertoires et les fichiers devraient avoir?

L'ancien serveur Web avait évidemment un répertoire /php Et /inc. Rien de tout cela n'existe sur le nouveau serveur Web. Dois-je les créer? Quelle autorisation devraient-ils avoir? J'imagine que la raison d'avoir le mot de passe dans un fichier PHP PHP était de sécurité. Le répertoire /php Et /inc Avait probablement des autorisations différentes.

Le nouveau serveur a des répertoires:

  • /httpdos
  • /httpsdos
  • /cgi-bin
  • /conf (Et certains autres sans doute non pertinents)

Mes questions

  1. L'extension de fichier (.php) Signifie-t-elle quelque chose pour le serveur: comme PHP sont "inclus" dans le code HTML (entre <?...?>, Le serveur fait-il besoin de regarder le suffixe du fichier ou est-il hors de propos? (Je comprends que le serveur réagit sur le <?...?>, bien sûr)

  2. le fichier public (register.php dans mon cas) doit-il être placé dans le répertoire httpdocs/ ou le serveur (Apache je pense) réagit sur quelque chose et le récupère dans un autre répertoire?

  3. Le script PHP doit-il avoir la permission R-X (Lire et exécuter), --X (Exécuter) ou R-- (Lire)? À partir d'un système d'exploitation perspective, je suppose qu'Apache ne fait que lire ces fichiers, ce qui signifie qu'ils devraient être R--, mais cela signifierait que si PHP est "arrêté", le client obtiendrait tous les = PHP code dans son navigateur (?). Je préférerais que ce soit --X Mais comme ce n'est ni un binaire ni un #!, Je suppose qu'il doit être --R?

  4. Si le script public PHP peut être placé dans un autre répertoire (par exemple /php Au lieu de /httpdocs)), Que devrait /php (Et le script) avoir la permission?. Je suppose que le serveur doit connaître ce répertoire /php (ou y a-t-il des valeurs par défaut habituelles?)

  5. Le PHP inclus (../inc/db_login.php, Contenant le mot de passe SQL) ne devrait pas être sous /httpdocs Je suppose. Cela signifie que mon register.php Comprend un fichier qui n'est pas sous la sous-arborescence /httpdocs. Est-ce que cela fonctionne? Le serveur doit-il être informé?

Je comprends que vous pourriez avoir besoin de connaître la configuration du serveur. Supposez simplement la valeur par défaut dans votre réponse (et vous pouvez dire où elle est modifiée si elle l'est).

22
christophe milard

Les répertoires doivent avoir des autorisations d'exécution pour être utilisables. Il s'agit généralement de 0755. PHP scripts exécutés via mod_php ne sont pas exécutés mais plutôt lus; 0644 suffira pour cela. Les répertoires qui doivent être écrits doivent appartenir à l'utilisateur sous lequel le serveur Web s'exécute. Il peut y avoir des préoccupations supplémentaires concernant les autorisations, par exemple SELinux, mais ce qui précède vous aidera à traverser les bases.

Les documents auxquels d'autres utilisateurs ou clients externes ne doivent pas accéder doivent être 0600, appartenant à l'utilisateur du serveur Web et situé en dehors de DocumentRoot. Notez que l'exécution de mod_php en mode sans échec empêchera les scripts d'inclure quoi que ce soit en dehors de DocumentRoot; une faille lamentable.

51

Définissez les fichiers php sur 640

Pour sécurité maximale , vous devez définir des autorisations minimales, qui est 640 .

  • Le propriétaire 6 serait celui qui télécharge les fichiers.
  • Le groupe 4 serait celui qui sert le fichier. Faites d'Apache un membre du groupe.
  • personne signifie qu'aucun autre utilisateur ne peut lire ce fichier. C'est important car les scripts php ont parfois des mots de passe et d'autres données sensibles.

Ne laissez jamais les scripts php être lus par tout le monde.

Commandes utiles:

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

Que font ces commandes:

  1. Changez la propriété de file.php afin que l'utilisateur puisse lire et écrire, lire en groupe.
  2. Changez la propriété de file.php, par le nom d'utilisateur et le nom de groupe choisis.
  3. Ajoutez Apache au groupe, afin qu'Apache puisse servir le fichier. Sinon, 640 ne fonctionnera pas.
13
kintsukuroi

1) Les fichiers qui se terminent par une extension .php sont transmis au compilateur PHP par Apache. Si la configuration appropriée n'est pas configurée pour le faire, PHP = les fichiers sont servis sous forme de fichiers texte par le serveur. La ligne de configuration Apache "AddHandler php5-script php "dans le fichier httpd.conf est la méthode PHP5 de configuration.

2) register.php doit être accessible sur http://www.example.com/php/register.php , car l'application Java la recherche) , donc dans le dossier Apache htdocs, il doit y avoir un dossier "php" contenant le fichier register.php.

3) PHP nécessitent un accès en lecture à l'utilisateur qui exécute le service Apache. L'utilisation de PHP comme module Apache n'a pas de "service" pour parler de ce qui est distinct) pour PHP. Au lieu de cela, le service Apache, lorsqu'il reçoit une demande pour un fichier PHP, effectue un appel Shell au binaire PHP pour analyser le fichier et la main le service Apache le résultat, qu'il sert au client. Ce n'est que si vous utilisez PHP à partir de la ligne de commande (configuration CLI) que les scripts auront besoin d'une autorisation d'exécution et commenceront par un #!/path/to/php-bin ligne.

4) Le fichier demandé (register.php) doit être dans htdocs pour être servi par Apache. Si PHP s'exécute avec le "Mode sans échec" désactivé, register.php pourrait inclure un fichier qui se trouvait en dehors du dossier htdocs.

5) Le chemin "../inc/db_login.php "est relatif au script PHP qui a été récupéré à l'origine (register.php), donc, puisque register.php est dans htdocs/php/register.php, cela mettrait db_login.php à htdocs/inc/db_login.php.

1
MidnightLightning

J'ai codé une fonction pour résoudre les problèmes d'autorisations dans les deux PHP/SuPHP et similaire:

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;
}

C'est peut-être utile pour vous.

0
Alix Axel

Tous les fichiers PHP qui sont destinés à être adressés directement via des URL peuvent résider avec bonheur dans les mêmes répertoires que le contenu statique (c'est la pratique habituelle).

Il est recommandé d'avoir au moins un répertoire en dehors de ceux visibles depuis le serveur Web pour contenir les fichiers include, mais le chemin d'accès PHP include doit toujours inclure ".".

Je recommanderais de ne pas mettre beaucoup de répertoires non standard dans votre système de fichiers racine - la racine Web par défaut varie selon la distribution, mais j'utilise généralement quelque chose comme:

/ var/www/htdocs - comme racine du document/usr/local/php - pour les fichiers d'inclusion

Évidemment, si vous avez l'intention d'exécuter votre chrrot de serveur Web, ceux-ci doivent être mappés en conséquence.

Tous les fichiers doivent être lisibles par l'uid sous lequel le serveur Web s'exécute, mais si vous pouvez restreindre autant que possible ce qui est inscriptible par cet uid, vous fermez un vecteur d'attaque potentiel.

Je vais généralement avec la configuration de mes répertoires en tant que drwxrwSr-x appartenant à un membre d'un groupe webdev avec la propriété du groupe en tant qu'équipe webdev, (l'uid httpd n'est pas dans le groupe webdev) et les fichiers sont donc -rw-rw-r - Ainsi, n'importe qui dans le groupe webdex peut modifier des fichiers et l'uid httpd ne peut lire que les fichiers.

1) L'extension de fichiers (.php) signifie-t-elle quelque chose pour le serveur:

Oui - allez lire le PHP guide d'installation.

C.

0
symcbean