Probleme mit PHP functionen nach Server umzug
DiamondDog
- php
Hallo Leute,
also ich hab mehrer Probleme mit meinen PHP Scripten, ich bin auf einen anderen Server umgezogen und jetzt zeigen die Script nur noch Fehler an und ich weiß leider nicht wieso.
Hier mal der Link zur neuen Seite (Fehler sind dann schon zu sehen):
http://www.diamonddoghamm.de/
Neben bei hier mal der Link zu PHP Info (neue Seite):
http://www.diamonddoghamm.de/phpinfo.php
alte Seite:
http://diamonddog.di.funpic.de/phpinfo.php
Ich hoffe es kann mir jemand sagen wo drann das liegt, und wie ich alles wieder ans laufen bekomme.
Danke schon mal fürs Helfen.
Mfg Dog
Hi there,
Ich hoffe es kann mir jemand sagen wo drann das liegt, und wie ich alles wieder ans laufen bekomme.
vermutlich waren auf Deinem alten Server die Register-Globals auf on gesetzt, und Dein Script versucht nun, unbekannte Variablen auszuwerten...
Hi there,
»» Ich hoffe es kann mir jemand sagen wo drann das liegt, und wie ich alles wieder ans laufen bekomme.
vermutlich waren auf Deinem alten Server die Register-Globals auf on gesetzt, und Dein Script versucht nun, unbekannte Variablen auszuwerten...
Ja damit hast du recht auf dem neuen Server sind die aus.
Hallo,
ich vermute auf dem Funpic Server war das Error Reporting für Notice ausgeschaltet...
error reporting 6135
...auf dem neuen halt nicht...
Gruß Jan
Hi,
ich vermute auf dem Funpic Server war das Error Reporting für Notice ausgeschaltet...
error reporting 6135
gut beobachtet!
...auf dem neuen halt nicht...
Stimmt. Das dürfte die Erklärung sein.
Btw, was macht list(...), wenn das Array auf der rechten Seite der Zuweisung weniger Elemente hat, als die Liste Variablen enthält? Das Manual schweigt sich über diesen Fall aus. Aber das könnte genau die "Undefined index 1"-Meldung sein.
DiamondDog berichtet doch, dass diese Zeile die Meldung verursacht:
list ($ident, $stempel) = explode ('|', $zeile, 2);
So wie er die Datei schreibt, nämlich immer eine Zeile gefolgt von \n, bekommt man beim Auslesen immer eine Leerzeile, bevor feof() reagiert. Und explode() auf einen Leerstring angewandt, ergibt ein Array mit nur einem Element, nämlich dem besagten Leerstring.
Es handelt sich also um einen "Fehler", der schon immer da war und beim bisherigen Hoster nur nicht gemeldet wurde.
In diesem Fall halte ich es sogar für legitim, den Error Suppression Operator @ vor die list-Anweisung zu setzen. Schöner wäre es natürlich, den Fall vorher abzufragen.
So long,
Martin
In diesem Fall halte ich es sogar für legitim, den Error Suppression Operator @ vor die list-Anweisung zu setzen. Schöner wäre es natürlich, den Fall vorher abzufragen.
Ok und jetzt noch mal für Leute, die nicht so super PHP können ;)
Ok hab verstanden das ich was am anfang des codes setzen soll, jetzt nur meine Frage was genau?
Hello,
Btw, was macht list(...), wenn das Array auf der rechten Seite der Zuweisung weniger Elemente hat, als die Liste Variablen enthält? Das Manual schweigt sich über diesen Fall aus. Aber das könnte genau die "Undefined index 1"-Meldung sein.
Notice: Undefined offset: 5 in C:\Programme\xampp\htdocs\test\array\list.php on line 17
Notice: Undefined offset: 4 in C:\Programme\xampp\htdocs\test\array\list.php on line 17
Reicht das als Antwort?
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hallo!
also ich hab mehrer Probleme mit meinen PHP Scripten, ich bin auf einen anderen Server umgezogen und jetzt zeigen die Script nur noch Fehler an und ich weiß leider nicht wieso.
Hier mal der Link zur neuen Seite (Fehler sind dann schon zu sehen):
http://www.diamonddoghamm.de/
Ich seh keine PHP-Fehler. Nur 2 Notice-Meldungen.
Informiere dich über error-reporting und die Ursache für deine Meldungen.
Grüße, Matze
Hallo,
ich bin auf einen anderen Server umgezogen und jetzt zeigen die Script nur noch Fehler an
dann verrate uns bloß nicht, was für Fehler! ;-)
Hier mal der Link zur neuen Seite (Fehler sind dann schon zu sehen):
http://www.diamonddoghamm.de/
"Undefined offset: 1 in /var/www/web49/html/diamonddog/user_online.php on line 58"
Du benutzt in Zeile 58 einen Index (vermutlich zum Zugriff auf ein Array), den damit indizierten Wert gibt es aber nicht. Was steht in Zeile 58?
Neben bei hier mal der Link zu PHP Info (neue Seite):
http://www.diamonddoghamm.de/phpinfo.php
alte Seite:
http://diamonddog.di.funpic.de/phpinfo.php
Nimm diese phpinfo-Seiten bitte schnell wieder vom Netz. Sie verraten sehr viel über die Einstellungen und Interna deines Servers, und stoßen Hacker möglicherweise mit der Nase auf Zugriffsmöglichkeiten, von denen du nicht einmal geträumt hast.
Ich sehe, dass dein bisheriger Webspace (funpic) noch die Krücke register_globals=on hat, während dein neuer Hoster (TerraTransit) diese Option abgeschaltet hat, wie sich das gehört. Eventuell verlassen sich deine Scripte noch auf diese Krücke? Dann wäre es höchste Zeit, sie auf einen aktuellen Stand zu bringen.
So long,
Martin
Hallo Martin,
Nimm diese phpinfo-Seiten bitte schnell wieder vom Netz. Sie verraten sehr viel über die Einstellungen und Interna deines Servers, und stoßen Hacker möglicherweise mit der Nase auf Zugriffsmöglichkeiten, von denen du nicht einmal geträumt hast.
Das halte ich, ehrlich gesagt, für Blödsinn!
Viele Provider stellen ihre phpinfo() sogar öffentlich ins Netz, damit man als interessierter/potentieller Kunde weiß worauf man sich einlässt.
In der Regel ist PHP auch nicht so schwach konfiguriert, dass man nur durch phpinfo() eine Angriffsfläche finden kann.
Grüße, Matze
Hi,
»» Nimm diese phpinfo-Seiten bitte schnell wieder vom Netz. Sie verraten sehr viel über die Einstellungen und Interna deines Servers, und stoßen Hacker möglicherweise mit der Nase auf Zugriffsmöglichkeiten, von denen du nicht einmal geträumt hast.
Das halte ich, ehrlich gesagt, für Blödsinn!
ich nicht, denn in diesen Info-Seiten sind sämtliche Einstellungen aufgelistet, sowie die genauen Dateipfade etlicher Konfigurationsdateien. Sollte die Konfiguration also sicherheitstechnisch ungünstige Details aufweisen, werden die hier gnadenlos offengelegt. Das meinte ich mit "mit der Nase drauf stoßen", auch wenn die Angreifer etwa eine bestimmte Version eines Moduls oder Kombinationen von Modulen als angreifbar kennen.
Das heißt nicht, dass dieselbe Konfiguration ohne Veröffentlichung dieser Details sicherer wäre; security by obscurity war noch nie auf Dauer wirksam. Aber -um mal wieder einen hinkenden Vergleich zu bemühen- wenn ich weiß, dass das Schloss an der Beifahrertür meines Autos kaputt ist und nicht richtig schließt, dann werde ich mir nicht auch noch einen Zettel mit der Aufschrift "HIER OFFEN" ins Fenster hängen.
Viele Provider stellen ihre phpinfo() sogar öffentlich ins Netz, damit man als interessierter/potentieller Kunde weiß worauf man sich einlässt.
Ja. Dann sind aber viele Dateipfade anonymisiert, oder der Hoster weiß sicher, dass seine Festung "dicht" ist. Normalerweise sollte das überall der Fall sein, aber du weißt ja, Theorie und Praxis ...
In der Regel ist PHP auch nicht so schwach konfiguriert, dass man nur durch phpinfo() eine Angriffsfläche finden kann.
Nicht direkt. Aber wenn ich eine detaillierte technische Beschreibung der Alarmanlage habe, sind meine Chancen, unerkannt in ein Gebäude zu kommen, ungleich größer.
Ciao,
Martin
Hallo,
prinzipiell bin ich als Kunde nicht(!) für die Fehlkonfigurationen meines Providers verantwortlich. Ein Provider, der die Ausgabe von phpinfo()
nicht allgemein veröffentlichen kann, gehört vom Netz genommen.
Gruß aus Berlin!
eddi
Also in Zeile 58 steht:
// trenne Identifikationskriterium von Zeitstempel
list ($ident, $stempel) = explode ('|', $zeile, 2);
Das ganze Script sieht so aus:
<?php
/*
user_online.php - Anzahl der Besucher Online
*/
// Konfiguration
$besucher_online_konfiguration = array (
// in welcher Datei soll es gespeichert werden
'datei' => 'txt/useron/user_ips.txt',
// wie lange soll es dauern, bis ein Eintrag verfällt
'zeitlimit' => 300 // 5 Minuten = 300
);
// zählt den aktuellen Besucher
function zaehle_besucher ($ident) {
// hole die Liste
$liste = hole_besucher_liste ();
// fuege das aktuelle Identifikationskriterium mit aktuellem Datum hinzu
$liste[$ident] = time ();
// schreibe die Liste
schreibe_besucher_liste ($liste);
}
// holt die Liste aus einer Datei
function hole_besucher_liste () {
// importiere die Konfiguration
global $besucher_online_konfiguration;
// initialisiere Array
$zeilen = array ();
// öffne datei
$fh = fopen ($besucher_online_konfiguration['datei'], 'r');
// fehler?
if (!is_resource ($fh)) {
return array ();
}
// sperre datei
$res = flock ($fh, LOCK_SH);
// gehe Zeilen durch
while (!feof ($fh)) {
$zeilen[] = fgets ($fh);
}
// entsperre Datei und schließe sie
flock ($fh, LOCK_UN);
fclose ($fh);
$ergebnis = array ();
// gehe die Zeilen durch
foreach ($zeilen as $zeile) {
// trenne Identifikationskriterium von Zeitstempel
list ($ident, $stempel) = explode ('|', $zeile, 2);
// wenn Identifikationskriterium leer ist, dann übergehen
if (empty ($ident)) {
continue;
}
// wenn stempel zu alt ist
if ($stempel < time() - $besucher_online_konfiguration['zeitlimit']) {
// übergehen
continue;
}
// füge zum Ergebnis hinzu
$ergebnis[$ident] = (int)$stempel;
}
return $ergebnis;
}
// gibt die Anzahl der Besucher zurück
function anzahl_besucher () {
return count (hole_besucher_liste ());
}
// schreibe die Liste zurück
function schreibe_besucher_liste ($liste) {
// importiere die Konfiguration
global $besucher_online_konfiguration;
$ergebnis = '';
// gehe die Liste durch
foreach ($liste as $ident => $stempel) {
$ergebnis .= "$ident|$stempel\n";
}
// öffne datei
$datei = fopen ($besucher_online_konfiguration['datei'], 'w');
// sperre datei
flock ($datei, LOCK_EX);
// Fehler?
if (!is_resource ($datei)) {
return false;
}
// schreibe das ergebnis
$cnt = fwrite ($datei, $ergebnis);
// fehler?
if ($cnt === false) {
// entsperren und schließen
flock ($datei, LOCK_UN);
fclose ($datei);
return false;
}
// schließe die Datei
flock ($datei, LOCK_UN);
fclose ($datei);
// wir sind fertig
return true;
}
?>
Leider hab ich nicht die große Ahnung von PHP das ich es alleine hinbekomme das um zu schreiben. Wäre also super wenn mir da jemand Helfen könnte.
Hallo DiamondDog,
Leider hab ich nicht die große Ahnung von PHP das ich es alleine hinbekomme das um zu schreiben. Wäre also super wenn mir da jemand Helfen könnte.
in dem Fall passiert nichts weiter, als das vermutlich eine Leerzeile eingelesen wird. Die PHP-Meldung ist also ganz unspektakulär und unbedenklich.
Setze einmalig in jedes Script, was eine Notiz erzeugt hinter dem ersten "<?php" einfach nur error_reporting(E_ERROR | E_PARSE);!
<?php
error_reporting(E_ERROR | E_PARSE);
# restlicher Code ...
Gruß aus Berlin!
eddi
<?php
error_reporting(E_ERROR | E_PARSE);
restlicher Code ...
Ok das hat geholfen.
Danke an alle für ihre schnelle Hilfe!
Hello,
Das ganze Script sieht so aus:
Das Script ist nicht sehr sauber geschrieben. Abgesehen davon, bedeutet eine IP nicht 'ein Client', denn manche Clients wechseln mit jedem Request ihre IP, aber das wusstest Du sicherlich schon.
<?php
// Konfiguration
$besucher_online_konfiguration = array (
// in welcher Datei soll es gespeichert werden
'datei' => 'txt/useron/user_ips.txt',
Diese Datei ist bei Dir auch direkt über HTTP erreichbar.
Das kannst Du bei Standardeinrichtungen von Apache verhindern, indem
Du einfach den Namen der Datei mit '.ht' beginnen lässt.
'datei' => 'txt/useron/.htuser_ips.txt',
// wie lange soll es dauern, bis ein Eintrag verfällt
'zeitlimit' => 300 // 5 Minuten = 300
);// zählt den aktuellen Besucher
function zaehle_besucher ($ident)
{
// hole die Liste
$liste = hole_besucher_liste ();// fuege das aktuelle Identifikationskriterium mit aktuellem Datum hinzu
$liste[$ident] = time ();// schreibe die Liste
schreibe_besucher_liste ($liste);
}
Das Holen der Liste und das anschließende Schreiben muss gemeinsam durch ein LOCK_EX geklammert werden, wenn das Script ordentlich arbeiten soll. Sonst fängst Du Dir ein TOCTOU-Problem ein [link:http://en.wikipedia.org/wiki/Time-of-check-to-time-of-use], da ja im Normalfall auch mehrere verschiedenen Clients gleichzeitig Requests senden können, die dann nebenläufig abgehandelt werden.
Das Öffnen und Locken der Datei sollte daher außerhalb der Teilfunktionen stattfinden und diese sollten das Handle übergeben bekommen.
// holt die Liste aus einer Datei
function hole_besucher_liste () {
// importiere die Konfiguration
global $besucher_online_konfiguration;
Das Arbeiten mit globalen Variablen führt die Nutzung von Funktionen i.d.R. ad absurdum.
Übergebe den Funktionen die Werte als Argumente oder Referenzen auf die Werte.
// initialisiere Array
$zeilen = array ();// öffne datei
$fh = fopen ($besucher_online_konfiguration['datei'], 'r');// fehler?
if (!is_resource ($fh)) {
return array ();
}// sperre datei
$res = flock ($fh, LOCK_SH);// gehe Zeilen durch
while (!feof ($fh)) {
$zeilen[] = fgets ($fh);
}// entsperre Datei und schließe sie
flock ($fh, LOCK_UN);
Das Entsperren ist überflüssig, wenn Du die Datei gleich anschließend schließt.
Es kann sogar zu Fehlern führen. Wenn Du explizit entsperren willst, musst Du vorher die Buffers der Datei leeren, damit auch wirklich alles Weggescchrieben wird. fflush($fh);
[link:http://de3.php.net/manual/en/function.fflush.php]
fclose ($fh);
$ergebnis = array ();
// gehe die Zeilen durch
foreach ($zeilen as $zeile)
{
// trenne Identifikationskriterium von Zeitstempel
list ($ident, $stempel) = explode ('|', $zeile, 2);
// wenn Identifikationskriterium leer ist, dann übergehen
if (empty ($ident))
{
continue;
}// wenn stempel zu alt ist
if ($stempel < time() - $besucher_online_konfiguration['zeitlimit']) {
// übergehen
continue;
}// füge zum Ergebnis hinzu
$ergebnis[$ident] = (int)$stempel;
}
return $ergebnis;
}// gibt die Anzahl der Besucher zurück
function anzahl_besucher ()
{
return count (hole_besucher_liste ());
}// schreibe die Liste zurück
function schreibe_besucher_liste ($liste)
{
// importiere die Konfiguration
global $besucher_online_konfiguration;$ergebnis = '';
// gehe die Liste durch
foreach ($liste as $ident => $stempel) {
$ergebnis .= "$ident|$stempel\n";
}// öffne datei
$datei = fopen ($besucher_online_konfiguration['datei'], 'w');
// sperre datei
flock ($datei, LOCK_EX);// Fehler?
if (!is_resource ($datei)) {
return false;
}
Diese beiden Statements sind zusätzlich zum TOCTOU-Problem in der falschen Reihenfolge
öffnen
Öffnung prüfen
sperren
Sperre prüfen
arbeiten
schließen
// schreibe das ergebnis
$cnt = fwrite ($datei, $ergebnis);// fehler?
if ($cnt === false) {
// entsperren und schließen
flock ($datei, LOCK_UN);
fclose ($datei);
return false;
}// schließe die Datei
flock ($datei, LOCK_UN);
fclose ($datei);// wir sind fertig
return true;
}?>
Außerdem dauern die Aufgaben in diesem Script ein paar Millisekunden und die Liste der IPs könnte etwas länger werden. Was ist, wenn ein User mittendrin, kurz nachdem er geklickt hat, die Lust verliert, auf die Response zu warten und sein Browserfenster schließt.
Dann gibt es einen User-Abort, der das Script sofort beendet. Es könnte passieren, dass die Datei dann noch nicht vollständig zurückgeschrieben worden ist. Damit wäre sie kaputt.
<http://de3.php.net/manual/en/function.ignore-user-abort.php>
HTTP ist zwar normalerweise verbindungslos, wenn aber die Verbindung zum Client mitten in der Abarbeitung des Besuches (genauer: während der Erzeugung der Response) gekappt wird, bekommt PHP das doch mit. Die Scripte liegen in der "Responsetime" des Dialoges.
Tom vom Berg
![](http://selfhtml.bitworks.de/Virencheck.gif)
--
Nur selber lernen macht schlau
<http://bergpost.annerschbarrich.de>