Voor een simpel mailinglist maak ik gebruik van flat-file (.txt) bestanden om de gegevens in op te slaan.
De naam van het textbestand, (met daarin de gegevens zoals Naam en Email) wordt gecreeerd met de id en .txt erachter. Dus zoiets als:
id-15878547698.txt

Elke inschrijver krijgt een uitschrijflink mee die natuurlijk voor iedereen uniek is. die uitschrijflink bevat de id.
Ik gebruik overigens voor elke id base64_encode zodat ie niet direct voor het oog logisch lijkt.
Als een gebruiker op de uitschrijflink klikt, wordt de url string zoiets als:
http://mijndomein.com/unsubsribe.php?id=id-aWQtMjAxOTEyMjMNDUyMTQ%3D&email=amNtZy5tYWVzc2VuQGdtYWlsLmNvbQ%3D%3D


Voor uit te schrijven ziet de code er zo uit:
<?php
	$id = $_GET['id'];
	$email = $_GET['email'];
	// decode the id and email string
	$id_decode = base64_decode($id);
	$email_decode = base64_decode($email);
	if( isset($id_decode) ) {	
				
		$filename = 'subscribers/'.$id_decode.'.txt';	
		// delete subscribers entry
		if(file_exists($filename)) { 
			unlink($filename);	
			echo '<div class="alert alert-success"><b>'.$email_decode.'</b> is successfully removed from our mailinglist!</div>';		
		}
		else {
			echo '<div class="alert alert-danger">Email not found or you already have unsubscribed from our mailinglist!</div>';
		}		
	}
	?>

Zoals je ziet: de id wordt eerst decoded en het txt bestand met de naam van de id wordt unlinked. De inschrijver is verwijderd.

Mijn zorgen: Als je een inschrijver was en je hebt uitgeschreven, dan weet je hoe de url eruitziet met de id erin. Zou je dan ook nog weten dat die id gekoppeld is aan een textbestand dat unlinked wordt bij uitschrijven, dan zou je er een bot op los kunnen laten op potentiele id's te raden en als die bot toevallig een id te pakken heeft die ook nog bestaat, dan wordt een willekeurige gebruiker dus uitgeschreven zonder dat ie het zelf heeft gedaan.

Mijn vraag: hoe kan ik dit beter beveiligen?
Ik hoop ook dat het txt-bestand buiten de webroot staat.
Een encryptie kan, maar dat verandert de zaak toch niet? Ook op de encryptie hash kun je een robot loslaten. Als ie een hash genereert die met decryptie werkelijk tot een reeel bestand leidt, heb je hetzelfde probleem...

[size=xsmall]Toevoeging op 23/12/2019 21:24:51:[/size]

@Ariën
De tekstbestanden staan gewoon in een subfolder maar ik heb dit in mijn .htaccess staan:

<Files ~ "\.txt$">
    Order allow,deny
    Deny from all
</Files>


je kunt ze niet via de url inzien
Brute-force detectie bouwen?
ik ben het met je eens dat txt bestanden met prive info beter buiten de webroot kunnen staan. In mijn geval kan ik ook alle data die in de .txt bestanden staat encrypten. Dan is het wat veiliger.
Als ik de url uit het voorbeeld base64 decode, krijg ik dit :

id-20191223

LM

Email = [email protected]


Encryptie is geen hash. Hoeveel robots je erop loslaat, zonder sleutel zal je niets kunnen decrypten.
@Adoptive Solution
ja dat klopt. Ik bedenk me net dat het idd beter is de data te encrypten ipv te encoden. Als je weet dat het een base64 is, kun je hem snel terugherleiden. Dan ben je idd snel achter de naam en email. Dus ik ga de data encrypten in de url.
Overigens bedenk ik me net: ik geef elk file een unique id mee en zend die als token mee in de url. Bij uitschrijven vergelijk ik de id met het bijbehoredn token. Als die iet bij mekaar horen, wordt er niet ge-unlinked.
Encryptie is geen hash...

Dus met encryptie alleen ben ik veilig genoeg?
Jack Maessen op 23/12/2019 21:30:41

ik ben het met je eens dat txt bestanden met prive info beter buiten de webroot kunnen staan. In mijn geval kan ik ook alle data die in de .txt bestanden staat encrypten. Dan is het wat veiliger.



Klinkt een beetje als ik laat de portieren van mijn auto van het slot maar zorg wel dat de auto een start onderbreker heeft.

Ze zijn dan al in de auto. enkel nog de code van de startonderbreker en voila..

Overigens kun je eventueel een .htaccess bestandje in de directory zetten met de tekst "Deny from all" als je Apache gebruikt. Wel even testen of het werkt!

[size=xsmall]Toevoeging op 23/12/2019 21:50:13:[/size]

>> Dus met encryptie alleen ben ik veilig genoeg?

Alleen indien je een goede encrypt methode gebruikt en de sleutel goed ver weg opbergt. Dus niet in de webroot bewaren ;-)
En dan ga je over naar Nginx, en opeens werkt je .htaccess misschien opeens niet meer?
Wat is er mis met het buiten de webroot opslaan? Of ondersteunt je hosting dat niet? Dat zou ik dat eens bij hun neerleggen.....

Reageren