gZIP Script Problem

Hi,
habe mir mal ein PHP gZIP Komprimier Skript geschrieben, aber da gibts ein Problem, hier erstmal das Script:

[code]<?php
$file = $_GET[‘file’];
if (!$file or !file_exists($file) )
{
echo “Error!”;
exit();
}

$known_content_types = array(
“htm” => “text/html”,
“html” => “text/html”,
“js” => “text/javascript”,
“css” => “text/css”,
“xml” => “text/xml”,
“gif” => “image/gif”,
“jpg” => “image/jpeg”,
“jpeg” => “image/jpeg”,
“png” => “image/png”,
“txt” => “text/plain”
);

$content_type = $known_content_types[file_extension($file)];

function file_extension($filename)
{
return end(explode(".", $filename));
}

// Include this function on your pages
function print_gzipped_page() {

global $HTTP_ACCEPT_ENCODING;
if( headers_sent() ){
    $encoding = false;
}elseif( strpos($HTTP_ACCEPT_ENCODING, 'x-gzip') !== false ){
    $encoding = 'x-gzip';
}elseif( strpos($HTTP_ACCEPT_ENCODING,'gzip') !== false ){
    $encoding = 'gzip';
}else{
    $encoding = false;
}

if( $encoding ){
    $contents = ob_get_contents();
    ob_end_clean();
    header('Content-Encoding: '.$encoding);
	header("Content-Type: " . $content_type );
    print("\x1f\x8b\x08\x00\x00\x00\x00\x00");
    $size = strlen($contents);
    $contents = gzcompress($contents, 9);
    $contents = substr($contents, 0, $size);
    print($contents);
    exit();
}else{
    ob_end_flush();
    exit();
}

}

// At the beginning of each page call these two functions
ob_start();
ob_implicit_flush(0);

// Then do everything you want to do on the page
include($file);

// Call this function to output everything as gzipped content.
print_gzipped_page();

?> [/code]
Ich denke mal, das include() ist das Problem…

Parse error: syntax error, unexpected '>' in /users/dhmh/www/forum/styles/AeroBlue/theme/logo.png on line 230
(Es funktioniert noch nicht überall, nur bei javascript :frowning: )
Gibts ne alternative zu include ?

Wird include nicht für Code benutzt? Ich denke schon, bin aber aus PHP etwas raus derzeit. Probiers doch mal mit f_open().

Ach ja…
Das hatte ich ganz vergessen, danke, ich versuchs mal :slight_smile:

Mehr als kaputt gehen kanns nicht :smiley:!

toll, jetzt bekomme ich ne leere seite.
Brauche ich noch fwrite ?
$handle = fopen ($file, “r”);

[quote=“DHMH”]Ich denke mal, das include() ist das Problem…

Parse error: syntax error, unexpected '>' in /users/dhmh/www/forum/styles/AeroBlue/theme/logo.png on line 230[/quote]
Natürlich ist es unsinnig, Binärdaten per include “einbinden” zu wollen.
Include führt PHP-Code aus, wenn es auf welchen trifft - und das PHP-spezifische Zeichenkombinationen wie <? zum Start eines PHP-Bereiches auch als entsprechende Byte-Kombinationen in Binärdaten wie bspw. Bildern vorkommen, ist alles andere als unwahrscheinlich.

readfile, wenn du Daten aus einer Datei einfach nur “durchreichen” willst, ohne sie in irgendeiner Art und Weise zu interpretieren.
(Oder, wenn eh schon ein geöffneter Datei-Zeiger bestehen sollte, fpassthru.)

Allerdings hat dein Script so kaum einen Nutzen, eher sogar im Gegenteil - der Effekt der komprimierten Auslieferung der Daten wird dadurch, dass dein Script sich nicht im geringsten um clientseitiges Caching kümmert, und somit die Ressourcen vom Browser ziemlich sicher jedes Mal auf’s neue angefordert werden dürften, locker wieder aufgefressen.

Und darüber hinaus ist der Nutzen natürlich fraglich, wenn eh schon vorhandene Funktionalität noch mal selber nachgebastelt wird - ob_gzhandler existiert. (Generell zumindest, ob das hier bei bplaced evtl. nicht verfügbar ist, weiss ich gerade nicht. Der Sonderfall wäre aber auch so zimelich der einzige, wo eine Selbstbastellösung überhaupt irgendeine Existenzberechtigung haben könnte.)

danke, ist aber nur für testzwecke…
Leider funktioniert das auch noch nicht:

[code]<?php
$file = $_GET[‘file’];
if (!$file or !file_exists($file) )
{
echo “Error!”;
exit();
}

