[php] probleem met openen bestand

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Anoniem: 121179

Topicstarter
Ik wil een php-bestand op m'n eigen server maken en vervolgens dat bestand uitvoeren. Wat ik doe is eerst een dbconnect statement in het uit te voeren bestand zetten (dat werkt) en vervolgens wil ik alle uit te voeren code vanuit een andere server binnenhalen.

Dit doe ik als volgt :

PHP:
1
2
3
4
  $filename = "http://bla/bestand.php";
  $handle = fopen ($filename, "r");
  $contents = fread ($handle, filesize ($filename));
  fclose ($handle);


Vervolgens krijg ik de error : Warning: stat failed for http://bla/bestand.php (errno=2 - No such file or directory), maar als ik dan naar http://bla/bestand.php ga, krijg ik alle php-code wel op m'n scherm. De lokatie van het bestand lijkt me dus goed.

Ook als ik readfile ($filename) doe, krijg ik het gewenste bestand op m'n scherm, maar ik krijg het dus met geen mogelijkheid in het uit te voeren bestand geschreven. Ik kan zelfs wel hetgeen ik in het bestand (dus met <? en ?> erbij toegevoegd) wil hebben in het creatie-bestand krijgen middels print '<?'; readfile(), etc. Ik kan em dan alleen weer niet uitvoeren (logisch).

Samenvattend:

1. het kind-bestand wegschrijven lukt met de database-connectie-informatie
2. het bestand op lokatie http://bla/bestand.php met readfile openen lukt
3. het bestand op lokatie http://bla/bestand.php met readfile openen en de gehele string in de bron van het creatie-bestand zetten lukt.
4. het bestand op lokatie http://bla/bestand.php met fopen openen en de gehele string in de bron van het kind-bestand wegschrijven lukt niet .

Ik zie ongetwijfeld iets oersimpels over het hoofd, maar ik begin er aardig gestoord van te raken... Enige hulp is dan ook meer dan welkom.

Acties:
  • 0 Henk 'm!

  • semicolon
  • Registratie: Mei 2004
  • Niet online
je kunt niet op http:// schrijven? Dan moet je met FTP gaan werken.
Werk gewoon een bestand lokaal bij zou ik zeggen? :)
Of ik begrijp je verkeerd maar je zet overal http voor..

[ Voor 20% gewijzigd door semicolon op 20-10-2004 18:12 ]

:D/-<


Acties:
  • 0 Henk 'm!

Anoniem: 118860

Wil je de code die daar staat uitvoeren? Dan hier een stel caveats:
  • Zoals reeds gezegd door Max v W, je kunt niet schrijven naar een http:// URL. In de HTTP specificatie staat dat dit wel kan (dmv. een PUT request), maar in de praktijk wordt dit zo goed als nergens ondersteund. Je zult dus of met FTP moeten werken, of met lokale bestanden.
  • Als je een bestand wilt inlezen (lokaal of over het internet), gebruik dan gewoon file_get_contents(), en ga niet klooien met een fopen()/fread() lusje. Je haalt jezelf meer werk op de hals dan nodig is, en de file_get_contents() oplossing is robuuster.
  • Je wilt niet code die over het internet opgehaald wordt gaan uitvoeren in jouw script. Dit is op 86.000 manieren kwetsbaar en exploitable. Niet doen dus! Als de file toch op je eigen server staat, gebruik dan geen http:// url om het bestand te openen, maar open het gewoon vanaf de lokale schijf (met /var/www/.../, of waar het dan ook staat. Relatieve adressen zijn trouwens beter dan absolute). Als je toch PHP code gaat includen via een http:// URL, bedenk dan dat de server het PHP bestand dat je probeer te includen eerst uitvoert. Je downloadt dus niet de source van het PHP script, maar de uitvoer. Tenzij de server natuurlijk geen PHP ondersteunt, of je het bestand een andere extensie dan .php geeft. Maar nogmaals, gewoon niet doen.
  • Als je code wilt uitvoeren, kun je die beter niet inlezen in een string (tenzij in heel specifieke applicaties). Het kan wel, je kunt namelijk eval() aanroepen op de string, en dan wordt hij door de PHP interpreter heen gehaald, maar makkelijker en sneller is gewoon include of require.
  • Edit: en nu ik nog eens naar je code kijk: de fout die jij krijgt komt volgens mij omdat je geen filesize() op kan vragen van een file die via http:// geopend wordt ;)

[ Voor 19% gewijzigd door Anoniem: 118860 op 20-10-2004 18:22 ]


Acties:
  • 0 Henk 'm!

Anoniem: 121179

