Downloadscript beschadigt files
Maar als ze files downloaden lukt dit ook, maar vanaf de moment dat je ze opent zegt de pc dat ze beschadigt zijn.
Als ik dit alles op localhost draait werkt alles perfect. Ook als ik de files open rechtstreeks vanuit uploads/file.jpg werkt alles perfect.
Enig idee hoe dit komt?
Dit is het downloadsscript waar via een POST het id van de file wordt meegegeven.
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
<?php
session_start();
$username = $_SESSION['username'];
$password = $_SESSION['password'];
$host = 'x';
$username_db = 'x';
$password_db = 'x';
$dbnaam = 'x';
$db = mysql_connect($host, $username_db, $password_db) or die (mysql_error());
mysql_select_db($dbnaam, $db) or die (mysql_error());
//Check do we have username and password
if(!$username && !$password)
{
echo 'Geen toegang.';
die();
}
// Usage: <a href="download.php?file=test.txt&category=test">Download</a>
// Path to downloadable files (will not be revealed to users so they will never know your file's real address)
$hiddenPath = "uploads/";
// VARIABLES
if (!empty($_POST['file'])){
$id = $_POST['file'];
$result = mysql_query("SELECT * FROM files WHERE id='$id'");
$row = mysql_fetch_array($result);
$file = $row['locatie'];
$file = str_replace('%20', ' ', $file);
$category = (!empty($_GET['category'])) ? $_GET['category'] . '/' : '';
} else {
die('Hacking attempt reported.');
}
$file_real = $hiddenPath . $category . $file;
$ip = $_SERVER['REMOTE_ADDR'];
// If requested file exists
if (file_exists($file_real)){
// Get extension of requested file
$extension = strtolower(substr(strrchr($file, "."), 1));
// Determine correct MIME type
switch($extension){
case "asf": $type = "video/x-ms-asf"; break;
case "avi": $type = "video/x-msvideo"; break;
case "exe": $type = "application/octet-stream"; break;
case "mov": $type = "video/quicktime"; break;
case "mp3": $type = "audio/mpeg"; break;
case "mpg": $type = "video/mpeg"; break;
case "mpeg": $type = "video/mpeg"; break;
case "rar": $type = "encoding/x-compress"; break;
case "txt": $type = "text/plain"; break;
case "wav": $type = "audio/wav"; break;
case "wma": $type = "audio/x-ms-wma"; break;
case "wmv": $type = "video/x-ms-wmv"; break;
case "zip": $type = "application/x-zip-compressed"; break;
case "jpg": $type = "image/jpeg"; break;
default: $type = "application/force-download"; break;
}
// Fix IE bug [0]
$header_file = (strstr($_SERVER['HTTP_USER_AGENT'], 'MSIE')) ? preg_replace('/\./', '%2e', $file, substr_count($file, '.') - 1) : $file;
// Prepare headers
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public", false);
header("Content-Description: File Transfer");
header("Content-Type: " . $type);
header("Accept-Ranges: bytes");
header("Content-Disposition: attachment; filename=\"" . $header_file . "\";");
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . filesize($file_real));
// Send file for download
if ($stream = fopen($file_real, 'rb')){
while(!feof($stream) && connection_status() == 0){
//reset time limit for big files
set_time_limit(0);
print(fread($stream,1024*8));
flush();
}
fclose($stream);
}
}else{
// Requested file does not exist (File not found)
echo("Requested file does not exist");
die();
}
?>
session_start();
$username = $_SESSION['username'];
$password = $_SESSION['password'];
$host = 'x';
$username_db = 'x';
$password_db = 'x';
$dbnaam = 'x';
$db = mysql_connect($host, $username_db, $password_db) or die (mysql_error());
mysql_select_db($dbnaam, $db) or die (mysql_error());
//Check do we have username and password
if(!$username && !$password)
{
echo 'Geen toegang.';
die();
}
// Usage: <a href="download.php?file=test.txt&category=test">Download</a>
// Path to downloadable files (will not be revealed to users so they will never know your file's real address)
$hiddenPath = "uploads/";
// VARIABLES
if (!empty($_POST['file'])){
$id = $_POST['file'];
$result = mysql_query("SELECT * FROM files WHERE id='$id'");
$row = mysql_fetch_array($result);
$file = $row['locatie'];
$file = str_replace('%20', ' ', $file);
$category = (!empty($_GET['category'])) ? $_GET['category'] . '/' : '';
} else {
die('Hacking attempt reported.');
}
$file_real = $hiddenPath . $category . $file;
$ip = $_SERVER['REMOTE_ADDR'];
// If requested file exists
if (file_exists($file_real)){
// Get extension of requested file
$extension = strtolower(substr(strrchr($file, "."), 1));
// Determine correct MIME type
switch($extension){
case "asf": $type = "video/x-ms-asf"; break;
case "avi": $type = "video/x-msvideo"; break;
case "exe": $type = "application/octet-stream"; break;
case "mov": $type = "video/quicktime"; break;
case "mp3": $type = "audio/mpeg"; break;
case "mpg": $type = "video/mpeg"; break;
case "mpeg": $type = "video/mpeg"; break;
case "rar": $type = "encoding/x-compress"; break;
case "txt": $type = "text/plain"; break;
case "wav": $type = "audio/wav"; break;
case "wma": $type = "audio/x-ms-wma"; break;
case "wmv": $type = "video/x-ms-wmv"; break;
case "zip": $type = "application/x-zip-compressed"; break;
case "jpg": $type = "image/jpeg"; break;
default: $type = "application/force-download"; break;
}
// Fix IE bug [0]
$header_file = (strstr($_SERVER['HTTP_USER_AGENT'], 'MSIE')) ? preg_replace('/\./', '%2e', $file, substr_count($file, '.') - 1) : $file;
// Prepare headers
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public", false);
header("Content-Description: File Transfer");
header("Content-Type: " . $type);
header("Accept-Ranges: bytes");
header("Content-Disposition: attachment; filename=\"" . $header_file . "\";");
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . filesize($file_real));
// Send file for download
if ($stream = fopen($file_real, 'rb')){
while(!feof($stream) && connection_status() == 0){
//reset time limit for big files
set_time_limit(0);
print(fread($stream,1024*8));
flush();
}
fclose($stream);
}
}else{
// Requested file does not exist (File not found)
echo("Requested file does not exist");
die();
}
?>
Gewijzigd op 29/07/2012 00:05:23 door Sam H
om mee te beginnen:
- haal je vars buiten de quotes.
- Niet onnodig vars kopiëren.
- gebruik Geen * maar schrijf de velden uit.
- gebruik geen die() midden in je script!
------------------------------------------
waarom zitten/kunnen er spaties zitten/in de bestandsnamen ?
Waar zijn de foutafhandeling ? / Controles ?
je weet dat er verschillende MIME types zijn voor zowel jpeg als jpg en andere afbeeldingen:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
jpeg image/jpeg
jpg image/jpeg
jpg image/pjpeg
jpg image/jpg
png image/png
gif image/gif
tif image/tiff
tiff image/tiff
ico image/x-icon
bmp image/bmp
pnm image/x-portable-anymap
pnt image/x-macpaint
pntg image/x-macpaint
ppm image/x-portable-pixmap
jpg image/jpeg
jpg image/pjpeg
jpg image/jpg
png image/png
gif image/gif
tif image/tiff
tiff image/tiff
ico image/x-icon
bmp image/bmp
pnm image/x-portable-anymap
pnt image/x-macpaint
pntg image/x-macpaint
ppm image/x-portable-pixmap
Kijk anders een naar deze functie: mime_content_type()
En deze Fileinfo
En je moet soms oppassen met de:
Als de file size kleiner is dan de echte grote dan krijg je ook een corrupted file als je hem download
Gewijzigd op 29/07/2012 00:37:43 door Marco PHPJunky
Maar ik snap niet dat dit kan verschillen tussen localhost en online?
Alles is exact hetzelfde, zelfs sommige files zijn mee geupload enz..
en ik snap ook niet goed wat je bedoelt met "waarom zitten/kunnen er spaties zitten/in de bestandsnamen ?"
Er kunnen toch spaties inzitten?
Toevoeging op 29/07/2012 00:53:47:
Ok ik heb het gevonden, hij gaf een error bij de
Als ik dit eruit haal werkt het perfect. De error is:
Code (php)
1
Warning: set_time_limit() has been disabled for security reasons in /home/a9367061/public_html/test.php on line 82
Welke security reasons?
Gewijzigd op 29/07/2012 00:54:59 door Sam H
Als iets online staat heb je te maken met de de computers van anderen en hun instellingen elke computer kan bijvoorbeeld een andere Java(script) versie draaien of staat Uit of hun browser anders hebben ingesteld of andere tijd zone...
Jou server is een 'statische' omgevingen waarin alles gecontroleerd en 'correct' ingesteld is... dat kan je NOOIT zeggen voor die van een ander...
Voorbeeld:
Ik bedoel van jij kan een heel mooi login systeem maken gebouwd m.b.v. javascript en dan zal het op jou computer vast perfect werken...
Maar als ik op mijn computer javascript UIT heb staan zal het NIET meer werken..
Snapje ?
Dat klopt er kunnen spaties in een bestandsnamen zitten ja..
Alleen als je gaat werken met paden en bestanden op een server of in de URL kan het zijn dat niet elke browser/script/download er goed mee omgaat en je hele rare dingen krijgt...
Gebruik daarom NOOIT spaties in bestandsnamen..
Vervang deze door een _ (of dergelijks)!!
Nou die functie (set_time_limit) staat uit als PHP Safe mode aan staat.
Code (php)
1
2
3
4
2
3
4
This function has no effect when PHP is running in safe mode.
There is no workaround other than turning off safe mode or changing the time limit in the php.ini
Bron: PHP.net
There is no workaround other than turning off safe mode or changing the time limit in the php.ini
Bron: PHP.net
php.net
En deze staat waarscheinlijk uit in safe mode omdat je met deze functie het aantal secondes dat een script mag draaien kan setten...
Als dat getal (X aantal secondes) berijkt is geeft hij een Fatal error..
Dus waarscheinlijk staat/draaid je PHP local of op de server in Safe mode...
Heb je het draaien op een home server of op een hosting ?
Gewijzigd op 29/07/2012 02:12:45 door Marco PHPJunky
Is het mogelijk om dan aan de php.ini file te komen?