webForumDet fria alternativet

Vad bör man tänka på om man tillåter filuppladdning av txt?

PHP

5 svar · 605 visningar · startad av aasah

Medlem sedan mars 20034 471 inlägg
Frågan#1

För att förenkla (i första hand för mig själv) funderar jag på att tillåta filuppladdning av txt-filer på min site. Filerna i fråga innehåller frågesporter av olika slag som ska läsas in till databasen. Själva inläsningen kommer att ha en rejäl innehållskoll att det ser vettigt ut, men innan det kommer så långt, vad ska jag tänka på?

Jag har ett testskript som laddar upp filer snyggt och prydligt, men... Ur säkerhetssynpunkt finns det säkert mycket att hålla i minnet om man börjar labborera med filuppladdning. Så...

  1. Hur kollar jag hur stor filstorlek den uppladdade filen har? Och vad är en rimlig maxgräns att tillåta för en textfil?

  2. Finns det något annat (bättre) sätt att förvissa sig om att det är text som laddats upp, än att (bara) kolla filändelsen?

  3. Vad bör jag mer kolla upp och tänka på innan man börjar hantera filerna? Förutom $_FILES["fil"]["error"], som man så klart måste kolla på.

  4. Bör jag göra något för att aktivt slänga en fil som inte blir godkänd av något skäl och i så fall vad? Eller slängs den med automatik när skriptet har körts klart?

Medlem sedan mars 20034 471 inlägg
#2

50+ som tittat på detta och ingen har några tips? Varför inte?

Medlem sedan dec. 20025 483 inlägg
#3

Eftersom jag inte kan PHP, och således inte vet vad språket har att erbjuda, gjorde jag en snabbsökning och fann följande:
http://www.webcheatsheet.com/PHP/file_upload.php

Däri listas fler intressanta index än "error" du kan kolla, bl.a. content-type och storlek. Om det bara är textfiler du är intresserad av så kanske du kan nöja dig med filer där content-type = text/plain.

Sedan kanske du bör skapa en speciell uppladdningskatalog som bara har läs- och skrivrättigheter.

Medlem sedan mars 20041 505 inlägg
#4
  1. Finns det något annat (bättre) sätt att förvissa sig om att det är text som laddats upp, än att (bara) kolla filändelsen?

Det är knepigt att skilja textfiler från andra elaka filer eftersom "textfiler" är ett ganska luddigt begrepp.
I datorvärlden så är ju text en klump bytes som kan förekomma i olika former beroende på teckenkodning.
Vilken teckenkodning förväntar du dig att användarna ska ladda upp?

Om vi t.ex. väljer Windows-1252/ANSI (som är förvalt i Notepad) så kan man scanna textfilen efter "konstiga" bytes/codepoints som aldrig förekommer i skrift.
Det är ganska orimligt att någon skulle använda låga kontrolltecken som t.ex. 0x0, 0x1, 0x2 osv...
Dyker det upp sånt i filen så kan man misstänka att det är något annat än text och slänga det åt skogen.

Jag har jobbat mycket lite med $_FILES i PHP, någon annan här kanske kan snickra i hop ett exempel på hur du läser varje byte.

Och slutligen, att kolla filändelsen är så otroligt tandlöst att det inte är lönt.

Medlem sedan mars 20034 471 inlägg
#5

Peter S - tack! Ska kolla! :)

Peter S skrev:

Däri listas fler intressanta index än "error" du kan kolla, bl.a. content-type och storlek. Om det bara är textfiler du är intresserad av så kanske du kan nöja dig med filer där content-type = text/plain.

Enligt PHP:s dokumentation finns det ett problem med content-type och storlek: PHP kollar inte att de stämmer. Mao, man kan inte lita på deras innehåll. Eller, åtminstone, var det den uppfattningen jag fick när jag läste manualen före skapandet av den här tråden.

php.net skrev:

You can, for example, use the $_FILES['userfile']['size'] variable to throw away any files that are either too small or too big. You could use the $_FILES['userfile']['type'] variable to throw away any files that didn't match a certain type criteria, but use this only as first of a series of checks, because this value is completely under the control of the client and not checked on the PHP side.

Troxy skrev:

Vilken teckenkodning förväntar du dig att användarna ska ladda upp?

Om vi t.ex. väljer Windows-1252/ANSI (som är förvalt i Notepad) så kan man scanna textfilen efter "konstiga" bytes/codepoints som aldrig förekommer i skrift.
Det är ganska orimligt att någon skulle använda låga kontrolltecken som t.ex. 0x0, 0x1, 0x2 osv...
Dyker det upp sånt i filen så kan man misstänka att det är något annat än text och slänga det åt skogen.

Tja... om jag begränsar uppladdningen till mig själv kan jag visserligen låsa teckenkodningen, men frågan är hur mycket det tillför när jag då kan kräva att man är inloggad som admin för att filuppladdningsskriptet ska köras?

Annars är det betydligt svårare att gissa vilken teckenkodning folk har. De behöver ju inte sitta på Windows över huvudtaget...

Men det är ju ändå en god tanke... Filen borde inte innehålla några skumma tecken, så man kan kanske göra en preg_match mot a-z och lite annat smått och gott typ parenteser, 0-9, diverse punkter och dylikt? Vilket är det största ofarliga character-intervall, som inkluderar allt som kan tänkas stå legitimt i vanlig engelska?

Men vad händer i så fall med end-of-file? Det måste väl inkluderas i kollen? Eller?

Och skulle en sådan preg-match stoppa tex en Word-fil?

Troxy skrev:

Och slutligen, att kolla filändelsen är så otroligt tandlöst att det inte är lönt.

Att kolla filändelsen är uselt skydd mot folk som vill jävlas, men kan vara bra som stopp mot folk som helt enkelt gör fel och råkar ladda upp en Word-fil (tex) och inte en txt-fil.

Medlem sedan mars 20041 505 inlägg
#6

Du ska låsa dig till en teckenkodning, annars blir det komplikationer när du sparar det i databasen.
Om man inte förväntar sig något specifikt från användaren så måste programmet gissa och sedan konvertera.
Vad händer om någon laddar upp UTF-8 utan BOM t.ex.?

Det bästa är att bestämma dig för Latin-1 och blockera alla bytes mellan 7F–9F och kanske lite låga bytes också (förutom CR, LF och space såklart :p )
Då stoppar du nog dom flesta filerna som inte är "ren text", må det vara Word eller en trojansk häst.

262 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)
122 ms — ändringar (db)