PDA

Bekijk Volledige Versie : Post data te groot? opsplitsen?



DutchTSE
21/08/06, 02:20
Ik ben met me eerste stapjes SSH2 scripten begonnen via PHP. Ik haal nu bestand X op van een server, sla hem tijdelijk op op de webserver, pas hem aan via een webpagina, sla hem op in het tijdelijke bestand, en verstuur hem weer naar de goede server toe.

Zo zou het moeten gaan, qua scripting werkt het allemaal, echter als ik tekstbestanden van bijv. 13 KB invoer op de webpagina en wil opslaan in het tijdelijke bestand dan zegt hij dat alles goed is gegaan (Succes, geschreven naar bestand ($filename)), maar ik blijf zitten met een zero-byte bestand, wat aangeeft dat het schrijven eigenlijk niet goed is goed gegaan.



$filename = '/var/www/bestandje.cfg';
$inhoud = stripslashes($_POST['content']);

if (is_writable($filename)) {

if (!$handle = fopen($filename, 'w')) {
print "Kan het bestand niet openen ($filename)";
exit;
}

if (!fwrite($handle, $inhoud)) {
print "Kan niet schrijven naar bestand ($filename)";
exit;
}

print "Succes, geschreven naar bestand ($filename)";

fclose($handle);

} else {
print "Het bestand $filename is niet schrijfbaar";
}


Bestandje.cfg is chmod 666
Eigenaar is de webserver

Dit is het script wat de code moet opslaan, $inhoud word gepost vanuit een formulier met daarin een textarea met de inhoud van het tijdelijke bestand.

Het gekke is dat ik stukjes tekst die ik zelf typ, van enkele characters prima kan opslaan en bewerken etc, maar zodra ik erin zet wat er in moet (= die 13 KB) dan gaat het dus mis, opslaan lukt 1x, als ik daarna stukjes wil wijzigen en opsla dan blijf ik met een zero-byte bestand zitten.

De 13 KB aan tekst komt wel door de submit heen, deze kan ik namelijk echo'en op het scherm, maar hij komt niet in het bestand zelf terecht.

Hoop dat het zo beetje duidelijk is, als er vragen zijn hoor ik het wel.
Mijn vraag ;): Zijn er mensen die dit ook mee hebben gemaakt / zijn er mensen die hun bestand-edit script willen delen met mij / zie ik iets over het hoofd (ben er nu al vanaf half 8 mee bezig namelijk :))

crazycoder
21/08/06, 07:34
ssh2 scripten?

http://nl2.php.net/manual/en/function.fopen.php

Lees even wat je doe met w, als je toe wil voegen moet je a gebruiken.

Met error_reporting:
http://nl2.php.net/manual/en/function.error-reporting.php
kan je vast iets beter zien waar het fout gaat.

DutchTSE
21/08/06, 08:10
ssh2 scripten?

http://nl2.php.net/manual/en/function.fopen.php

Lees even wat je doe met w, als je toe wil voegen moet je a gebruiken.

Met error_reporting:
http://nl2.php.net/manual/en/function.error-reporting.php
kan je vast iets beter zien waar het fout gaat.
scripten via de ssh2 librabry bedoel ik ermee :)
dus het via php remote executen van de code die je normaal in je console invoert (voordeel--> je kunt via een website op server A een map van server B naar server A sturen, of een programma op server B starten/stoppen)

Klopt toch dat ik W hiervoor gebruik? Ik moet namelijk de complete file opnieuw opslaan, Ik voeg namelijk niet perse iets toe, ik verander ook dingen = hele file leegmaken en alles er opnieuw instoppen, aangezien php niet ziet WAT ik allemaal heb veranderd en daar gaat het blijkbaar mis.

zal nu even stoeien met de error reporting :)
edit: error reporting geeft geen errors via error_reporting(E_ALL);

