controle file type csv
Op welke manier kan ik mbv $_FILES[file][type] controleren of het ge-uploade bestand inderdaad een csv bestand is?
Ik dacht zelf: (naar voorbeeld van w3schools)
if (($_FILES["file"]["type"] == "text/csv") && ($_FILES["file"]["size"] < 20000))
maar het enige wat werkt bij mij is:
if (($_FILES["file"]["type"] == "text/plain") && ($_FILES["file"]["size"] < 20000))
Niet erg. Maar ik vraag me nu af: bestaat "text/csv" niet of is er iets mis met mn csv-bestand waarmee ik dit ff test?
groet en dank bij voorbaat!
uhm, controleer de extentie...
Wat is of welke zijn $_FILES[file][type] voor een csv bestand?
Wil je weten of de inhoud van een bestand ook daadwerkelijk overeenkomt met de extensie, dan zou je eens naar de fileinfo extensie kunnen kijken. Daarmee wordt bij het bepalen van het type echt naar de inhoud van een bestand gekeken en niet naar de extensie.
Blanche schreef op 06.06.2009 23:05:
De waarde van $_FILES['file']['type'] is puur en alleen gebasseerd op de extensie van het betreffende bestand waaraan een mime type gekoppeld wordt.
En is ook niet te vertouwen, aangezien die door de browser wordt gezet. De waarde kan dus heel makkelijk worden veranderd. Als je alleen hier naar kijkt is het dus heel gemakkelijk om een php bestand te uploaden.
Wanneer ik $_FILES['file']['type'] uitlees en echo wanneer ik een .csv bestand upload zegt ie:
Type: text/plain
@Karl en Blanche. Jullie hebben gelijk, het is me om een soort beveiliging te doen. Ik dacht dit in 2 stappen te doen:
1. controle of het ge-uploade bestand daadwerkelijk csv bestand is (en geen .exe met ellende)
2. mbv FILTER_SANATIZE_STRING de gegevens van de csv filteren voordat ik ze overneem en in de database wegschrijf.
Is dit voldoende?
Arnold schreef op 07.06.2009 07:51:
Dit geeft jou geen garantie dat er geen php of exe bestand geupload wordt. Je kunt namelijk prima een php bestand de extensie .csv geven en hem later zo bewerken dat je hem toch kunt uitvoeren.1. controle of het ge-uploade bestand daadwerkelijk csv bestand is (en geen .exe met ellende)
Maar dat terzijde, als jij het bestand niet op je server opslaat en ervoor zorgt dat de inhoud op geen enkele manier uitgevoerd kan worden, zit je veilig. Het enige waar je dan nog tegen aan kunt lopen is het feit wat te doen als de inhoud daadwerkelijk geen csv blijkt te zijn. Sla je dat dan wel op in je database of wat?
Als laatste, wil je echt zeker zijn van de inhoud van een bepaald bestand, ongeacht de extensie? Kies dan voor de fileinfo extensie van PHP.
Ik zie dat fileinfo extensie 'standaard' is vanaf php versie 5.3 (nu nog beta?). In ieder geval draait MAMP nu nog met php 5.2.6. Het is wel de moeite waard, lijkt me. Maar voor dit moment wacht ik maar even op de volgende versie.
Advies van Blanche:
- niet op de server opslaan: OK, ik gebruik alleen $_FILES["file"]["tmp_name"] (maar dat is toch tenminste 'tijdelijk' opslaan?)
- niet uitvoeren: OK, maar wat doet fgetcsv precies? Is dat dan eigenlijk de 'beveiliging' ? Ik bedoel (lees: hoop!): kan fgetcsv ALLEEN met csv files aan de slag? Of gaat fgetcsv ook door een php of exe heenlopen?
Verder zal fgetcsv() elk bestand openen om te zien of er csv informatie in zit. Als dat niet het geval is, verwacht ik dat de functie een foutmelding geeft of in ieder geval een lege array terug geeft. PHP code of de inhoud van een EXE zullen in ieder geval niet uitgevoerd worden.