$known_content_types = array(
“htm” => “text/html”,
“html” => “text/html”,
“js” => “text/javascript”,
“css” => “text/css”,
“xml” => “text/xml”,
“gif” => “image/gif”,
“jpg” => “image/jpeg”,
“jpeg” => “image/jpeg”,
“png” => “image/png”,
“txt” => “text/plain”
);

$content_type = $known_content_types[file_extension($file)];

function file_extension($filename)
{
return end(explode(".", $filename));
}

// Include this function on your pages
function print_gzipped_page() {

global $HTTP_ACCEPT_ENCODING, $content_type;
if( headers_sent() ){
    $encoding = false;
}elseif( strpos($HTTP_ACCEPT_ENCODING, 'x-gzip') !== false ){
    $encoding = 'x-gzip';
}elseif( strpos($HTTP_ACCEPT_ENCODING,'gzip') !== false ){
    $encoding = 'gzip';
}else{
    $encoding = false;
}

if( $encoding ){
    $contents = ob_get_contents();
    ob_end_clean();
    header('Content-Encoding: '.$encoding);
	header("Content-Type: " . $content_type );
    print("\x1f\x8b\x08\x00\x00\x00\x00\x00");
    $size = strlen($contents);
    $contents = gzcompress($contents, 9);
    $contents = substr($contents, 0, $size);
    //print($contents);
    exit();
}else{
    ob_end_flush();
    exit();
}

}

// At the beginning of each page call these two functions
ob_start();
ob_implicit_flush(0);

// Then do everything you want to do on the page
//include($file);

$handle = fopen ($file, “rb”);
fpassthru($handle);

// Call this function to output everything as gzipped content.
print_gzipped_page();

?> [/code]
computerboard.eu/gz.php?file=sty … e/logo.png
Er zeigt es als normalen Text an, speichern als PNG kann ich natürlich und es funzt, aber er soll ja nicht den Binary Inhalt des PNGs anzeigen, sondern das PNG selber.

Vielleicht hilft es dir ja weiter, z. B. das letzte Beispiel des
Abschnittes ist ein Beispiel, wo im Skript komprimiert wird:
hoffmann.bplaced.net/hilfe.php?m … ik#BGLnDim

Handelt sich da um SVG, ist aber nahezu egal, was man da
komprimiert, man muß nur für das eigentliche Format den
Inhaltstyp (Content-type) angeben und für den Kompressionstyp
das ‘Content-encoding’ …

Achso, die meisten oder alle browser dekomprimieren das sofort
wieder, kann man also nicht direkt sehen, wenn man mit dem
browser in den Quelltext der übertragenen Datei guckt.

Sicher mal das Script ab, man kann da Dateien anzeigen lassen, die man nicht anzeigen lassen sollte :ps:

Meinst du mich?
Ich denke, die Dateien/Skripte, wo man drankommt, darf man
sich auch ruhig anzeigen lassen. da gibt es keine großen
Geheimnisse. Diese Anleitungen sind ja zum Angucken da ;o)
Dürfte schwierig sein, da an Skripte zu kommen, die in anderen
Verzeichnissen liegen und die nicht dazu gedacht sind, als
Quelltext angezeigt zu werden ;o)

Wenn du ein Beispiel angeben kannst, wo du vermutest, daß man
es nicht ansehen können sollte, kannst du es mir ja mitteilen
(per persönlicher Nachricht etwa), dann weiß ich vermutlich auch,
wo das Skript eine Macke hat, wenn es eine hat.

Du willst noch einen passenden Content-Type-Header schicken, bevor du die Binärdaten ausgibst.

Und bzgl. Absicherung, nein @hoffmann, da warst wohl nicht du gemeint, sondern der Threadstarter - denn dass bspw.
http://computerboard.eu/gz.php?file=.htaccess
den Inhalt seiner .htaccess-Datei anzeigt, ist sicher ebenso wenig gewünscht, wie dass man darüber auch den Quellcode sämtlicher php-Dateien einsehen kann, inkl. der, wo DB-Passwörter etc. drin definiert sind.

Also, @DHMH: Das Script solltest du schnellstens offline nehmen, und dir dann erst mal überlegen, wie man so etwas vernünftig absichert!
Und das auch bei zukünftigen Programmier-Versuchen dieser Art bereits im voraus berücksichtigen.

Ja, DHMH war gemeint.
Ich würde jetzt auch das Datenbank-Passwort ändern “pp…”

Das Ablegen unverschlüsselter Paßwörter auf dem server schien
mir schon immer eine drollige Konfiguration von einigen
MySQL-Installationen zu sein, zumal einige Leute auch noch
überall das gleiche Paßwört verwenden, wohlmöglich auch noch
für ihr Sparbuch ;o)

