[php] ftp_get problemen

Pagina: 1
Acties:
  • 476 views

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Maaark
  • Registratie: Juli 2008
  • Laatst online: 30-05 12:23
Hallo Tweakers,

Nadat ik de vorige keer hier zo goed geholpen was heb ik besloten om hier nogmaals hulp te vragen.

Omschrijving van het doel:
Ik probeer een updater te maken die een webshop update. Hiervoor zet ik alle aangepaste files in een .zip document en haal die van een ftp af. Vervolgens moet die uitgepakt worden en de files overschrijven.
Moet ik dit wel via een ftp functie doen of kan het makkelijker? (system(); is door de server geblokkeerd)

Probleem:
Ik krijg nadat ik ben begonnen met het maken ervan en het opzoeken van een dergelijk script de volgende output:
code:
1
2
3
4
5
6
7
Current directory: /
Current directory is now: /domains/domein.com/public_html
array(3) { [0]=> string(11) "updates.zip" [1]=> string(2) ".." [2]=> string(1) "." } 
Warning: ftp_get(updates.zip) [function.ftp-get]: failed to open stream: Permission denied in /home/user/domains/domein.com/public_html/webshop/admin/run_updater.php on line 50

Warning: ftp_get() [function.ftp-get]: Error opening updates.zip in /home/user/domains/domein.com/public_html/webshop/admin/run_updater.php on line 50
Problemen met het downloaden..

De zip en de php file zijn 777 chmodded.

Script:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
<?php 
// Set to the directory to extract archive to 
//echo $_SERVER['DOCUMENT_ROOT'];
$scheiden = $_SERVER['SCRIPT_FILENAME'];
$var = explode("/", $scheiden);

$extractTo = $_SERVER['DOCUMENT_ROOT'].'/'; 


// Set remote FTP server 
$ftp_server = 'ip'; 

// FTP login details: 
$ftp_user_name = 'user'; 
$ftp_user_pass = 'pass'; 

// Name of the zip file 
$$filename = 'updates.zip'; 

//////////////////////////////////////////////////////////// 
// END OF CONFIGURATION 
//////////////////////////////////////////////////////////// 

// Connect to the FTP server 
$ftp_id = ftp_connect($ftp_server); 


// Login to FTP server 
$login_result = ftp_login($ftp_id, $ftp_user_name, $ftp_user_pass); 

if ((!$ftp_id) || (!$login_result)) {
    die("FTP connection has failed !");
}

ftp_pasv($ftp_id, true);
echo "Current directory: " . ftp_pwd($ftp_id) . "<br />";

if (ftp_chdir($ftp_id, "/domains/domein.com/public_html/")) {
    echo "Current directory is now: " . ftp_pwd($ftp_id) . "<br />";
} else { 
    echo "Couldn't change directory\n";
}
// get contents of the current directory
$contents = ftp_nlist($ftp_id, ".");

// output $contents
var_dump($contents);
// Download file from the FTP server 
if (ftp_get($ftp_id, $filename, $filename, FTP_BINARY)) 
{ 
    $zip = new ZipArchive; 
     
    // Open the zip file 
    if ($zip->open($filename)) 
    { 
        // Extract the zip file 
        $zip->extractTo($extractTo); 
         
        // Close the ZIP file 
        $zip->close(); 
         
        echo "De webshop is nu geupdated!"; 
    } 
    else 
    { 
        echo "Problemen met het unzippen van $filename. Neem contact op met de admin"; 
    } 
} 
else 
{ 
    echo "Problemen met het downloaden.. $filename \n"; 
} 

// Close the FTP connection 
ftp_close($ftp_id); 

// Remove the zip file 
@unlink($filename); 

?>


Ik wil graag horen hoe jullie erover denken en alvast bedankt :D

Acties:
  • 0 Henk 'm!

  • dtech
  • Registratie: Juni 2005
  • Laatst online: 16-05 15:29
Maaark schreef op zaterdag 26 juni 2010 @ 23:56:Vervolgens moet die uitgepakt worden en de files overschrijven.
Moet ik dit wel via een ftp functie doen of kan het makkelijker? (system(); is door de server geblokkeerd)
FTP weet helemaal niks van zip (sterker nog, FTP is ouder dan ZIP). Your best bet is waarschijnlijk de zip extentie van PHP als het direct uitvoeren van commando's geblokkeerd is. (al ben ik hier zelf een omheen gegaan door met een SSH2 class in php een SSH verbinding naar de eigen server op te zetten, in te loggen en dan het commando uit te voeren. Dit raad ik je i.v.m. veiligheid echter ten zeerste af)
Maaark schreef op zaterdag 26 juni 2010 @ 23:56:
De zip en de php file zijn 777 chmodded.
Dat ga je dus heel even snel naar maximaal 666 (en liefst minder) modden; het is nergens voor nodig dat gedownloade bestande (en php scripts) uitvoerbaar zijn en in mijn ervaring is dit zelfs de grootste oorzaak van via PHP geinstalleerde trojans en andere prut op webservers (upload trojan met uploadscript, gebruik lek in script om uit te voeren en klaar ben je)

