[php] File upload > 300 Kb geeft 404 error

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Suepahfly
  • Registratie: Juni 2001
  • Laatst online: 17-09 17:05
Ik heb een simpel scriptje voor file uploads. Op diverse windows servers (met verschillende versie van Apache en PHP) werkt het allemaal goed. Alleen op de productie server (Linux) werkt het niet.

Als ik een bestand < 300 Kb upload werkt het zoals verwacht, upload ik een groter bestand dan krijg ik na verloop van tijd een 404 error.

Ik heb de upload_tmp_dir tijdelijk ge-chmod naar 2777 (alle rechten, nieuwe objecten erven deze rechten) Het zelfde heb ik ook gedaan op de directory waar de bestanden naar toe worden geschreven.

Script waar ik mee test:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?
if($_SERVER['REQUEST_METHOD'] == "POST")
{

    $afbeelding = $_FILES['afbeelding']['name'];
    $locatie = "/home/~suepahfly/html/test";
    
    if(file_exists($_FILES['afbeelding']['tmp_name']))
    {
        if(move_uploaded_file($_FILES['afbeelding']['tmp_name'], $locatie . "/" . $afbeelding) !== false)
        {
            echo "Upload OK";
        }
        else
        {
            echo "Upload niet OK";
        }
    }
}
?>
<form enctype="multipart/form-data" method="post">
Upload dit bestand: <input name="afbeelding" type="file">
<input type="submit" value="Upload!">
</form>


Stukje uit php.ini
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
; Maximum size of POST data that PHP will accept.
post_max_size = 8M


[...]
; Whether to allow HTTP file uploads.
file_uploads = On

; Temporary directory for HTTP uploaded files (will use system default if not
; specified).
upload_tmp_dir = /tmp

; Maximum allowed size for uploaded files.
upload_max_filesize = 5M


Iemand enig idee waar ik moet beginnen met zoeken, Aan het script en de php config kan het volgens mij niet liggen.

Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 14:53

MueR

Admin Tweakers Discord

is niet lief

Je hebt sowieso een hidden input nodig zoals onderstaande, deze bepaalt namelijk de max grootte (in bytes).
code:
1
<input type='hidden' name='MAX_FILE_SIZE' value='1000000'>

Ook moet je rekening houden met de max_execution_time, oftewel het max aantal seconden dat een bewerking loopt. Er was een manier dit te omzeilen, maar daar kan ik zo eventjes niet opkomen helaas.

Edit:
Ik heb even gezocht, je kan dit omzeilen door gebruik te maken van de set_time_limit() functie in php.

[ Voor 33% gewijzigd door MueR op 26-03-2005 12:43 ]

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


Acties:
  • 0 Henk 'm!

  • AtleX
  • Registratie: Maart 2003
  • Niet online

AtleX

Tyrannosaurus Lex 🦖

met ini_set() can je configuration directives veranderen in de waarde die jij wilt hebben, zo kan je de max_execution_time veranderen.

Die input met MAX_FILE_SIZE is niet noodzakelijk, en zelfs gevaarlijk, voor een misbruiker is het eenvoudig om deze waarde te veranderen waarna hij grotere bestanden kan uploaden.

Sole survivor of the Chicxulub asteroid impact.


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 14:53

MueR

Admin Tweakers Discord

is niet lief

AtleX schreef op zaterdag 26 maart 2005 @ 12:42:
met ini_set() can je configuration directives veranderen in de waarde die jij wilt hebben, zo kan je de max_execution_time veranderen.
Het gebruik van ini_set() is af te raden, omdat scripts welke endless loops bevatten, ook veel langer doorgaan. Ook hebben hostingboeren de php.ini niet openstaan voor gebruikers. set_time_limit() werkt alleen voor de pagina waarop er geupload wordt, ini_set() voor heel de site.
Die input met MAX_FILE_SIZE is niet noodzakelijk, en zelfs gevaarlijk, voor een misbruiker is het eenvoudig om deze waarde te veranderen waarna hij grotere bestanden kan uploaden.
Het veranderen van hidden fields kan alleen wanneer register_globals aanstaat, wat opzich al een beveiligingsrisico is.

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


Acties:
  • 0 Henk 'm!

  • AtleX
  • Registratie: Maart 2003
  • Niet online

AtleX

Tyrannosaurus Lex 🦖

MueR schreef op zaterdag 26 maart 2005 @ 12:46:
[...]

Het veranderen van hidden fields kan alleen wanneer register_globals aanstaat, wat opzich al een beveiligingsrisico is.
Ok, ik sla de pagina op op mijn harde schuif, verander wat noodzakelijke dingetjes zodat hij nog wel post naar het goede adres en verander
code:
1
<input type='hidden' name='MAX_FILE_SIZE' value='1000000'>

in
code:
1
<input type='hidden' name='MAX_FILE_SIZE' value='9999999999'>

