Ik probeer een downloadteller te maken die bij houdt welke bestanden er werden gedownload en hoeveel keer.
In mijn MariaDB heb ik een tabel met maar 2 kolommen. Namelijk bestandsnaam (uniek) en downloads.
De bedoeling is dat telkens een bestand wordt gedownload er ofwel de bestandsnaam in de database wordt gezet of als er het reeds in staat de teller met 1 omhoog gaat.
Ik krijg wel de betreffende bestanden op mijn scherm maar mijn database wordt niet bijgewerkt of aangevuld.Hieronder de code. Als er iemand ziet waar ik in de fout ga dan hoor ik het graag. Maar ik zie het momenteel niet.

<?php
// Including the connection file:
//Inladen van de instellingen.
include '../instellingen.php';
 
$conn = new mysqli($database_adres, $database_login_naam, $database_login_wachtwoord, $database_naam);
//connectie testen
if ($conn->connect_error)
{
	die("verbinding mislukt: ".$conn->connect_error);
} 


if(!$_GET['file']) error('Missing parameter!');
if($_GET['file'][0]=='.') error('Wrong file!');

if(file_exists("../".$_GET['file']))
{
    /* If the visitor is not a search engine, count the downoad: */
    if(!is_bot())
    $sql = "   INSERT INTO download_manager  (bestandsnaam) 
	VALUES ('".mysqli_real_escape_string($conn,$_GET['file'])."')
    ON DUPLICATE KEY UPDATE downloads=downloads+1";
				
	$bsn=$_GET['file'];
    header("Location: https://fv-??-?????nen.be/$bsn");
    exit();

}
else {
echo "This file does not exist!";
}

/* Helper functions: */

function error($str)
{
    die($str);
}

function is_bot()
{
    /* This function will check whether the visitor is a search engine robot */

    $botlist = array("Teoma", "alexa", "froogle", "Gigabot", "inktomi",
    "looksmart", "URL_Spider_SQL", "Firefly", "NationalDirectory",
    "Ask Jeeves", "TECNOSEEK", "InfoSeek", "WebFindBot", "girafabot",
    "crawler", "www.galaxy.com", "Googlebot", "Scooter", "Slurp",
    "msnbot", "appie", "FAST", "WebBug", "Spade", "ZyBorg", "rabaz",
    "Baiduspider", "Feedfetcher-Google", "TechnoratiSnoop", "Rankivabot",
    "Mediapartners-Google", "Sogou web spider", "WebAlta Crawler","TweetmemeBot",
    "Butterfly","Twitturls","Me.dium","Twiceler","Bingbot","DuckDuckBot","YandexBot","facebot", "ia_archiver");

    foreach($botlist as $bot)
    {
        if(strpos($_SERVER['HTTP_USER_AGENT'],$bot)!==false)
        return true;    // Is a bot
    }

    return false;   // Not a bot
}
?>
Ivo P op 22/12/2021 15:24:41

zit je wel in het juiste topic Adoptive?

Ja hoor, hij zit volledig in het juiste topic :-)
Onderstaand de juiste code die werkt zoals ik het wil. Het betreft ondertussen 35000 bestanden die direct opvraagbaar zijn. En inderdaad als ze de link kopiëren kunnen ze het bestand rechtstreeks downloaden en wordt het niet geteld. Het zoeken naar de betreffende bestanden kan maar na het ingeven van een login en paswoord. Het werkt zo:
Ze zoeken een bepaalde naam. Dan krijgen ze een lijst met mogelijke matches en met meer details en een downloadlink die verwijst naar de pagina met dit PHP script waardoor de teller bijgewerkt wordt en ze doorverwezen worden naar het downloadbare bestand.
Een beetje moeten zoeken naar de juiste volgorde van de code lijnen maar nu werkt het.

if(file_exists("../".$_GET['file']))
{
    /* If the visitor is not a search engine, count the downoad: */
    if(!is_bot())
    $sql = "INSERT INTO downloads_manager  (bestandsnaam) 
	VALUES ('".mysqli_real_escape_string($conn,$_GET['file'])."')
    ON DUPLICATE KEY UPDATE downloads=downloads+1";

	$bsn=$_GET['file'];
   
	header("Location: https://fv-??-????nen.be/$bsn");
    
if (mysqli_query($conn, $sql)) {
  echo "Record met succes geupdated"."<br/>";
} else {
  echo "Fout updating record: " . mysqli_error($conn)."<br/>";
}
	exit();
}	
else {
echo "This file does not exist!";
}
in dat geval zou ik het toch dichttimmeren: het zal een kwestie van tijd zijn voor de directe url uitlekt naar Google, of voor iemand het systeem in de bestandsnamen herkent.

<?php

$filename = filter_input(INPUT_GET, 'file');
if(strpos($filename, '/') !== false || is_bot()) {
// de filename bevat een path, en dat wil je niet!
header('HTTP/1.0 403 Forbidden');
exit();
}

if(file_exists("../".$filename))
{
/* If the visitor is not a search engine, count the downoad: */
$sql = "INSERT INTO downloads_manager (bestandsnaam)
VALUES ('".mysqli_real_escape_string($conn,$_GET['file'])."')
ON DUPLICATE KEY UPDATE downloads=downloads+1";

$conn->query($sql);
fp = fopen('../'.$filename, 'rb');
header("Content-Type: application/pdf");
fpassthru($fp);
exit();
}
else {
header("HTTP/1.0 404 Not Found");
exit();
}
?>

en je directory ../ mag dan helemaal onbereikbaar gemaakt worden voor browsers (buiten de documentroot, of via .htaccess rules forbidden gemaakt)

edit:
is_bot() miste een {}set,maar doet het beter in de eerste if.
Persoonlijk zou ik de directory buiten de webroot plaatsen.
Dan ben je safe dat er niemand zomaar bij komt zonder eerst jouw script te passeren.
We gaan het eens bekijken die suggesties. Het zijn wel telkens verschillende directories en zelfs verschillende sites waarop die bestanden staan. Dus ga ik dat moeten uittesten.

Reageren