WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   Problem mit mysqldump-Nachbau in PHP (http://www.wcm.at/forum/showthread.php?t=73113)

käptn 11.10.2002 11:25

Problem mit mysqldump-Nachbau in PHP
 
Hallo Leute,

ich hab ein Problem mit einem mysqldump-Nachbau in PHP... :(

Das Script soll sozusagen mysqldump ersetzen und bringt IMHO auch dieselbe Ausgabe wie mysqldump mit ein paar zusätzlichen Statements.

Das Problem liegt bei den 'extended Inserts' - mysqldump's erfolgen beim Import ohne Mucks aber meine verursachen manchmal Warnungen (net so schlimm, aber warum?) und bei einer Tabelle mit über 45000 Datensätzen (PLZ) bricht der Server ein paar mal die Verbindung ab und diese Tabelle ist anschließend leer, alles andere passt... :o

Ideen?

TIA

~

Sloter 11.10.2002 11:46

Das Script läuft in ein Timeout und wird nicht ganz abgearbeitet.
In der php.ini kannst du die max. Laufzeit von Scripten bestimmen.

Teste nocheinmal

Sloter

käptn 11.10.2002 11:55

Ah, da is ja schon der Übeltäter :D

Ne, es braucht gerade mal ein paar Sekunden, und der Dump ist vollständig...

Und die erste Zeile im Script ist set_time_limit(90);

Und läuft bei dir...

~

Sloter 11.10.2002 12:16

Zitat:

Original geschrieben von käptn
Ah, da is ja schon der Übeltäter :D

Ne, es braucht gerade mal ein paar Sekunden, und der Dump ist vollständig...

Und die erste Zeile im Script ist set_time_limit(90);

Und läuft bei dir...

~

1, Der Server wird wenig zu tun haben im Moment, deshalb kann das Script auf die vollen 100% Proztime zugreifen, ist etwas mehr los braucht es auch ein wenig länger.

2, warum machst ein Timelimit? Regelt doch die php.ini und möchtest du jedesmal dein Script bearbeiten falls die Datensätze größer werden.

3, deshalb ist auch der Fehler schon behoben und die Laufzeit ist korigiert. :D

Sloter

käptn 11.10.2002 12:56

Zitat:

Original geschrieben von Sloter


1, Der Server wird wenig zu tun haben im Moment, deshalb kann das Script auf die vollen 100% Proztime zugreifen, ist etwas mehr los braucht es auch ein wenig länger.

2, warum machst ein Timelimit? Regelt doch die php.ini und möchtest du jedesmal dein Script bearbeiten falls die Datensätze größer werden.

3, deshalb ist auch der Fehler schon behoben und die Laufzeit ist korigiert. :D

Sloter

1.) Na gut...

2.) Kanns auch auf 0 setzten -> unendlich - oder machst mir meine eigene php.ini für Mona-Net? :D

3.) ? ... So einfach hätt ich's auch gerne...

Ich seh in ferner Zukunft eher das Problem beim Memorylimit als beim Timelimit... Die größte Tabelle hat im Moment 4,5 M (genau die macht das Problem mit den Extended Inserts)... :o

--
Am einfachsten wär noch immer ein mysqldump als CronJob (user mysql oder sonstwer), welches vielleicht eine Sekunde für die ganze DB braucht, und die Gschicht wär schon gegessen...

Sloter 11.10.2002 13:35

2,setz ruhig auf Null, sonst bin ich wieder schuld wenn es zu einem Timeout kommt :D ...wird ja eh von der php.ini gesteuert und a eigene griegst net :p

Limit für Memory steht jetzt bei 16 MB,da kannst a Menge wegdumpen bis das Script so viel verbraucht.

<Am einfachsten wär noch immer ein mysqldump als CronJob
So bist du ja viel Freier wenn ich ein Script in den Cron übernehme und nicht einen einzelnen Befehl.
Du kannst zusätzlich noch einiges in die Datei reinpacken oder ändern und brauchst nicht immer mich dazu.

Sloter

käptn 11.10.2002 13:42

-> PM :D

käptn 11.10.2002 16:51

FYI: Ok, Problem hat sich im Grunde mal erledigt.

