Code link verzenden en uitlezen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Jop B

Jop B

26/09/2018 16:14:15
Quote Anchor link
Hallo,

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
 
PHP hulp

PHP hulp

22/10/2021 06:12:50
 
Thomas van den Heuvel

Thomas van den Heuvel

26/09/2018 17:01:45
Quote Anchor link
Een gecodeerde hyperlink... je bedoelt een activatielink o.i.d.?

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
 
Rob Doemaarwat

Rob Doemaarwat

26/09/2018 17:46:44
Quote Anchor link
Voor een link moet je de variabelen door urlencode() heen halen of http_build_query() gebruiken.

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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$email
= 'test@test.test';
$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
 
Jop B

Jop B

26/09/2018 21:11:37
Quote Anchor link
Het is inderdaad een soort activatie link oftewel voor mij een link voor toestemming.
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
 
Ozzie PHP

Ozzie PHP

26/09/2018 21:16:35
Quote Anchor link
>> deze leest de link uit en pak daar het ordernummer en bedrag en eventueel andere informatie, dit word ook zonder database gedaan.

euh .. nee
 
Jop B

Jop B

26/09/2018 21:24:43
Quote Anchor link
@Ozzie PHP

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
 
Frank Nietbelangrijk

Frank Nietbelangrijk

26/09/2018 21:35:50
Quote Anchor link
>> IK MAAK GEEN GEBRUIK VAN EEN DATABASE

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)
PHP script in nieuw venster Selecteer het PHP script
1
SELECT name, email FROM customers WHERE hash='3787bba2a350672f5b42652536d8c4c598a53542';
Gewijzigd op 26/09/2018 21:42:53 door Frank Nietbelangrijk
 
Jop B

Jop B

26/09/2018 21:37:15
Quote Anchor link
Ik denk dat de optie wat Rob zegt voor mij het beste werkt. De hash meesturen en bij het ontvangen nogmaals een hash aanmaken met de naam en email uit de link en vervolgens deze vergelijken.

Als ze het zelfde zijn niet gemanipuleerd pak naam en emailadres en verstuur email anders geef error.
 
Frank Nietbelangrijk

Frank Nietbelangrijk

26/09/2018 21:40:00
Quote Anchor link
2.2 Beveiliging
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!
 
Rob Doemaarwat

Rob Doemaarwat

26/09/2018 22:32:57
Quote Anchor link
@Frank: Volgens mij geeft Jop de Rabo alleen als voorbeeld dat je met een hash de boel prima kunt beveiligen (want: de Rabo doet het ook).
@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.
 
Frank Nietbelangrijk

Frank Nietbelangrijk

26/09/2018 22:43:44
Quote Anchor link
Natuurlijk Rob, kan de data in de URL (veel) moeilijker aangepast worden als je een hash meestuurt. Maar er zitten wel haken en ogen aan. Wellicht kan een gebruiker achterhalen hoe de hash wordt samengesteld en dan het trucje nadoen. Ook zul je zoals je zelf aangeeft de hash moeten controleren voordat je de data gaat gebruiken terwijl je ingeval van een hash in de database die data niet eens gaat vinden. Hoe dan ook het geeft mij van die nekharen die overeind gaan staan. data bij de gebruiker achterlaten is en blijft onveilig zo voelt het bij mij.

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)
 
Ward van der Put
Moderator

Ward van der Put

26/09/2018 23:01:57
Quote Anchor link
We zwabberen zo wel lekker het hele dek en de onderkant van de boot.

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?


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?
 
Jop B

Jop B

26/09/2018 23:13:24
Quote Anchor link
Toch maar een database aangemaakt
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
<?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!!!";
}


?>


Het is gelukt :)
Gewijzigd op 26/09/2018 23:36:39 door Jop B
 
- Ariën -
Beheerder

- Ariën -

26/09/2018 23:37:27
Quote Anchor link
Let wel op SQL-injectie in $seal !!!!
 
Thomas van den Heuvel

Thomas van den Heuvel

27/09/2018 01:27:15
Quote Anchor link
Ik gruwel van de gedachte dat ik ergens mijn persoonlijke gegevens heb gestald waarbij men zich van bovenstaande code bedient.

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
 



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.