veiligheid van upload
Is dit onderstaande scriptje veilig? (of veilig genoeg). Ik kan het eigenlijk onvoldoende beoordelen.
Ik wil de inhoud van een csv -bestandje in een array stoppen. Daarna kan ik met die array aan de slag.
Code (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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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
<?php
function upload() {
$sFout = '';
$sFilename = $_FILES['file']['name'];
$sExt = substr($sFilename, strpos($sFilename, '.'), strlen($sFilename) - 1);
if ($_FILES["file"]["type"] <> "text/plain") {
$sFout .= 'Het bestand is geen text-bestand.';
}
if ($_FILES["file"]["size"] > 20000) {
$sFout .= 'Het bestand mag niet groter zijn dan 20kb.';
}
if ($_FILES["file"]["error"] > 0) {
$sFout .= 'Het systeem meldt foutcode: "' . $_FILES["file"]["error"]. '"';
}
if ($sExt == "csv" || $sExt == "txt") {
$sFout .= 'Het bestand mag geen andere betandsextensie hebben dan .csv of .txt.';
}
if ($sFout <> "") {
echo '<br/>Er is iets foutgegegaan.<br/>' . $sFout;
} else {
echo 'Upload: ' . $_FILES["file"]["name"]. '<br />';
echo 'Type: ' . $_FILES["file"]["type"]. '<br />';
echo 'Size: ' . ($_FILES["file"]["size"] / 1024) . ' Kb<br />';
echo 'Stored in: ' . $_FILES["file"]["tmp_name"] . '<br/>';
$handle = fopen($_FILES["file"]["tmp_name"], "r");
while (($aData = fgetcsv($handle, 1000, ",")) !== FALSE) {
if (!(current($aData) == "" && count(array_unique($aData)) == 1)) {
while (end($aData) == "") {
array_pop($aData);
}
$aArray[] = $aData;
}
}
fclose($handle);
tabel(1,$aArray);
}
}
?>
function upload() {
$sFout = '';
$sFilename = $_FILES['file']['name'];
$sExt = substr($sFilename, strpos($sFilename, '.'), strlen($sFilename) - 1);
if ($_FILES["file"]["type"] <> "text/plain") {
$sFout .= 'Het bestand is geen text-bestand.';
}
if ($_FILES["file"]["size"] > 20000) {
$sFout .= 'Het bestand mag niet groter zijn dan 20kb.';
}
if ($_FILES["file"]["error"] > 0) {
$sFout .= 'Het systeem meldt foutcode: "' . $_FILES["file"]["error"]. '"';
}
if ($sExt == "csv" || $sExt == "txt") {
$sFout .= 'Het bestand mag geen andere betandsextensie hebben dan .csv of .txt.';
}
if ($sFout <> "") {
echo '<br/>Er is iets foutgegegaan.<br/>' . $sFout;
} else {
echo 'Upload: ' . $_FILES["file"]["name"]. '<br />';
echo 'Type: ' . $_FILES["file"]["type"]. '<br />';
echo 'Size: ' . ($_FILES["file"]["size"] / 1024) . ' Kb<br />';
echo 'Stored in: ' . $_FILES["file"]["tmp_name"] . '<br/>';
$handle = fopen($_FILES["file"]["tmp_name"], "r");
while (($aData = fgetcsv($handle, 1000, ",")) !== FALSE) {
if (!(current($aData) == "" && count(array_unique($aData)) == 1)) {
while (end($aData) == "") {
array_pop($aData);
}
$aArray[] = $aData;
}
}
fclose($handle);
tabel(1,$aArray);
}
}
?>
Gewijzigd op 01/01/1970 01:00:00 door Arnold C
Ik doe ff een bump: ik wil heel graag weten hoe jullie de veiligheid van zo'n upload beoordelen........
Iemand?
Mimetype kan je vervalsen, omdat dat door de browser bedacht wordt. Het is een goeie check om ervoor te zorgen dat iemand niet per ongeluk een plaatje upload, maar het is geen beveiliging :)
Resultaat: Ik zou een PHP-script kunnen uploaden.
Maar je slaat dat wat ik upload niet direct op. Dus ervan uitgaande dat je $aArray veilig verwerkt maakt het niet uit wat er geüpload wordt, het is geen beveiligingslek.
want als het dan geen afbeelding is, maar een tekst bestand met jpg als extensie krijg je deze melding:
Notice: getimagesize() [function.getimagesize]: Read error!
Hoe kan je deze melding opvangen?
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
if(getimagesize($ftemp))
{
list($width, $height) = getimagesize($ftemp);
}
?>
if(getimagesize($ftemp))
{
list($width, $height) = getimagesize($ftemp);
}
?>
Edit: En nog gefeli met je 1000e post ;-)
Gewijzigd op 01/01/1970 01:00:00 door Michael -
@Jelmer & @Miloan: dat zou dan toch ook test.txt.php 'tegen moeten houden'?
@Jelmer: helemaal nog niet aangedacht......natuurlijk $aArray goed controleren. Dank!
pathinfo
list( $dirname, $basename, $extension, $filename ) = pathinfo($file);
Gewijzigd op 01/01/1970 01:00:00 door Emmanuel Delay
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$finfo = finfo_open(FILEINFO_MIME, "test.csv"); // return mime type ala mimetype extension
if (!$finfo) {
echo "Opening fileinfo database failed";
exit();
}
/* get mime-type for a specific file */
$filename = "/usr/local/something.txt";
echo finfo_file($finfo, $filename);
/* close connection */
finfo_close($finfo);
?>
$finfo = finfo_open(FILEINFO_MIME, "test.csv"); // return mime type ala mimetype extension
if (!$finfo) {
echo "Opening fileinfo database failed";
exit();
}
/* get mime-type for a specific file */
$filename = "/usr/local/something.txt";
echo finfo_file($finfo, $filename);
/* close connection */
finfo_close($finfo);
?>
Ik krijg echter de foutmelding dat ik een undefined function aanroep: Call to undefined function finfo_open() in .....
iemand een idee waar het misgaat?
Fileinfo zit pas standaard in PHP sinds 5.3, en ik denk niet dat jouw webserver al 5.3 draait. (Het zit ook wel in PECL, maar dan moet je het handmatig installeren, en bij shared hosting is dat zelden mogelijk)
De PECL extentie is niet geladen, of je hebt nog geen PHP 5.3.0. of >
Iemand bekend met een pakket dat net zo eenvoudig is te installeren als MAMP en toch de PHP 5.3.0 draait?