html-Dateien nach skripten durchsuchen

faron

Grünschnabel
Ich möchte html-Files von Usern hochladen lassen und dann über eine php-Seite anzeigen. Das klappt recht gut, aber es besteht die Möglichkeit über diese Dateien auch Skripte (PHP, Perl, Python, SSI) auf dem Server auszuführen. Wie kann ich in mit php untersuchen, ob die Dateien skripte enthalten um sie dann nicht anzuzeigen. Mein bisheriger Versuch bei php nach dem Anfangstag suchen:
...
if (preg_match ("/<\?/", "$autor_name")) {
die ("Skripts not allowed!");
}
...
Das geht auch. Schwerer tue ich mir mit der Suche nach perl (zu erkennen an "#!-irgendwas-perl" ?) Den Begriff krieg ich nicht als regexp hin und ich weiss auch nicht ob das stimmt.
Für Python und SSI hab ich noch gar keine Idee nach was ich suchen muss.

Hat jemand Links oder Tipps für mich?

CU
Faron
 
Solange die Dateien die Endung .html haben dürfte das auf einem normalen Webserver (sprich: ein Webserver der die Script nur in den dafür gedachten Datei ausführt, also .pl, .php usw.) keine Probleme geben.
Anders natürlich, wenn der Webserver so eingestellt ist, dass auch über html-Dateien zb. den PHP-Parser laufen lässt.

Mach es im Zweifelsfalle einfach so, dass nur Dateien mit der Endung .txt hochgeladen werden dürfen. Das ist immer noch einfacher und schneller, als wenn jedes einzelne Seite geprüft wird, was bei großen Datein dann doch recht lange dauern kann.
 
PHP.net include
Beim Einbinden einer Datei wechselt der Parser vom PHP-Modus zu Beginn der Zieldatei in den HTML-Modus und kehrt am Ende der eingebunden Datei wieder in den PHP-Modus zurück. Deshalb muss jeglicher Code innerhalb der eingebundenen Datei, der als PHP-Code ausgeführt werden soll, von gültigen PHP-Start- und Ende-Tags eingefaßt sein.

wenn ich das hier richtig verstanden habe, kommt es nicht mal darauf an welche endung die datei hat, wenn sie includiert wird, wird sie am ende auch ausgeführt.

statt include solltest du also die datei anders ausgeben. z.b. über print oder echo.

perl dürfte eigentlich nicht das problem sein, wenn das in php eingebunden wird, spricht der CGI-Parser solange nicht darauf an wie es nicht im cgi-bin/-verzeichniss liegt. außerdem enden normalerweise cgi's die funktionieren sollen mit der endung .pl und das kann man ja ganz leicht blocken.
 
Super Infos.

Ich will wegen der Formatierung auch html erlauben. Und damit kein direkter Zugriff auf die User-Verzeichnisse besteht (Passwortabfrage) kann ich die html-Dateien nicht direkt aufrufen um den Parser zu umgehen. Aber jetzt sieht eh alles einfacher aus! Wenn ich nicht nach z.B. perl suchen muss kann ich das ja abhaken. php sortiere ich aus mit:

# $path ist der rel. Pfad und $file die html-Datei
$content = file_get_contents ("./$path/$file");
# php suchen und abwürgen
$char_deny = array ("<\?", "<php");
foreach ($char_deny as $ein_char) {
if (preg_match ("/$ein_char/", "$content")) {
die ("Skripte sind nicht erlaubt.");
}
}
echo $content;

CU
Faron
 
Zuletzt bearbeitet:
es gibt aber noch mehr möglichkeiten php anzuwenden:

<% %>
<?= ?> (zwar nur nen alias für "<? echo ... ?>" aber auch code)
<script language="php"></script>

sowas sollte auch beachtet werden!
 
da stellt sich mir die Frage ob es dann nicht sinvoller ist nen Array zu machen wo die Tags drinnen stehn die erlaubt sind oder
z.b.
reg = "/^(<[a-z])/i";

zuminderst würdest du auf die art nichts erlauben was mit was anderem als <a-z anfängt

oder? *g*
 
Original geschrieben von SonicBe@m
da stellt sich mir die Frage ob es dann nicht sinvoller ist nen Array zu machen wo die Tags drinnen stehn die erlaubt sind oder

man könnte natürlich auch ein einzigen suchpattern machen mit alternativen (wozu hat den pcre so viele möglichkeiten?)

$pattern = "=[\<][?php|script language\=\"php\"|\=|%|?][\>]=i";
if(preg_match($pattern,$subject))
...

habs net getestet, aber mit der alternativen-möglichkeit, brauch man nicht 3x und öfter das dinge durchlaufen lassen und man brauch kein array übergeben, da dadurch auch ne schleifenfunktion durchgeführt wird (auch langsamer)
 

Neue Beiträge

Zurück