Mein Guck-Skript bekommt auch den Dateinamen über einen
GET-Parameter und haut dann den Quelltext raus, ich meine
aber, das ist so gebastelt, daß das nur bei Dateien im dafür
vorgesehenen Verzeichnis geht und nicht bei diesem Skript
selbst - aber man kann sich da schnell täuschen und sich
reinlegen ;o)

Sry, ich hab das Script verbessert.
Bitte @Flocke:
Verwende das PW nicht, missbrauche es nicht.
Ich musste es letztens schonmal ändern, wegen einem Hacker…
Ich hab das Skript jetzt auf diesem Stand:
Bilder gehen noch nicht, ich werds hier aktualisieren wenn ich fertig bin:

[code]<?php
$file = $_GET[‚file‘];

// Definitionen
// erlaubte Dateiendungen
$known_content_types = array(
„htm“ => „text/html“,
„html“ => „text/html“,
„js“ => „text/javascript“,
„css“ => „text/css“,
„xml“ => „text/xml“,
„gif“ => „image/gif“,
„jpg“ => „image/jpeg“,
„jpeg“ => „image/jpeg“,
„png“ => „image/png“,
„txt“ => „text/plain“
);
//verbotene Dateinamen
$disallowed_filenames = array(
„index.html“ => „1“,
„index.htm“ => „1“
);
$disallowed = $disallowed_filenames[filename($file)];
$content_type = $known_content_types[file_extension($file)];
if($disallowed)
{
echo "Stop


Fehler! Der Dateiname " . filename($file) . " ist nicht erlaubt!!!";
exit();
}

if (!$file)
{
echo "Stop


Fehler! Bitte geben Sie die Datei als Parameter ‚file‘ an!!!";
exit();
}
Else if (!file_exists($file))
{
echo "Stop


Fehler! Die Datei $file existiert nicht auf unserem Server!!!";
exit();
}

if(!$content_type)
{
echo "Stop

Leider ist der Dateityp " . file_extension($file) . " nicht erlaubt!";
exit();
}

// At the beginning of each page call these two functions
ob_start();
ob_implicit_flush(0);

// Then do everything you want to do on the page
//include($file);
header("Content-Type: " . $content_type );
$handle = fopen ($file, „rb“);
fpassthru($handle);

// Call this function to output everything as gzipped content.
print_gzipped_page();

//////////////////////////////////////
// FUNKTIONEN //
/////////////////////////////////////

function file_extension($filename)
{
return end(explode(".", $filename));
}

function filename($filename)
{
return end(explode("/", $filename));
}

function print_gzipped_page() {

global $HTTP_ACCEPT_ENCODING, $content_type;
if( headers_sent() ){
    $encoding = false;
}elseif( strpos($HTTP_ACCEPT_ENCODING, 'x-gzip') !== false ){
    $encoding = 'x-gzip';
}elseif( strpos($HTTP_ACCEPT_ENCODING,'gzip') !== false ){
    $encoding = 'gzip';
}else{
    $encoding = false;
}

if( $encoding ){
    $contents = ob_get_contents();
	ob_end_clean();
    header('Content-Encoding: '.$encoding);
	header("Content-Type: " . $content_type );
    print("\x1f\x8b\x08\x00\x00\x00\x00\x00");
    $size = strlen($contents);
    $contents = gzcompress($contents, 9);
    $contents = substr($contents, 0, $size);
    print($contents);
    exit();
}else{
    ob_end_flush();
    exit();
}

}

?> [/code]
Edit: So, das Skript funktioniert jetzt :p :smiley: :wink: :hail:

Und ich komm nicht mehr an die config.php

@hoffmann:
Was bringt eine Verschlüsselung, wenn der Entschlüsselungscode mitgeliefert wird? Ich hätte ja von dort den Code einfach kopieren können.

Flocke - den sollte man natürlich nicht verfügbar machen.
Man könnte auch den Zugang zur Datenbank an den Eigentümer
des Skriptes koppeln, gibt da mehrere Möglichkeiten, der Inhalt
der Datenbank muß ja auch nicht unbedingt ‘sicherer’ sein als
der Rest des Projektes. Wenn irgendwo auf einem server
unverschlüsselte Paßwörter herumliegen, ist das immer ein
prinzipielles Problem, im Zweifelsfalle dann eben des gesamten
Konzeptes von MySQL. Bei den ersten servern, wo ich
PHP+Datenbank hätte nutzen können, war das auch bereits so
eingerichtet, was für mich Grund genug war, die Datenbank erst
gar nicht zu nutzen, weil es technisch nicht möglich war, dies zu
tun, ohne irgendwo ein Paßwort offen herumliegen zu lassen…