Is er trouwens enige reden waarom je een variable variable ($$filename) gebruikt? Ik kan me werkelijk geen zinnige reden voorstellen waarom je een variable "$upload.zip" oid wil hebben.

Waar het fout gaat is oftewel dat je het bestand niet mag openenen (bijv. door restricties op de remote server) oftewel dat je het bestand niet lokaal mag schrijven (lijkt me waarschijnlijker). Probeer met file_put_contents eens een eenvoudig filetje aan te maken.

Ook kan je code heel wat makkelijk (dwz: het hele FTP deel kan eruit) als je gewoon copy() gebruikt met een ftp stream, je krijgt dan zoiets:
code:
1
copy("ftp://user:pass@host/pad/filenaam.zip", "uploader.zip");

Acties:
  • 0 Henk 'm!

  • Maaark
  • Registratie: Juli 2008
  • Laatst online: 30-05 12:23
dtech schreef op zondag 27 juni 2010 @ 00:10:
[...]


FTP weet helemaal niks van zip (sterker nog, FTP is ouder dan ZIP). Your best bet is waarschijnlijk de zip extentie van PHP als het direct uitvoeren van commando's geblokkeerd is. (al ben ik hier zelf een omheen gegaan door met een SSH2 class in php een SSH verbinding naar de eigen server op te zetten, in te loggen en dan het commando uit te voeren. Dit raad ik je i.v.m. veiligheid echter ten zeerste af)


[...]


Dat ga je dus heel even snel naar maximaal 666 (en liefst minder) modden; het is nergens voor nodig dat gedownloade bestande (en php scripts) uitvoerbaar zijn en in mijn ervaring is dit zelfs de grootste oorzaak van via PHP geinstalleerde trojans en andere prut op webservers (upload trojan met uploadscript, gebruik lek in script om uit te voeren en klaar ben je)

Is er trouwens enige reden waarom je een variable variable ($$filename) gebruikt? Ik kan me werkelijk geen zinnige reden voorstellen waarom je een variable "$upload.zip" oid wil hebben.

Waar het fout gaat is oftewel dat je het bestand niet mag openenen (bijv. door restricties op de remote server) oftewel dat je het bestand niet lokaal mag schrijven (lijkt me waarschijnlijker). Probeer met file_put_contents eens een eenvoudig filetje aan te maken.

Ook kan je code heel wat makkelijk (dwz: het hele FTP deel kan eruit) als je gewoon copy() gebruikt met een ftp stream, je krijgt dan zoiets:
code:
1
copy("ftp://user:pass@host/pad/filenaam.zip", "uploader.zip");
Allereerst bedankt voor je reactie.
Die $$filename is een typo, moet natuurlijk $filename zijn.

Je copy idee werkt helaas niet helemaal,
mijn code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php

$file = 'people.txt';
// Open the file to get existing content
$current = file_get_contents($file);
// Append a new person to the file
$current .= "John Smith\n";
// Write the contents back to the file
file_put_contents($file, $current);

if(copy("http://updates.domein.com/updates.zip", "updates.zip"))
{
    echo 'Bestand binnengehaald';
}
else
{
    echo 'Error while fetching data!';
}
?>


Hier word de people.txt wel netjes gevuld maar krijg ik weer een soortelijke error:
code:
1
Warning: copy(updates.zip) [function.copy]: failed to open stream: Permission denied in /home/user/domains/domein.com/public_html/webshop/admin/updator.php on line 11


Wat doe ik weer verkeerd?

Nog een vraagje over de rechten, hoe kan een aanvaller er dan misbruik van maken ofzo?

Alvast bedankt

Edit:

Ook met het ftp command lukt het niet.. Ik kan als ik de copy url in de browser invoer hem wel gewoon binnen trekken maar het wilt met copy() gewoon niet lukken

[ Voor 3% gewijzigd door Maaark op 27-06-2010 00:55 . Reden: uitleg ]


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Maaark schreef op zondag 27 juni 2010 @ 00:48:

Nog een vraagje over de rechten, hoe kan een aanvaller er dan misbruik van maken ofzo?
Bijvoorbeeld een .php bestand uploaden en daarna uitvoeren door te navigeren naar jouwsite.nl/uploads/evil.php

Acties:
  • 0 Henk 'm!

  • Maaark
  • Registratie: Juli 2008
  • Laatst online: 30-05 12:23
