Download script met bot beveiliging

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Karel de grote

Karel de grote

21/02/2015 21:32:54
Quote Anchor link
Mijn eerste topic hier :)
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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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]
Gewijzigd op 21/02/2015 21:33:44 door Karel de grote
 
PHP hulp

PHP hulp

18/04/2024 11:44:19
 
- Ariën  -
Beheerder

- Ariën -

21/02/2015 21:34:56
Quote Anchor link
Als ik dit zie: ignore_user_abort(true), dan wordt het mij duidelijk dat het script niet ten einde komt als de browser wordt afgesloten. Op shared-hosting kan ik dit zeker afraden als je script maar blijft laden.

Verder zie ik weinig kwaads in dit script.
 
Karel de grote

Karel de grote

21/02/2015 23:33:28
Quote Anchor link
Bedankt voor je antwoord.
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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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]




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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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]
Gewijzigd op 22/02/2015 16:33:42 door Karel de grote
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.