[PHP] wget met exec(), is dit veilig?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hoi,

Ik heb een functie gemaakt om een website op te slaan die mensen van buitenaf in kunnen voeren in mijn script.

Ik voer htmlentities uit op de url en daarna replace ik \ en @ met niks
dan gebruik ik de functie escapeshellarg() voor de $url variable.
dan voer ik voer ik het onderstaande commando uit met exec(), de $targetfile is een random md5 code zonder extentie.

PHP:
1
wget --user-agent=Mozilla --referer="$url" --timeout=10 -O $targetfile "$url"


Is dit 100% veilig, of is het mogelijk dat iemand mijn server kan hacken hiermee?

[ Voor 9% gewijzigd door Verwijderd op 14-11-2005 19:15 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Misschien is dit wel veilig (hoewel ik vermoed van niet), maar waarom gebruik je niet gewoon fopen()? Die kan ook gewoon via http of zelfs ftp iets downloaden. Als dat niet kan omdat je persé een referer of user-agent nodig hebt, kun je desnoods via fsockopen() iets regelen:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$fp = fsockopen($host, 80, $errno, $errstr, 30);
if ($fp) {
            $out = "GET /$uri HTTP/1.1\r\n";
            $out .= "Host: $host\r\n";
            $out .= "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; nl-NL; rv:1.7.10) Gecko/20050717 Firefox/1.0.6\r\n";
            $out .= "Connection: Close\r\n\r\n";
            
            $response = '';
            
            fwrite($fp, $out);
            while (!feof($fp)) {
                $response .= fgets($fp, 128);
            }
            fclose($fp);

            $response = explode("\r\n\r\n", $response, 2);
            $headers = explode("\r\n", $response[0]);
} else {
echo "Fout $errno: $errstr";
}


Uiteindelijk zal $response de inhoud van je bestand/pagina bevatten, die je vervolgens weer kunt wegschrijven naar een bestand oid.

Als je bovenstaande methode ietwat aanpast door tijdens het downloaden al te kijken of je de headers binnen hebt, kun je zelfs beveiligingen in je script aanbrengen waarmee je bestandsgrootte, bestandstype e.d. beperkt.

[ Voor 15% gewijzigd door Verwijderd op 14-11-2005 19:25 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik had het eerst zo, maar dat leverde erg veel problemen op. Hij bleef soms hangen, en hij kwam ook vaak niet door de hotlink beveiliging heen.
En ik had ook vaak problemen met de header, die soms net iets anders moest etc.
Wget is echt de enige oplossing voor mij, maar ik wil wel zeker weten dat het veilig is.

[ Voor 9% gewijzigd door Verwijderd op 14-11-2005 19:27 ]


Acties:
  • 0 Henk 'm!

  • Sander
  • Registratie: Juni 2004
  • Niet online
Kwestie van heel goed trimmen en controleren. Wat denk je dat er gebeurd als iemand jouw script omzeilt door het wget command af te sluiten met "; en dan vervolgens rm -r / doet ofzo?

Je zult de input HEEL goed moeten checken.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ja, maar "; kan dus al niet omdat ik htmlentities met ENT_QUOTES doe.
Maar ik vraag me dus af of dat, en escapeshellarg genoeg is om alle mogelijke manieren van omzeilen eruit te filteren.

Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 18-09 14:42
Ikzelf zou het via de fsockopen() oplossing doe welke gegeven wordt. Als referer header geef je simpelweg de opgevraagde pagina op zodat anti-hotlink scripts je niet tot last zijn. En zo weet je ook zeker dat er een bestand wordt opgeslagen welke via poort 80 verschikbaar is, en dus nooit iets kan zijn wat buiten je webroot ligt.

Overigens kun je, als verificatie of een string een URL is, parse_url() gebruiken. En het resultaat hiervan is heel simpel in de fsockopen-functie hierboven te stoppen.


Wil je echt met wget blijven werken, verifieer dan realpath() of het opgegeven bestand niet stiekem, op wat voor manier dan ook, een lokaal bestand is.

[ Voor 17% gewijzigd door frickY op 14-11-2005 19:44 ]


Acties:
  • 0 Henk 'm!

  • killercow
  • Registratie: Maart 2000
  • Laatst online: 18-09 12:47

killercow

eth0

je kunt het ook met curl doen, dat is echt een super robuuste http client.

op de php site is er genoeg over curl te vinden.

openkat.nl al gezien?

Pagina: 1