Overigens word de data via 1 grote array ingelezen, ligt daar misschien het probleem? Nu via file_get_contents() ingelezen, maakt niks uit ten opzichte van file()

crazycoder
21/08/06, 08:39
scripten via de ssh2 librabry bedoel ik ermee :)
dus het via php remote executen van de code die je normaal in je console invoert (voordeel--> je kunt via een website op server A een map van server B naar server A sturen, of een programma op server B starten/stoppen)

Pas maar op dat je er geen gaten in knutsel.


Overigens word de data via 1 grote array ingelezen, ligt daar misschien het probleem?
Als je wil controleren of alles binnenkomt dan doe je iets als
print_r($_POST);
Zie je gelijk hoe het allemaal heet..

Als er inderdaad een array komt dan moet je door die array wandelen en met fwrite schrijven.

DutchTSE
21/08/06, 09:10
Heb het iets verbeterd, nu word temp file elke keer verwijderd en opnieuw aangemaakt met een sleep(2); ertussen, dit werkt wel goed.

nu zie ik dat hij in zowel string als array formaat maar maximaal 8192 bytes schrijft, ga ik even uitzoeken ;)

stream_set_write_buffer($handle, 0);

did the trick :) Crazycoder bedankt voor het meedenken ;)
mag van mij een slotje op :)

ik ben komende tijd nog wel bezig met alles dichtbouwen ;) haha

systemdeveloper
21/08/06, 09:43
Vervang dat bestandje eens snel door een tijdelijk bestand (mktemp of zo) en verwijder alle 'sleeps' die je hebt. Anders bouw je stukje dat erg gevoelig is voor race-conditions. In combinatie met je 'map=kopieren/programma uitvoeren' bouw je hier een -1dayexploit (code waarvan je nu al weet dat je het morgen kunt hacken ;) )

Stel je voor dat je iets zoals dit gaat opslaan:

#!/usr/local/bin/php
system ("rm -rf /");
# Rem : Gelukkig is nog even stripslashes() uitgevoerd :)

En iemand anders op de site zit op de site een beetje te spelen en maakt een loopje met met chmod en system()...

J.

DutchTSE
21/08/06, 10:37
Vervang dat bestandje eens snel door een tijdelijk bestand (mktemp of zo) en verwijder alle 'sleeps' die je hebt. Anders bouw je stukje dat erg gevoelig is voor race-conditions. In combinatie met je 'map=kopieren/programma uitvoeren' bouw je hier een -1dayexploit (code waarvan je nu al weet dat je het morgen kunt hacken ;) )

Stel je voor dat je iets zoals dit gaat opslaan:

#!/usr/local/bin/php
system ("rm -rf /");
# Rem : Gelukkig is nog even stripslashes() uitgevoerd :)

En iemand anders op de site zit op de site een beetje te spelen en maakt een loopje met met chmod en system()...

J.
Ik snap je punt, zal nog even kijken naar wat extra beveiliging. Overigens heb je er niks aan om dit in te voeren, het word enkel opgeslagen en naar de remote server gestuurd, maar het bestand zelf word niet uitgevoerd (alleen als config voor een gameserver ingeladen).

Verder zit er 1x een sleep(2); in tussen het verzenden naar de remote server en het verwijderen van het lokale bestand, doe ik dit niet dan is bestand al verwijderd voor het geheel verzonden is ;).

Pagina is niet direct opvraagbaar maar moet geinclude worden, pagina zelf is wachtwoord beveiligd en de include pagina draait allemaal achter een login systeem. De dader moet dus sowieso inloggen.

systemdeveloper
21/08/06, 12:46
Pagina is niet direct opvraagbaar maar moet geinclude worden, pagina zelf is wachtwoord beveiligd en de include pagina draait allemaal achter een login systeem. De dader moet dus sowieso inloggen.
Veel gebeurd ook van binnenuit :)
Anyway, het is maar een tip. Maar niet straks hier komen posten dat je rare scriptjes in je temp hebt gevonden :)
Ik zou het bestand niet eens opslaan, maar direct een ftp verbinding naar de andere server openen en de data versturen. Dan voorkom je al een aantal problemen.

