it-swarm.com.de

Wie kann verhindert werden, dass .php-Dateien im Verzeichnis sites / default / files für nginx + php7.0-fpm ausgeführt werden?

URL zum Artikel von Drupal.org Verhindert die Ausführung von nicht vertrauenswürdigem PHP

Standardmäßig .htaccess Innerhalb sites/default/files enthält:

<IfModule mod_php5.c>
  php_flag engine off
</IfModule>

Hinzufügen von mod_php7.c Version nicht behoben.

Temporäre Lösungen sind:

ProxyPassMatch ^/(.*\.php(/.*)?)$ "fcgi://127.0.0.1:9000/var/www/drupal"

Und

<FilesMatch \.php$>
   SetHandler "proxy:fcgi://127.0.0.1:9000"
</FilesMatch>

Sie werden jedoch nicht empfohlen und sind überschreibbar.

Es gibt ein Drupal Kernproblem beim Hinzufügen von mod_php7.c bis .htaccess, aber es ist nur für Drupal 8 (wie wird das also in Drupal 7 dann gelöst?) https: //www.drupal) gelöst .org/node/2455465

Es gibt eine Lösung für Apache Deaktivieren von PHP Dateien können nicht im Verzeichnis sites/default/files ausgeführt werden? aber nicht nginx und php7.0-fpm.

Was ist die Lösung?

(Ich verwende das Modul Security Review , das meldet, dass PHPs innerhalb von sites/defaul/files ausführbar sind.)

Screenshots: enter image description here

Berechtigungen:

www-data:www-data 755 for dirs / 644 for files

.htaccess:

# Turn off all options we don't need.
Options None
Options +FollowSymLinks

# Set the catch-all handler to prevent scripts from being executed.
SetHandler Drupal_Security_Do_Not_Remove_See_SA_2006_006
<Files *>
  # Override the handler again if we're run later in the evaluation list.
  SetHandler Drupal_Security_Do_Not_Remove_See_SA_2013_003
</Files>

# If we know how to do it safely, disable the PHP engine entirely.
<IfModule mod_php5.c>
  php_flag engine off
</IfModule>

<IfModule mod_php7.c>
  php_flag engine off
</IfModule>

Ich habe nginx und php7.0-fpm neu gestartet.

5
user3108268

EDIT: Da Nginx keine .htaccess-Dateien verwendet, müssen Sie alle Ihre Anweisungen in Ihre /etc/nginx/sites-available/yoursite.tld.vhost - Datei einfügen. Platzieren Sie dieses Snippet, um die Ausführung von .php - Dateien zu verhindern:

location ~ \..*/.*\.php$ {
    return 403;
}

vor

location / {
    try_files $uri /index.php?$query_string; 
}

location ~ '\.php$|^/update.php|^/cron.php' {
    fastcgi_split_path_info ^(.+?\.php)(|/.*)$;
    include fastcgi_params;
    # Block httpoxy attacks. See https://httpoxy.org/.
    fastcgi_param HTTP_PROXY "";
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_param QUERY_STRING $query_string;
    fastcgi_intercept_errors on;
    fastcgi_read_timeout 180;
    # PHP 7 socket location (change it to fit your config)
    fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
}

Diese Regex bedeutet einfach, dass bei einer Anfrage nach /anything/../file.php Eine 403 gesendet wird, da PHP-Dateien nur selten von außen zugänglich sein sollten (außer index.php, update.php Und möglicherweise cron.php, Unten definiert).

Um alles zusammenzustellen, lesen Sie bitte das vollständige Nginx-vhost-Beispiel

0
Kojo

Dies funktioniert für nginx und zielt nur auf das Dateiverzeichnis ab:

location ~ /files/.*\.php$ {
    return 403;
}

Dies ist allgemeiner und lässt keine PHP-Datei in einem Verzeichnis direkt ausführen:

location ~ /.*/.*\.php$ {
    return 403;
}

WARNUNG, dies wird im gesamten Web veröffentlicht, funktioniert jedoch nur für versteckte Verzeichnisse:

location ~ \..*/.*\.php$ {
    return 403;
}
3
Gerald Melendez

Wie die Nginx-Site dies zeigt:

# Block access to scripts in site files directory
location ~ ^/sites/[^/]+/files/.*\.php$ {
    deny all;
}

Die vollständige Referenzdatei finden Sie hier:
https://www.nginx.com/resources/wiki/start/topics/recipes/drupal/

0
bshea