Topicstarter
Anoniem: 118860 schreef op 20 oktober 2004 @ 18:16:
Wil je de code die daar staat uitvoeren? Dan hier een stel caveats:
  • Zoals reeds gezegd door Max v W, je kunt niet schrijven naar een http:// URL. In de HTTP specificatie staat dat dit wel kan (dmv. een PUT request), maar in de praktijk wordt dit zo goed als nergens ondersteund. Je zult dus of met FTP moeten werken, of met lokale bestanden.
  • Als je een bestand wilt inlezen (lokaal of over het internet), gebruik dan gewoon file_get_contents(), en ga niet klooien met een fopen()/fread() lusje. Je haalt jezelf meer werk op de hals dan nodig is, en de file_get_contents() oplossing is robuuster.
  • Je wilt niet code die over het internet opgehaald wordt gaan uitvoeren in jouw script. Dit is op 86.000 manieren kwetsbaar en exploitable. Niet doen dus! Als de file toch op je eigen server staat, gebruik dan geen http:// url om het bestand te openen, maar open het gewoon vanaf de lokale schijf (met /var/www/.../, of waar het dan ook staat. Relatieve adressen zijn trouwens beter dan absolute). Als je toch PHP code gaat includen via een http:// URL, bedenk dan dat de server het PHP bestand dat je probeer te includen eerst uitvoert. Je downloadt dus niet de source van het PHP script, maar de uitvoer. Tenzij de server natuurlijk geen PHP ondersteunt, of je het bestand een andere extensie dan .php geeft. Maar nogmaals, gewoon niet doen.
  • Als je code wilt uitvoeren, kun je die beter niet inlezen in een string (tenzij in heel specifieke applicaties). Het kan wel, je kunt namelijk eval() aanroepen op de string, en dan wordt hij door de PHP interpreter heen gehaald, maar makkelijker en sneller is gewoon include of require.
1. FTP werkt niet, geprobeerd (alleen poort 80 staat open volgens mij).
2. file_get_contents() werkte ook niet, moet straks even kijken of ik de foutmelding kan terugvinden.
3. Ik snap dat ik de uitvoer download en dat is ook een beetje de bedoeling. Vandaar dat ik ook juist een nieuw bestand aanmaak, dat ik vervolgens op m'n externe server wil uitvoeren. De uitvoer bestaat uit een string van php-commando's, die moeten dus getransformeerd worden naar uit te voeren code,
4. include/require werken ook beide niet, zie punt 2.

Het hele probleem ontstaat omdat ik een tabel vanuit 1 (interne) mysql-database in 3 andere tabellen van een andere (externe) mysql-db moet zetten. Het liefst wil ik rechtstreeks die 2 db's aanspreken, maar dat kan niet (ik kan beide 'localhosts' nu eenmaal niet op 1 server aanroepen). Vandaar dat ik het bestand moet maken op de externe site en dáár moet uitvoeren. Ik zou het liever vermijden, maar volgens mij kan het even niet anders.

in het bestand staat bijvoorbeeld :

PHP:
1
$delete = "DELETE FROM table";mysql_query($delete)or die(mysql_error());


en nadat het bestand is opgehaald, dan wil ik dat er een nieuw bestand komt met daarin:

PHP:
1
2
3
4
   $database_server = mysql_connect("localhost","uname","pw");
   mysql_select_db("name", $database_server)or die("Kan de database niet openen!");

$delete = "DELETE FROM table";mysql_query($delete)or die(mysql_error());


Dát bestand wil ik dan uitvoeren.


hmm, zag je edit te laat.. dat ga ik eens even proberen.

[ Voor 3% gewijzigd door Anoniem: 121179 op 20-10-2004 18:30 ]


Acties:
  • 0 Henk 'm!

Anoniem: 118860

Okee; als we even een stapje terug nemen: heb je shell access op deze servers?

Zo ja, dan lijkt het me oneindige malen eenvoudiger om op de database (of tabel, in dit geval) gewoon te dumpen met de command-line mysql tools, en dan op de andere servers die dump te wgetten en in de andere database in te voegen.

En als je liever geen command-line gebruikt, kun je dit altijd nog doen met phpMyAdmin.

Acties:
  • 0 Henk 'm!

Anoniem: 121179

Topicstarter
Nee, heb maar shell access tot 1 van die servers. Verder ben je een keizer, want dat ene kleine fuckdingetje, filesize($filename), was em...

Deze gaat in m'n little black book of extremely wasteful, small but stupid mistakes.

muchos gracias!


owja, via phpmyadmin gaat niet, het ging me net om dat automagische,

[ Voor 15% gewijzigd door Anoniem: 121179 op 20-10-2004 18:46 ]


Acties:
  • 0 Henk 'm!

  • usr-local-dick
  • Registratie: September 2001
  • Niet online
Als het nu werkt is in ieder geval de juiste fopen_wrapper aangezet.
De enige reden waarom file_get_contents dan niet werkt is dat je PHP ouder dan 4.3.0 is.
Pagina: 1