2017-05-07 2 views
1

Um PHP lokale Dateieinschluss-Angriffe zu verhindern, möchte ich die Ausführung aller PHP-Dateien in einem Verzeichnis vollständig deaktivieren. Wenn Sie die Zeile php_flag engine off in der .htcaccess-Datei verwenden, wird ein 500-Fehler verursacht. Laut another question ist dies auf die Art der Installation von PHP zurückzuführen.Deaktivieren Sie die PHP-Ausführung in einem Verzeichnis

Gibt es eine andere Möglichkeit, die Ausführung von PHP zu verhindern, wenn die PHP-Installation nicht geändert werden kann?

Update: Die Dateien müssen nicht unbedingt die Endung .php haben.

+0

Was also möchten Sie tun, wenn ein Benutzer auf eine PHP-Datei in diesem Verzeichnis zugreift? Hat es zurück gedient, als ob es eine einfache Textdatei ist? – rickdenhaan

+0

Es ist nur für Dateien mit '.php' Erweiterung? – Croises

+0

Die Dateien können vom Benutzer sowieso nicht direkt aufgerufen werden. Ich möchte nur verhindern, dass alle Dateien (nicht nur solche mit .php-Endungen) ausgeführt werden, so dass sie auch nicht aus einer anderen PHP-Datei ausgeführt werden können. – kot

Antwort

2

Fügen Sie diese auf Ihre .htaccess Datei

<FilesMatch \.php$> 
    SetHandler None 
</FilesMatch> 
+0

Beachten Sie, dass dies (nur) die Ausführung von Code verhindert, wenn die Datei '.php' direkt über HTTP angefordert wird. Es verhindert nicht unbedingt, dass PHP-Dateien in diesem Verzeichnis ausgeführt werden, wenn sie 'include()' 'sind oder von einem anderen Skript auf dem Server aufgerufen werden. – MrWhite

+0

Ich habe meine Frage aktualisiert, so ist es klar, dass die Dateien nicht die PHP-Endung haben. Kann diese Antwort geändert werden, um alle Handler aus den Dateien zu entfernen? Die einzigen Dinge, die ich mit den Dateien machen möchte, sind das Erstellen, Lesen und Löschen von Dateien. Sie sollten in keiner Weise zugänglich oder ausführbar sein. – kot

+0

PHP wird interpretiert, nicht kompiliert - also gibt es keinen Unterschied zwischen lesbar und ausführbar. –

-1

dies unter dem Header <?php hinzufügen, wird dies eine direkte Ausführung von php

defined('BASEPATH') OR exit('No direct script access allowed'); 
+0

Dieser (oder ähnliche) Code eignet sich für Bibliotheken und Include-Dateien. Es hilft aber nicht, wenn es sich bei den Dateien um User Generated Content handelt (was der Normalfall ist, dass Sie den PHP Händler ausschalten wollen). – eckes

+0

Warum dies nicht in generierten Inhalten enthalten? Er fragt, ob es "Andere Wege" gibt, um die Ausführung von PHP zu verhindern. – Eyy

+1

Weil es etwas schwierig ist, einem Angreifer zu sagen, dass er nur PHP-Skripte hochladen soll, die nicht ausgeführt werden können - schätze ich. – eckes

0

Sie bauen Ihre Website über „allow all verhindern, dann leugne "Logik". Sie sollten es mit der Logik "alles verweigern, dann zulassen" erstellen. Wenn Sie Apache beispielsweise anweisen, alle Dateien in einem bestimmten Verzeichnis bereitzustellen, überschreiben Sie diese Konfiguration, um Apache mitzuteilen, dass einige Dateien in diesem Verzeichnis nicht bereitgestellt werden sollen. Das heißt, Sie wahrscheinlich so etwas wie dieses:

<VirtualHost *:80> 
    ServerName foo.com 
    DocumentRoot "/path/to/files" 
</VirtualHost> 

Mit einem Verzeichnisstruktur wie folgt aus:

/path/to/files 
    index.php 
    config.php 
/path/to/files/lib 
    db.php 
    etc.php 
    other_thing.php 

Mit diesem Aufbau kann jeder beantragen http://foo.com/config.php oder http://foo.com/lib/etc.php direkt, das ist, was Sie versuchen zu verhindern. Anstatt einzelne Ausnahmen für alles hinzuzufügen, was Sie ablehnen möchten, beginnen Sie andersherum. Das heißt, wenn Sie Dateien haben, die nicht geliefert werden sollen, dann setzen Sie sie nicht in den Dokumentenstamm.

<VirtualHost *:80> 
    ServerName foo.com 
    DocumentRoot "/path/to/files/public" 
</VirtualHost> 

Beachten Sie, dass DocumentRoot jetzt auf ein Unterverzeichnis innerhalb Ihres Projekts festgelegt ist. Fügen Sie nur Ihre öffentlichen Ressourcen in dieses Verzeichnis ein. Alle anderen Dateien gehen nach draußen (d. H. Über) öffentlich, und somit kann nicht von Apache bedient werden, während PHP weiterhin erlaubt ist, sie einzuschließen.

/path/to/files 
    config.php 
/path/to/files/lib 
    db.php 
    etc.php 
    other_thing.php 
/path/to/files/public 
    index.php 
+0

Danke, aber ich glaube nicht, dass dies das Problem der Aufnahme durch andere PHP-Dateien löst. Ich will nicht nur den öffentlichen Zugang stoppen, ich habe das schon getan. Ich möchte ausdrücklich verhindern, dass die PHP-Dateien ausgeführt werden (z. B. durch 'include()' von anderen PHP-Dateien) – kot

+0

Sie können das nicht tun. Sie müssen lesbar sein, damit sie in Ihrer App ausgeführt werden können. –

+0

Ich möchte nicht, dass sie in meiner App ausgeführt werden – kot

Verwandte Themen