Download script met bot beveiliging
Ik kom hier zo nu en dan om wat PHP kennis op te doen dus bedankt voor alle info hier op het forum.
Ik ben erg novice met php en kan eigenlijk alleen maar bestaande scripts beetje aanpassen, dat geldt ook voor dit script.
Dit is een downloadscript (download de files van een folder buiten mijn root). Ik gebruik een post/form om het script te callen (http://127.0.0.1/username/file.php?download_file=myfile.zip, in mijn form heb ik een hidden field toegevoegd hopende dat bots deze invullen en als dat het geval is krijgen ze een 7z text file geserveerd en niet de gelinkte file (hier: myfile.zip).
Dit is het script welke ik gemaakt heb door het werk van anderen to kopieren, editen en mixen :)
Ik hoop dat jullie er even naar willen kijken om te zien waar het korter en of beter kan. En ik zou het fijn vinden als het script geen foute code bevat welke er voor zorgt dat mijn server binnen enkele uren gehackt gaat worden. Ik denk zelf dat het er goed uitziet maar die post stuff vind ik altijd beetje eng!
Alvast erg bedankt voor de feedback!
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
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
<?php
if (isset($_POST["submit"])) {
$spa = $_POST["super"];
if (!empty($spa) || ($spa == "0")) {
$file = "/home/xxxxxx/public_html/file.7z";
$fullPath = $file;
if ($fd = fopen ($fullPath, "r")) {
$fsize = filesize($fullPath);
$path_parts = pathinfo($fullPath);
$ext = strtolower($path_parts["extension"]);
header("Content-type: application/octet-stream");
header("Content-Disposition: filename=\"".$path_parts["basename"]."\"");
while(!feof($fd)) {
$buffer = fread($fd, 2048);
echo $buffer;
}
}
fclose ($fd);
exit;
}
}
ignore_user_abort(true);
set_time_limit(0);
$path = "/home/xxxxxx/files/";
$dl_file = preg_replace("([^\w\s\d\-_~,;:\[\]\(\].]|[\.]{2,})", '', $_GET['download_file']);
$dl_file = filter_var($dl_file, FILTER_SANITIZE_URL);
$fullPath = $path.$dl_file;
if ($fd = fopen ($fullPath, "r")) {
$fsize = filesize($fullPath);
$path_parts = pathinfo($fullPath);
$ext = strtolower($path_parts["extension"]);
switch ($ext) {
case "pdf":
header("Content-type: application/pdf");
header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\""); // use 'attachment' to force a file download
break;
// add more headers for other content types here
default;
header("Content-type: application/octet-stream");
header("Content-Disposition: filename=\"".$path_parts["basename"]."\"");
break;
}
header("Content-length: $fsize");
while(!feof($fd)) {
$buffer = fread($fd, 2048);
echo $buffer;
}
}
fclose ($fd);
exit;[/code]
if (isset($_POST["submit"])) {
$spa = $_POST["super"];
if (!empty($spa) || ($spa == "0")) {
$file = "/home/xxxxxx/public_html/file.7z";
$fullPath = $file;
if ($fd = fopen ($fullPath, "r")) {
$fsize = filesize($fullPath);
$path_parts = pathinfo($fullPath);
$ext = strtolower($path_parts["extension"]);
header("Content-type: application/octet-stream");
header("Content-Disposition: filename=\"".$path_parts["basename"]."\"");
while(!feof($fd)) {
$buffer = fread($fd, 2048);
echo $buffer;
}
}
fclose ($fd);
exit;
}
}
ignore_user_abort(true);
set_time_limit(0);
$path = "/home/xxxxxx/files/";
$dl_file = preg_replace("([^\w\s\d\-_~,;:\[\]\(\].]|[\.]{2,})", '', $_GET['download_file']);
$dl_file = filter_var($dl_file, FILTER_SANITIZE_URL);
$fullPath = $path.$dl_file;
if ($fd = fopen ($fullPath, "r")) {
$fsize = filesize($fullPath);
$path_parts = pathinfo($fullPath);
$ext = strtolower($path_parts["extension"]);
switch ($ext) {
case "pdf":
header("Content-type: application/pdf");
header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\""); // use 'attachment' to force a file download
break;
// add more headers for other content types here
default;
header("Content-type: application/octet-stream");
header("Content-Disposition: filename=\"".$path_parts["basename"]."\"");
break;
}
header("Content-length: $fsize");
while(!feof($fd)) {
$buffer = fread($fd, 2048);
echo $buffer;
}
}
fclose ($fd);
exit;[/code]
Gewijzigd op 21/02/2015 21:33:44 door Karel de grote
Verder zie ik weinig kwaads in dit script.
Ja, ik heb er even naar gekeken en lijkt me inderdaad helemaal niet nodig. Dus die heb ik nu verwijderd.
Daar ik ook zo'n "bottrap" heb dacht ik dat het wel leuk zou zijn om de IP's op te slaan van alle bots welke de "file.z7" downloaden. Kan ik ze altijd bannen in the firewall.
Het script ziet er nu zo uit (ik post het ook omdat er misschien meer noobs als ik op zoek zijn naar zo'n zelfde script):
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
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
<?php
if (isset($_POST["submit"])) {
$spa = $_POST["super"];
if (!empty($spa) || ($spa == "0")) {
$file = "/home/xxxxxx/public_html/myfile.7z";
$fullPath = $file;
$line = date('Y-m-d H:i:s') . " - $_SERVER[REMOTE_ADDR]";
file_put_contents('visitors.log', $line . PHP_EOL, FILE_APPEND);
if ($fd = fopen ($fullPath, "r")) {
$fsize = filesize($fullPath);
$path_parts = pathinfo($fullPath);
$ext = strtolower($path_parts["extension"]);
header("Content-type: application/octet-stream");
header("Content-Disposition: filename=\"".$path_parts["basename"]."\"");
while(!feof($fd)) {
$buffer = fread($fd, 2048);
echo $buffer;
}
}
fclose ($fd);
exit;
}
}
$path = "/home/xxxxxx/files/";
$dl_file = preg_replace("([^\w\s\d\-_~,;:\[\]\(\].]|[\.]{2,})", '', $_GET['download_file']);
$dl_file = filter_var($dl_file, FILTER_SANITIZE_URL);
$fullPath = $path.$dl_file;
if ($fd = fopen ($fullPath, "r")) {
$fsize = filesize($fullPath);
$path_parts = pathinfo($fullPath);
$ext = strtolower($path_parts["extension"]);
switch ($ext) {
case "pdf":
header("Content-type: application/pdf");
header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\"");
break;
// add more headers for other content types here
default;
header("Content-type: application/octet-stream");
header("Content-Disposition: filename=\"".$path_parts["basename"]."\"");
break;
}
header("Content-length: $fsize");
header("Cache-control: private");
while(!feof($fd)) {
$buffer = fread($fd, 2048);
echo $buffer;
}
}
fclose ($fd);
exit;
[/code]
if (isset($_POST["submit"])) {
$spa = $_POST["super"];
if (!empty($spa) || ($spa == "0")) {
$file = "/home/xxxxxx/public_html/myfile.7z";
$fullPath = $file;
$line = date('Y-m-d H:i:s') . " - $_SERVER[REMOTE_ADDR]";
file_put_contents('visitors.log', $line . PHP_EOL, FILE_APPEND);
if ($fd = fopen ($fullPath, "r")) {
$fsize = filesize($fullPath);
$path_parts = pathinfo($fullPath);
$ext = strtolower($path_parts["extension"]);
header("Content-type: application/octet-stream");
header("Content-Disposition: filename=\"".$path_parts["basename"]."\"");
while(!feof($fd)) {
$buffer = fread($fd, 2048);
echo $buffer;
}
}
fclose ($fd);
exit;
}
}
$path = "/home/xxxxxx/files/";
$dl_file = preg_replace("([^\w\s\d\-_~,;:\[\]\(\].]|[\.]{2,})", '', $_GET['download_file']);
$dl_file = filter_var($dl_file, FILTER_SANITIZE_URL);
$fullPath = $path.$dl_file;
if ($fd = fopen ($fullPath, "r")) {
$fsize = filesize($fullPath);
$path_parts = pathinfo($fullPath);
$ext = strtolower($path_parts["extension"]);
switch ($ext) {
case "pdf":
header("Content-type: application/pdf");
header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\"");
break;
// add more headers for other content types here
default;
header("Content-type: application/octet-stream");
header("Content-Disposition: filename=\"".$path_parts["basename"]."\"");
break;
}
header("Content-length: $fsize");
header("Cache-control: private");
while(!feof($fd)) {
$buffer = fread($fd, 2048);
echo $buffer;
}
}
fclose ($fd);
exit;
[/code]
Toevoeging op 22/02/2015 16:30:23:
Ik heb nog wat verder gewerkt aan dit script en heb nog 2 vragen.
- Ik heb een check toegevoegd (regels 33 - 38) welke een melding geeft als de file niet bestaat en die ook een mail aan de webmaster stuurt. Ook hier ben ik er niet 100% zeker van of de code wel veilig is en niet misbruikt kan worden.
- als er errors zij wil ik die niet laten zien (niet veilig), dus heb ik "error_reporting(0);" toegevoegd aan het begin van het script. Echter toen ik een coding fout maakte kon ik nog steeds de error zien in de pagina. Ik begrijp niet waarom deze error toch zichtbaar was terwijl ik alle error messages heb disabled in dit script.
Ik zou het op prijs stellen als iemand het bovenstaande kan checken, hier is de laatste versie:
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
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
<?php
error_reporting(0); // comment out when running on test server!
if (isset($_POST["submit"])) {
$spa = $_POST["super"];
if (!empty($spa) || ($spa == "0")) {
$file = "/home/xxxxxx/public_html/myfile.7z";
$fullPath = $file;
$line = date('Y-m-d H:i:s') . " - $_SERVER[REMOTE_ADDR]";
file_put_contents('visitors.log', $line . PHP_EOL, FILE_APPEND);
if ($fd = fopen ($fullPath, "r")) {
$fsize = filesize($fullPath);
$path_parts = pathinfo($fullPath);
$ext = strtolower($path_parts["extension"]);
header("Content-type: application/octet-stream");
header("Content-Disposition: filename=\"".$path_parts["basename"]."\"");
while(!feof($fd)) {
$buffer = fread($fd, 2048);
echo $buffer;
}
}
fclose ($fd);
exit;
}
}
$path = "/home/xxxxxx/files/";
$dl_file = preg_replace("([^\w\s\d\-_~,;/:\[\]\(\].]|[\.]{2,})", '', $_GET['download_file']);
$fullPath = $path.$dl_file;
if(!file_exists("$fullPath")) {
// the message
$msg = "This link does not work: " . $dl_file . " - " . $_SERVER["HTTP_REFERER"];
// send email
mail("[email protected]","Downloadlink not working",$msg);
die("File not found. xxxxxx have been informed.");
} else {
if ($fd = fopen ($fullPath, "r")) {
$fsize = filesize($fullPath);
$path_parts = pathinfo($fullPath);
$ext = strtolower($path_parts["extension"]);
switch ($ext) {
case "pdf":
header("Content-type: application/pdf");
header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\"");
break;
default;
header("Content-type: application/octet-stream");
header("Content-Disposition: filename=\"".$path_parts["basename"]."\"");
break;
}
header("Content-length: $fsize");
header("Cache-control: private");
while(!feof($fd)) {
$buffer = fread($fd, 2048);
echo $buffer;
}
}
}
fclose ($fd);
exit;[/code]
error_reporting(0); // comment out when running on test server!
if (isset($_POST["submit"])) {
$spa = $_POST["super"];
if (!empty($spa) || ($spa == "0")) {
$file = "/home/xxxxxx/public_html/myfile.7z";
$fullPath = $file;
$line = date('Y-m-d H:i:s') . " - $_SERVER[REMOTE_ADDR]";
file_put_contents('visitors.log', $line . PHP_EOL, FILE_APPEND);
if ($fd = fopen ($fullPath, "r")) {
$fsize = filesize($fullPath);
$path_parts = pathinfo($fullPath);
$ext = strtolower($path_parts["extension"]);
header("Content-type: application/octet-stream");
header("Content-Disposition: filename=\"".$path_parts["basename"]."\"");
while(!feof($fd)) {
$buffer = fread($fd, 2048);
echo $buffer;
}
}
fclose ($fd);
exit;
}
}
$path = "/home/xxxxxx/files/";
$dl_file = preg_replace("([^\w\s\d\-_~,;/:\[\]\(\].]|[\.]{2,})", '', $_GET['download_file']);
$fullPath = $path.$dl_file;
if(!file_exists("$fullPath")) {
// the message
$msg = "This link does not work: " . $dl_file . " - " . $_SERVER["HTTP_REFERER"];
// send email
mail("[email protected]","Downloadlink not working",$msg);
die("File not found. xxxxxx have been informed.");
} else {
if ($fd = fopen ($fullPath, "r")) {
$fsize = filesize($fullPath);
$path_parts = pathinfo($fullPath);
$ext = strtolower($path_parts["extension"]);
switch ($ext) {
case "pdf":
header("Content-type: application/pdf");
header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\"");
break;
default;
header("Content-type: application/octet-stream");
header("Content-Disposition: filename=\"".$path_parts["basename"]."\"");
break;
}
header("Content-length: $fsize");
header("Cache-control: private");
while(!feof($fd)) {
$buffer = fread($fd, 2048);
echo $buffer;
}
}
}
fclose ($fd);
exit;[/code]
Gewijzigd op 22/02/2015 16:33:42 door Karel de grote