Code link verzenden en uitlezen
Graag zou ik jullie input willen weten voor het volgende:
In een e-mail heb ik een button gekoppeld zit aan een hyperlink wat gecodeerd is.
Zelf heb ik nog niet de codering gekozen, het gaat om het emailadres, en de naam.
welke raden jullie aan?
daarnaast wil ik weten hoe je met PHP de informatie eruit haalt zodat ik deze in variabelen kan zetten.
Werk je dan met de $_GET functie?
Gr. Jop
Ik zou in ieder geval het e-mailadres en de naam niet verwerken in deze "codering", maar apart opslaan, en vervolgens koppelen aan deze "codering", zodat deze "codering" verder niet totstand komt met behulp van het e-mailadres of de naam, maar hier verder los van staat.
$_GET is het super globale array (dit is dus niet echt een functie) waarmee je querystringparameters uitleest.
Als dit allemaal als hocus pocus klinkt dan loont het misschien de moeite om hier eerst wat verder in te duiken.
Gewijzigd op 26/09/2018 17:02:37 door Thomas van den Heuvel
Wat Thomas voorstelt, om de variabelen "apart" op te slaan, en alleen een code/referentie mee te geven is het mooist. Dan weet je zeker dat niemand met de data kan "rommelen".
Als dat niet handig is moet je een controle hash toevoegen. Je haalt dan de variabelen, plus een eigen unieke string, door een hash functie heen, en het resultaat daarvan voeg je ook aan de link toe. Als de gebruiker de link dan aanroept bereken je eerst de hash opnieuw (op basis van de variabelen), en vergelijkt deze met de hash. Als ze gelijk zijn ben je er bijna 100% zeker van dat alles nog in orde is.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$email = '[email protected]';
$name = 'Mr T. Test';
$secret = 'stukje tekst of blabla dat niemand weet';
$hash = sha1($email . $name . $secret);
$link = 'http://test.test/pagina.php?' . http_build_query(compact('email','name','hash'));
//http://test.test/pagina.php?email=test%40test.test&name=Mr+T.+Test&hash=3fb62c52e70a69be48455eb134787b4ac40869d5
//controle:
if(hash_equals(sha1($_GET['email'] . $_GET['name'] . $secret),$_GET['hash'])){
//alles OK
}
?>
$email = '[email protected]';
$name = 'Mr T. Test';
$secret = 'stukje tekst of blabla dat niemand weet';
$hash = sha1($email . $name . $secret);
$link = 'http://test.test/pagina.php?' . http_build_query(compact('email','name','hash'));
//http://test.test/pagina.php?email=test%40test.test&name=Mr+T.+Test&hash=3fb62c52e70a69be48455eb134787b4ac40869d5
//controle:
if(hash_equals(sha1($_GET['email'] . $_GET['name'] . $secret),$_GET['hash'])){
//alles OK
}
?>
Gewijzigd op 26/09/2018 17:47:03 door Rob Doemaarwat
In deze mail kunnen ze dan klikken op de link, in deze link zit dan het emailadres en de voornaam.
Waarom een hash?
Je gaat natuurlijk van het ergste uit, dus ik wil niet dat mensen de link kunnen veranderen en alsnog een ander e-mailadres erin kunnen stoppen.
Op het moment dat er op de button word geklikt wil ik een email krijgen met de voornaam en emailadres.
Samenvatting:
Link met email adres en voornaam (beveiligd)
Script om deze uit te lezen om email en voornaam in variabelen te kunnen zetten welke ik dan weer kan gebruiken om de email naar mij te zenden met deze informatie.
IK MAAK GEEN GEBRUIK VAN EEN DATABASE
Toevoeging op 26/09/2018 21:14:11:
Zie het als een betaling
een webshopsysteem zend een gecodeerde link naar bijvoorbeeld het iDEAL systeem, deze leest de link uit en pak daar het ordernummer en bedrag en eventueel andere informatie, dit word ook zonder database gedaan.
Gewijzigd op 26/09/2018 21:14:32 door Jop B
euh .. nee
De Rabo Omnikassa 1.0 verstuurd het bedrag en ondernummer welke gecodeerd worden met een sha256
Zie link Omnikassa hoe werkt het hoofdstuk 5.3
De omnikassa pakt aan hun kant dan het bedrag en ordernummer eruit en presenteert dit bij de betaling, de omnikassa maakt geen gebruik van een database aan onze kant
Gewijzigd op 26/09/2018 21:25:03 door Jop B
Waarom niet? Volgens mij is er nog niemand aan dood gegaan...
>> ik wil niet dat mensen de link kunnen veranderen en alsnog een ander e-mailadres erin kunnen stoppen.
Het is kinderlijk eenvoudig om een link te wijzigen, zelfs als er "gecodeerde" gegevens in staan. Je gaat hier al nat.
Gewoon zorgen dat je die naam en email ergens op de server bewaard samen met een RANDOM HASH. Deze hash in de link stoppen (www.jopb.nl/bevestigen.php?c=3787bba2a350672f5b42652536d8c4c598a53542) en in bevestigen.php checken of de hash $_GET['c'] voorkomt in de database en dan je de naam en email ophalen. Komt de hash niet voor in de database dan een vette 404. En als de hash gebruikt is dan deze ook direct verwijderen uit de database als je wilt dat de hash slechts één maal gebruikt mag worden.
Code (php)
1
SELECT name, email FROM customers WHERE hash='3787bba2a350672f5b42652536d8c4c598a53542';
Gewijzigd op 26/09/2018 21:42:53 door Frank Nietbelangrijk
Als ze het zelfde zijn niet gemanipuleerd pak naam en emailadres en verstuur email anders geef error.
De Rabo OmniKassa is PCI DSS compliant (Payment Card Industry Data Security Standard).
Dit betekent dat het responsbericht geen klantinformatie bevat zoals een naam,
bankrekeningnummer, creditcardnummer, PAN nummer of andere klant gerelateerde gegevens.
Om het responsbericht te kunnen laten aansluiten op de order in de webwinkel en de bijbehorende klant, wordt gebruik gemaakt van een uniek transactiereferentienummer (transactionReference).
Daarnaast adviseren wij het gebruik van een ordernummer als extra identificatieveld (orderId) in het
betaalverzoek. Zie ook de voetnoot onderaan deze pagina.
Toevoeging op 26/09/2018 21:43:58:
>> Ik denk dat de optie wat Rob zegt voor mij het beste werkt.
Ik zeg doe het niet!
@Frank 21:35: Als je de gegevens beveiligt met een hash (zoals in mijn voorbeeld) kun je niet meer met de gegevens rommelen (want dan klopt de hash niet meer met de gegevens) (ja, je kunt ze dus kinderlijk eenvoudig aanpassen - in de link, maar dan werkt de link niet meer - als je de controle tenminste goed doet).
@Frank 21:40: Het response bericht van de Rabo bevat geen klantgegevens van de Rabo. Maar je kunt in de return URL natuurlijk wel je eigen (klant) info in stoppen.
Maar nogmaals: Ik zou ook alle info gewoon ergens in een database (of desnoods in een bestandje stoppen), en dan alleen met een referentie gaan lopen leuren. Nog net iets veiliger (een random string kun je niet eens reconstrueren), en je URL's zijn niet zo achterlijk lang.
Maar andersom: Als je geen database hebt, of gewoon geen zin om allerlei "tijdelijke" data op te gaan slaan waarvan misschien maar een fractie ook echt gebruikt gaat worden, dan is een controle hash helemaal geen slechte oplossing.
Toevoeging op 26/09/2018 22:48:01:
>> Maar je kunt in de return URL natuurlijk wel je eigen (klant) info in stoppen.
Ook hier gewoon een id of nog beter een hash gebruiken. Het feit dat iets kan wil nog niet zeggen dat het wijs is. (Zoiets als zonder gordel om gaan rijden)
Jop B op 26/09/2018 16:14:15:
In een e-mail heb ik een button gekoppeld zit aan een hyperlink wat gecodeerd is.
Zelf heb ik nog niet de codering gekozen, het gaat om het emailadres, en de naam.
welke raden jullie aan?
Zelf heb ik nog niet de codering gekozen, het gaat om het emailadres, en de naam.
welke raden jullie aan?
Wát wil je daarmee precies doen? De hyperlink maar één keer gebruiken? Controleren of het e-mailadres bestaat? Controleren of de gebruiker bij zijn e-mail kan? Controleren of hij e-mail binnen 5 minuten of pas na 48 uur leest?
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
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
<?php
if(isset($_GET['seal'])) {
$seal = $_GET['seal'];
$servername = "localhost";
$username = "root";
$password = "root";
$dbname = "newspaper";
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
} else {
echo "Connectie gelukt";
$sql = "SELECT id, firstname, emailaddress FROM people WHERE seal='$seal'";
$result = $conn->query($sql);
while($row = $result->fetch_assoc()){
echo $row['firstname'];
}
}
} else {
echo "Vervalst!!!";
}
?>
if(isset($_GET['seal'])) {
$seal = $_GET['seal'];
$servername = "localhost";
$username = "root";
$password = "root";
$dbname = "newspaper";
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
} else {
echo "Connectie gelukt";
$sql = "SELECT id, firstname, emailaddress FROM people WHERE seal='$seal'";
$result = $conn->query($sql);
while($row = $result->fetch_assoc()){
echo $row['firstname'];
}
}
} else {
echo "Vervalst!!!";
}
?>
Het is gelukt :)
Gewijzigd op 26/09/2018 23:36:39 door Jop B
Let wel op SQL-injectie in $seal !!!!
Anyhoo. Ik neem aan dat deze activatiecode (of wat het ook moge zijn) ook een houdbaarheidsdatum heeft, en eenmaal geactiveerd, ook op een of andere manier ongeldig wordt gemaakt?
Daarnaast. Als er resultaat is, zou er precies één resultaat moeten zijn. Dit wordt nergens gecontroleerd. Sterker nog, er wordt niet eens gecontroleerd of er resultaten zijn, maar deze worden direct opgehaald, in de veronderstelling dat deze bestaan? In een loop nog wel, terwijl er altijd maar maximaal 1 resultaat zou moeten zijn? Waarom ?!
Gewijzigd op 27/09/2018 01:27:37 door Thomas van den Heuvel