Aah, bedankt :)

Maar iemand een oplossing voor mijn probleem?

Acties:
  • 0 Henk 'm!

  • 8088
  • Registratie: December 2000
  • Niet online

8088

NaN

Permission denied
De ftp gebruiker mag de betreffende map niet in en/of mag het bestand niet lezen. Probeer het eens met een normale ftp client om dit te kunnen bevestigen/uit te sluiten.

[ Voor 11% gewijzigd door 8088 op 27-06-2010 01:27 ]

Do you seek to engage in or have you ever engaged in terrorist activities, espionage, sabotage, or genocide?


Acties:
  • 0 Henk 'm!

  • Maaark
  • Registratie: Juli 2008
  • Laatst online: 30-05 12:23
Via filezilla kan ik hem wel gewoon binnen halen (via de zelfde user dan ik in t script gebruik).

En als ik de ftp:// regel in mijn browser gooi werkt het wel gewoon..

[ Voor 27% gewijzigd door Maaark op 27-06-2010 11:28 ]


Acties:
  • 0 Henk 'm!

  • Maaark
  • Registratie: Juli 2008
  • Laatst online: 30-05 12:23
Ik kreeg te horen dat ik copy beter niet kon gebruiken maar dat ik 2(!?) ftp verbindingen moest maken. Klopt dit?

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 19:18

Janoz

Moderator Devschuur®

!litemod

Het klopt inderdaad dat een FTP verbinding inderdaad uit twee verbindingen bestaat. De ene verbinding is de controle verbinding waarover de commando's verstuurd worden en de andere is de data verbinding waarover de data verstuurd wordt. Dit is echter compleet niet van belang bij dit probleem. Dit is namelijk allemaal keurig weggeabstraheerd achter de ftp functies van php.

De melding die je krijgt is een security melding. 'Permission denied'. Het lijkt me handiger wanneer je je daar op richt. Dit geld niet alleen voor de rechten op de ftp server, maar ook voor de rechten van de webserver zelf en op het filesystem waar je het bestand heen wilt schrijven en of je uberhaupt de functies wel mag gebruiken.

Tot slot vraag ik me af wat je met deze functionaliteit wilt bereiken. Ik krijg namelijk een beetje het idee dat je iets met ftp op probeert te lossen wat ook veel simpeler gewoon met een gewone filecopy zou kunnen.

Tot slot:

Afbeeldingslocatie: http://tweakimg.net/g/forum/images/icons/alert.gif Je hebt zelf als laatste gereageerd in dit topic, wil je wat toevoegen wijzig dan bij voorkeur je laatste bericht.

staat er niet voor niks!

[ Voor 11% gewijzigd door Janoz op 27-06-2010 14:35 ]

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Maaark
  • Registratie: Juli 2008
  • Laatst online: 30-05 12:23
Met file copy bedoel je gewoon copy();?
En hoe kan ik erachter komen of ik overal genoeg rechten heb?

Aangezien ik zowel bij de copy() en bij de ftp functies ongeveer de zelfde error krijg..
Lijkt mij het wel een rechten issue?

Daarnaast, de website is gehost bij versio.

Acties:
  • 0 Henk 'm!

  • Manuel
  • Registratie: Maart 2008
  • Laatst online: 30-05 12:04
Nou je laatste reactie getuigt gewoon van dat je niet eens weet wat je aan het doen bent, sorry maar ik zie het nu eerder dat je een snelle quick-fix zoekt en dan hopen dat je scriptje werkt. En om antwoord te geven op je vraag: Het is een rechten probleem en controleer of alle paden in je script kloppen met die van je file system.

Want '/domains/domein.com/public_html' bestaat niet, dit pad daarin tegen wel: '/home/userX/domains/domein.com/public_html'

Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 00:29

MueR

Admin Tweakers Discord

is niet lief

Manuel schreef op zondag 27 juni 2010 @ 15:55:
Want '/domains/domein.com/public_html' bestaat niet, dit pad daarin tegen wel: '/home/userX/domains/domein.com/public_html'
Binnen FTP is dat wel een bestaand pad bij veel hosting machines. FTP gebruikt vaak /home/username/ als virtual root ;)

Maar verder ben ik eigenlijk wel klaar met dit topic. Zorg maar eerst eens dat je weet _waar_ dat bestand wordt geupload (ie: zorg dat je achter het absolute pad van de current working directory komt), of je wel de goede rechten op die map hebt gezet (apache draait vaak onder user 'nobody' of een soortgelijke user zonder rechten) en meer van dat spul. Kortom: ga debuggen.

Anyone who gets in between me and my morning coffee should be insecure.

Pagina: 1

Dit topic is gesloten.