Es lag nicht am Script, sondern an irgendeiner mySQL-Einstellung, sodass ich nicht mit einer Query >45000 DS anlegen konnte...

Hab jetzt statt extended die normalen (saulangsamen) INSERTs genommen...

~

Philipp 11.10.2002 18:49

Sloter:

<Obiwan>
Du möchtest PHP im Safe Mode betreiben
</Obiwan>

Aber Spaß beiseite. PHP ohne Safe Mode bringt einige Sicherheitsrisiken.

1) PHP kann sämtliche Dateien am Server lesen z.B. auch Dateien von anderen Accounts :eek:

2) Diverse Einstellung z.B. das oben genannte Zeitlimit können überschrieben werden. Bei einen guten Script ist es ja kein Problem, allerdings wenn ein Script schlecht programmiert ist kann es die Serverstabilität gefährden.

Zitat:

Limit für Memory steht jetzt bei 16 MB
Das verdoppelt automatisch den Speicherverbrauch von jeden PHP Prozess. Selbst wenn der Speicher nicht gebraucht wird, wird er automatisch zugewiesen. Sämtliche PHP Scripte die ich kenne laufen problemlos mit 8MB.

Sloter 12.10.2002 09:58

<Luke Skywalker>
Ja Meister, aber die dunkle Macht des Fileuploads ist sehr stark
</Luke Skywalker>

1, Läßt sich mit Dateirechte recht gut Unterbinden, ist zwar mit etwas handarbeit verbunden aber es geht.


Sloter

Philipp 12.10.2002 13:09

Zitat:

Ja Meister, aber die dunkle Macht des Fileuploads ist sehr stark
File Uploads funktionieren auch im Safe Mode :)

Man legt einfach ein /tmp Verzeichnis (777) dort an wo das Script ausgeführt wird. Bei einigen PHP Applikation lässt sich sogar der Name des Safe Mode Upload Verzeichnisses einstellen.

Zitat:

1, Läßt sich mit Dateirechte recht gut Unterbinden, ist zwar mit etwas handarbeit verbunden aber es geht.
Leider Nein. PHP hat als Apache Modul ohne Safe Mode sämtliche Rechte die auch Apache hat, da helfen keine Dateirechte. Es können durch PHP alle Dateien die Apache offnen kann auch geöffnet werden. Das betrifft auch Systeminterne Dateien.

Ein harmloses Beispiel:
Probiere einmal http://phpsysinfo.sourceforge.net aus. Nettes Script, lief sogar am WCM Server für kurze Zeit. Zeigt Uptime, CPU, Speicher usw. an.

Diese Daten werden aber nicht durch PHP übergeben sondern durch öffnen von Systemdateien:
/proc/sys/kernel/hostname
/proc/version
/proc/uptime
/proc/loadavg
/proc/cpuinfo
/proc/pci
usw.

/proc ist nicht das einzige Verzeichnis das sich öffnen lässt. Ich würde daher so bald als möglich Safe Mode einschalten. Theoretisch (wenn alle Rechte richtig vergeben sind) sollten keine Probleme auftauchen.

Sloter 12.10.2002 17:27

Wenn ein Script sauber programmiert ist, geht auch der Fileupload mit "off",aber es gibt viele Scripten die sind nicht so sauber programmiert.

Nur Safemode auf off ist aber auch zu wenig.
Wirklich sicher wird es nur durch vernünftige Datei- und Userrechten, SuEXEC, safe_mode und open_basedir. ;-)

chmod 751 webx verhindert auch schon das auslesen weiterer Accounts und unterbindet das wandern im Dateisystem.
zB: /www/web1
/www/web2
usw...

Sloter

käptn 12.10.2002 18:35

nur nicht...
 
http://iworks.at/temp/demon.gif :hehe:

~

Philipp 13.10.2002 00:47

Zitat:

Wenn ein Script sauber programmiert ist, geht auch der Fileupload mit "off",aber es gibt viele Scripten die sind nicht so sauber programmiert.
Das mit dem extra /tmp Verzeichnis hat bisher immer funktioniert. Außerdem ist es nicht wirklich sinnvoll schlecht programmierte Scripte auf virtuellen Accounts zu betreiben, vor allem wenn sie irgendwelche Dinge uploaden können ;)