Dan heb ik niets met register_globals te maken gehad en toch heb ik zeer eenvoudig je beveiliging omzeilt.

[ Voor 9% gewijzigd door AtleX op 26-03-2005 12:49 ]

Sole survivor of the Chicxulub asteroid impact.


Acties:
  • 0 Henk 'm!

  • Suepahfly
  • Registratie: Juni 2001
  • Laatst online: 17-09 17:05
code:
1
<input type='hidden' name='MAX_FILE_SIZE' value='1000000'>
Boeit me nu niet zoveel, het is niet noodzakelijk aangezien dit een test script is.


Het ligt niet aan de max_execution_time. Ik krijg daar geen errors op en set_time_limit(0); werkt in dit geval ook niet. FireFox geeft 'Dit document bevat geen gegevens' en IE een 404 en soms een 'Kan de server niet vinden'

Ook zie ik het bestand niet verschijnen als php<random_name> in /tmp en dus ook niet in /home/~suepahfly/html/test

Acties:
  • 0 Henk 'm!

  • AtleX
  • Registratie: Maart 2003
  • Niet online

AtleX

Tyrannosaurus Lex 🦖

Zet dan eens
PHP:
1
error_reporting(E_ALL);

bovenaan je script :). dan krijg je alle errors, notices en warnings te zien. Misschien krijg je dan wel relevante informatie.

Sole survivor of the Chicxulub asteroid impact.


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 14:53

MueR

Admin Tweakers Discord

is niet lief

AtleX schreef op zaterdag 26 maart 2005 @ 12:49:
Ok, ik sla de pagina op op mijn harde schuif, verander wat noodzakelijke dingetjes zodat hij nog wel post naar het goede adres en verander
code:
1
<input type='hidden' name='MAX_FILE_SIZE' value='1000000'>

in
code:
1
<input type='hidden' name='MAX_FILE_SIZE' value='9999999999'>

Dan heb ik niets met register_globals te maken gehad en toch heb ik zeer eenvoudig je beveiliging omzeilt.
Dan is het een site met brakke beveiliging... Wanneer je file uploads toestaat, moet je altijd de bron van het script bekijken :)

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


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
Error reporting lijkt me niet echt helpen als je een 404 krijgt. Ik zou het zoeken in de Apache config, allicht geeft die erg snel een time-out als het uploaden te lang duurt... Probeer eens een scriptje dat niets upload, maar dat wel een lange executietijd heeft.

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • Suepahfly
  • Registratie: Juni 2001
  • Laatst online: 17-09 17:05
Ik ben er uit.

Naast de gewone httpd.conf include apache nog een aantal andere conf bestanden die ik over het hoofd heb gezien.

Een daarvan bevat het volgende
code:
1
2
3
4
5
<Files *.php>
    SetOutputFilter PHP
    SetInputFilter PHP
    LimitRequestBody 524288
</Files>


Door LimitRequestBody te verdubbelen werkt het wel. Het is dus Apache die te grote uploads tegen houdt

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

MueR schreef op zaterdag 26 maart 2005 @ 12:46:
Het gebruik van ini_set() is af te raden, omdat scripts welke endless loops bevatten, ook veel langer doorgaan. Ook hebben hostingboeren de php.ini niet openstaan voor gebruikers. set_time_limit() werkt alleen voor de pagina waarop er geupload wordt, ini_set() voor heel de site.
ini_set() heeft helemaal hetzelfde effect als set_time_limit(), en beiden zijn onmogelijk als je hoster in safe mode draait. Beide functies zetten, voor zolang als het script draait, de maximale executietijd omhoog (of omlaag), en resetten deze weer zodra het script klaar is.
MueR schreef op zaterdag 26 maart 2005 @ 13:02:
Dan is het een site met brakke beveiliging... Wanneer je file uploads toestaat, moet je altijd de bron van het script bekijken :)
  1. HTML is geen scripting.
  2. Herkomst is te faken.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Zowel je browser (tenminste, IE en FireFox) als je PHP script negeren dat hidden input veld gewoon hoor.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 15:29

crisp

Devver

Pixelated

Grijze Vos schreef op zaterdag 26 maart 2005 @ 13:34:
Zowel je browser (tenminste, IE en FireFox) als je PHP script negeren dat hidden input veld gewoon hoor.
Dat klopt inderdaad, die optie is dus redelijk nutteloos totdat een UA besluit het te implementeren. Op die manier kan dan clientside al een melding gegenereerd worden voordat de zooi geupload wordt. Echter zal je dan nog serverside de size zelf moeten controleren; het is bedoelt als hulpmiddel en niet als foolproof check net als elke andere vorm van clientside validatie.
Je hoeft niet eens moeilijk te doen om pagina's lokaal op te slaan om hidden inputs te wijzigen; een simpel javascriptje in de adres-balk is voldoende om dat soort waarden aan te passen ;)

Intentionally left blank

Pagina: 1