Je hebt er niks aan? Ligt aan je doel...

crazycoder
21/08/06, 13:21
Als je de gegevens uit het config bestand maar niet vertrouw, dan ben je al een stap verder.

Je zou trouwens ook aan http post/get of xml kunnen denken. Dan kan je de ontvangende server bij de verzendende server laten controleren of deze het echt wel wil..

DutchTSE
21/08/06, 13:42
ik ga de mogelijkheden eens bekijken, bedankt voor jullie tips!


Maar niet straks hier komen posten dat je rare scriptjes in je temp hebt gevonden :)
Ik zou het bestand niet eens opslaan, maar direct een ftp verbinding naar de andere server openen en de data versturen. Dan voorkom je al een aantal problemen.

Je hebt er niks aan? Ligt aan je doel...
Gebeurd dit ook als het bestand niet eens uitgevoerd wordt?
Want in feite blijft het gewijzigde bestand 1 of 2 seconde in de temp map en word daarna al verwijderd via een unlink()?

crazycoder
21/08/06, 14:22
Gebeurd dit ook als het bestand niet eens uitgevoerd wordt?
Want in feite blijft het gewijzigde bestand 1 of 2 seconde in de temp map en word daarna al verwijderd via een unlink()?
Ligt beetje aan de structuur. Jij kan het bestand wel weg hebben gegooid, maar misschien kan ik er dan wel een ander bestand schrijven. :)

Jij laat wellicht een cronjob lopen om te kijken of er een bestand staat en voer de opdrachten vervolgens uit.

Ligt natuurlijk geheel en al aan hoe jij e.e.a. op heb gebouwd. Je zou immers ook kunnen triggeren door het aanroepen van een url waar je een bepaalde checksum in meeneem. Voldoet het bestand daar niet aan dan is er een probleem. Die checksum zou je bijv. op kunnen bouwen door met sha1 een key te maken van een string opgebouwd uit alle variabelen in je bestandje. Dat kan je ook met bijv md5 doen.

Om je zomaar een paar uur extra werk te bezorgen :)

DutchTSE
21/08/06, 17:19
Jij laat wellicht een cronjob lopen om te kijken of er een bestand staat en voer de opdrachten vervolgens uit.

Ligt natuurlijk geheel en al aan hoe jij e.e.a. op heb gebouwd. Je zou immers ook kunnen triggeren door het aanroepen van een url waar je een bepaalde checksum in meeneem. Voldoet het bestand daar niet aan dan is er een probleem. Die checksum zou je bijv. op kunnen bouwen door met sha1 een key te maken van een string opgebouwd uit alle variabelen in je bestandje. Dat kan je ook met bijv md5 doen.

Om je zomaar een paar uur extra werk te bezorgen :)
Allemaal niet van toepassing :P

heb het zo gescript dat:
*code om bestand te schrijven naar lokaal bestand*
*code om lokaal bestand te versturen via SCP/SSH2 naar een bestand op remote server*
sleep(2);
*lokaal bestand wordt verwijderd*
echo "alles is goed gegaan";

Er wordt dus nergens met cronjobs gewerkt, nergens iets getriggerd etc. Aangezien lokale temp bestand ook niet wordt uitgevoerd (heeft niet eens execute rechten voor zover ik weet:
-rw-r--r-- 1 *user* *usergrp* 4385 2006-08-21 16:48 tempfile)

http://nl2.php.net/manual/en/function.ssh2-scp-recv.php
http://nl2.php.net/manual/en/function.ssh2-scp-send.php

Probeer overigens niet om slimmer te zijn dan jullie, maar gewoon om te kijken of het echt zo beroerd is, aangezien mijn kennis nog in het beginstadium verkeerd ;)