Zitat:

Nur Safemode auf off ist aber auch zu wenig.
Wirklich sicher wird es nur durch vernünftige Datei- und Userrechten, SuEXEC, safe_mode und open_basedir. ;-)
Zu wenig? Safe Mode ist die effektivste Einstellung um PHP abzusichern. Bei eingeschalten Safe Mode können nur die Dateien geöffnet werden die auch dem jeweiligen User gehören.

1) vernünftige Datei- und Userrechten

Bringen wenig. Wenn PHP als Teil von Apache läuft, hat es automatisch fast alle Rechte die Apache hat (=fast root).

2) SuEXEC

Funktioniert nur im CGI Modus.

3) open_basedir

Nach Safe Mode eine weitere brauchbare Einstellung, allerdings nicht wirklich Flexibel.

Zitat:

chmod 751 webx verhindert auch schon das auslesen weiterer Accounts und unterbindet das wandern im Dateisystem.
Funktioniert teilweise. Es müssen sämtliche Dateien im Verzeichnis auf 751 umgestellt werden um nicht ausgelesen zu werden. Daher ist es keine wirkliche Alternative.

Sloter 13.10.2002 08:06

<sinnvoll schlecht programmierte Scripte auf virtuellen Accounts zu <betreiben, vor allem wenn sie irgendwelche Dinge uploaden können
Wie willst du ein paar Hundert Accounts überwachen?
Soll ich mir jedes Script zuschicken lassen?

Ausserdem läuft jeder Virtuelle Accont unter einem eigenen User/Group.
Kann man ja schön in der httpd.conf bestimmen.

<2) SuEXEC
<Funktioniert nur im CGI Modus.
PHP als CGI installieren ? ;)


<Funktioniert teilweise. Es müssen sämtliche Dateien im Verzeichnis <auf 751 umgestellt werden um nicht ausgelesen zu werden. Daher ist <es keine wirkliche Alternative.
Beim letzten Sicherheitscheck den die CT anonym bei Hoster gemacht hat, hat es sich schon als sinnvoll herausgestellt.......

@Käptn
:hehe:

Sloter

Philipp 13.10.2002 11:13

Im Attachment ein Screenshot von meinen gestrigen Versuchen. Oben ohne Safe Mode, unten mit Safe Mode.

Mit einer einzigen Einstellung (in diesem Fall Safe Mode) wird PHP wesentlich sicherer und erlaubt kein öffnen von fremden Dateien.

Sloter 13.10.2002 12:03

Ja ich weiß schon und die CT hat sogar ein schönes Script zum testen verteilt.
Spiel dich ein wenig mit den Dateirechten, dann kannst auch das öffnen diverser Datein verhindern.

Sloter

Philipp 13.10.2002 13:57

Ich wollte dir mit diesem Screenshot nur zeigen das man mit einer einzigen Einstellung den Server absichern kann :)

Zitat:

Spiel dich ein wenig mit den Dateirechten, dann kannst auch das öffnen diverser Datein verhindern.
Das habe ich schon schon gemacht. Der Aufwand ist viel zu hoch da die Rechte bei hunderten Dateien geändert werden müssen. Außerdem bringt es keine 100% Sicherheit für Accounts auf dem Server.

Beispiel:
Jemand installiert phpBB2 auf seinen Account und macht chmod 777 config.php wie es empfohlen wird. Die Datei kann damit automatisch von allen Accounts am Server gelesen werden, wobei es egal ist dass das Verzeichnis auf chmod 751 umgestellt wurde.

Sloter 13.10.2002 14:06

Mit 777 kan es die ganze Welt über Browser lesen und beschreiben......
Die 751 verhindern nur das interne Auslesen der datei, und das sehr gut.

Sloter

Philipp 13.10.2002 15:16

Zitat:

Mit 777 kan es die ganze Welt über Browser lesen und beschreiben......
Beschreiben mit dem Browser :confused:

Eine Konfigurationsdatei wie z.B. config.php kann man selbst bei 777 nicht über den Browser lesen da Username/Passwort in Variabeln gespeichert wird

z.B:
PHP-Code:

<?php

$username 
"User";
$password "Passwort";

?>

Am Browser sieht man dann nur eine weiße Seite :)

Ich habe in der Zwischenzeit den c't Artikel angesehen. Der Workaround mit chmod 751 ist eigentlich nur für Notfälle:

Zitat:

Selbstschutz

Offensichtlich sind viele Provider nicht willens oder in der Lage, ihren Kunden eine sichere Server-Umgebung zu bieten. Anwender müssen jedoch darauf vertrauen, dass ihr Provider seinen Server sicher konfiguriert. Ein wenig kann sich jeder Webspace-Besitzer zusätzlich schützen, indem er in seinen Verzeichnissen die Schreib- und Leserechte restriktiv einstellt. Viele ftp-Programme unterstützen das Setzen von Dateiattributen. Dabei sollte man auf Linux-Systemen alle Verzeichnisse auf dem Webserver gegen das Lesen durch fremde Nutzer schützen. Der entsprechende Parameter für den chmod-Befehl lautet 751. Wer großen Wert auf den Schutz seiner Web-Präsenz legt, die bisher in einer Shared-Hosting-Umgebung untergebracht ist, sollte damit auf einen dedizierten Server umziehen.
So ganz dürfte der Autor dieses Artikels aber auch nicht bei der Sache gewesen sein:
Zitat:

Laut der PHP-FAQ [1] kann aber auch der Safe Mode nicht wirklich als sicher gelten. Sie empfehlt für Shared-Hosting-Umgebungen sogar, PHP als CGI-Applikation einzusetzen.
Da es mich dann doch interessiert hat warum der Safe Mode angeblich nicht sicher ist habe ich im PHP-FAQ nachgesehen:

Zitat:

safe_mode ist nicht sicher: Ein Fehler in der popen() -Funktion ist erst mit 3.0.14 korrigiert worden, ein weiterer Fehler in der > mail() -Funktion erst in 3.0.15. Man sollte stattdessen die CGI-Version in einem >chroot -Environment verwenden und mit setrlimit noch weitergehende Einschränkungen definieren.
PHP 3.0.14/3.0.15 sind schon etwas älter ;)

Sloter 13.10.2002 15:40

Ok nicht mit dem Browser, aber eine eigenes Script mit fopen reinschreiben und ausführen ist möglich.
da wirst du mir zustimmen :D

Probier es einmal aus, setze die web1 und web2 auf 751 und versuche dann von web1 auf web2 intern zuzugreifen.

Sloter

Philipp 13.10.2002 19:08

Zitat:

Probier es einmal aus, setze die web1 und web2 auf 751 und versuche dann von web1 auf web2 intern zuzugreifen.
Das habe ich schon ein paar Mal probiert. Wenn ich nur die Verzeichnisse auf 751 setze, sind die Dateien weiterhin vom anderen Verzeichnis lesbar.

Du testest nicht zufälligerweise mit dem c't Script? Dieses Script verwendet wahrscheinlich die opendir() Funktion um das Verzeichnis auszulesen.

Probiere es einmal direkt:
PHP-Code:

<?php readfile("/www/datei.txt"); ?>

Wobei du /www/datei.txt mit einen beliebigen Pfad/Dateinamen ersetzt.

Es muss schon jede einzelne Datei auf 751 umgestellt werden damit sie nicht auslesbar ist.

Sloter 19.10.2002 09:41

Kann es sein das dein VirtualHost keinen eigenen User haben.
Sondern alles unter einem User/Group läuft?

Sloter

Philipp 20.10.2002 14:41

Nein, es sind mehrere User vorhanden. Ohne eingeschalteten Safe Mode werden allerdings User/Usergruppen automatisch ignoriert.

Beispielsweise kann man httpd.conf auch mittels <?php readfile("/pfad/httpd.conf"); ?> anzeigen. Da hilft es nicht die entsprechenden Verzeichnisrechte auf Chmod 751 zu ändern. Nur wenn man httpd.conf selber auf 751 umstellt, kann diese Datei nicht mehr über PHP gelesen werden.


Alle Zeitangaben in WEZ +2. Es ist jetzt 21:15 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag