Serverside client verificatie
ik ben weer even met php bezig, en zit met het volgende:
Ik wil, wanneer ik form input process, kunnen verifiëren dat de input van mijn website komt, en niet van een form met dezelfde namen vanaf een externe server.
Ik gebruik een client key in mijn forms, maar die is altijd hetzelfde en is gewoon een hidden value, dus in HTML zichtbaar.
Wat gebruiken jullie hier voor oplossingen voor?
Thanks in advance!
Als ik dit form zou willen misbruiken, copy/paste ik de broncode.
Als die key constant blijft, ben je er niets mee.
Wat al meer zou helpen, is die key random te laten genereren en die in een session variabele te steken.
Bij het versturen, vergelijk je of de hidden value overeen komt met de session variabele.
Basically is dit een soort Captcha, waarbij de code automatisch al ingevuld is.
Verder hoef je niet eens een input type="hidden" te gebruiken.
Het is nog vele malen veiliger om niet eens een code in de HTML bron te laten komen
Je kunt beter een sessie aanmaken bij het bezoeken van het formulier en deze vullen met een geheime code die in de database staat en soms verandert
bij het submitten van het formulier kun je dan de sessie met de code vergelijken met wat in de database staat.
Ah, dat is inderdaad hoe ik het vroeger deed! Thanks voor het opfrissen van mn geheugen wat dat betreft, dat zal ik sowieso weer toepassen.
Andere mogelijkheden en opinies zijn welkom!
EDIT: @Jan, die functie zou enorm handig zijn :).
Gewijzigd op 29/02/2012 20:03:34 door Mark Tielemans
Helaas ik heb gezocht en zie dat het niet mogelijk is om een $_POST of $_GET variabele te controleren op herkomst.
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
27
28
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
<?php
session_start();
if($_SERVER['REQUEST_METHOD'] === 'POST') {
if(isset($_SESSION['key']) && isset($_POST['key']) && $_POST['key'] === $_SESSION['key']) {
echo 'Yippi !<br/>';
echo 'mytext: ' . htmlentities($_POST['mytext']);
// hier kan je de post verder afhandelen
}
else {
echo 'not Yippi !';
}
// header('location: ?');
}
$_SESSION['key'] = md5(rand(0, 100000));
echo '
<html>
<head></head>
<body>
<title>Serverside client verificatie</title>
<form action="" method="post">
<input type="hidden" value="' . $_SESSION['key'] . '" name="key"/>
<input name="mytext"/>
<input type="submit" value="GO"/>
</form>
</body>
</html>
';
?>
session_start();
if($_SERVER['REQUEST_METHOD'] === 'POST') {
if(isset($_SESSION['key']) && isset($_POST['key']) && $_POST['key'] === $_SESSION['key']) {
echo 'Yippi !<br/>';
echo 'mytext: ' . htmlentities($_POST['mytext']);
// hier kan je de post verder afhandelen
}
else {
echo 'not Yippi !';
}
// header('location: ?');
}
$_SESSION['key'] = md5(rand(0, 100000));
echo '
<html>
<head></head>
<body>
<title>Serverside client verificatie</title>
<form action="" method="post">
<input type="hidden" value="' . $_SESSION['key'] . '" name="key"/>
<input name="mytext"/>
<input type="submit" value="GO"/>
</form>
</body>
</html>
';
?>
Dit is het simpelste voorbeeld, zoals ik uitlegde. Dit is niet waterdicht, maar probeer dit zelf maar eens te breken (kopieer de broncode, sla die op in een .htm bestandje, verander de action naar de effectieve url in de url-balk, open het bestand in een andere soort webbrowser, ...)
Tot men hier met de betere tools afkomt (want die zijn er uiteraard), heb je iets.
Ik kan me herinneren dat fuelPHP hier ook een goede oplossing voor had, die ga ik straks eens even opzoeken.
Wat je moet aanpassen:
- Je genereert die zelfde random string.
- Je slaat die string op in de database. Zie dat je de id van dit record te pakken krijgt (bv. met mysql_insert_id() )
- Je geeft die id mee in de hidden input
- Bij het controleren: $_POST['key'] is nu de id van het record. Met die id zoek je dus dat record op, die opgeslagen waarde vergelijk je met $_SESSION['key']
Hiermee omzeil je het wat. Je geeft niet de effectieve code mee naar de gebruiker, maar slechts een id.
Quote:
The address of the page (if any) which referred the user agent to the current page. This is set by the user agent. Not all user agents will set this, and some provide the ability to modify HTTP_REFERER as a feature. In short, it cannot really be trusted.
Thnx Roel, maar zoals de site aangeeft is het wel mogelijk deze variabele in sommige gevallen te manipuleren. Dit is wel nuttig, maar dus niet waterdicht. Thnx voor het extra inzicht :).
Kris, je bedoelt dus dat ik voor elk form een nieuwe key genereer die ik in de database gooi en waarvan ik de key meegeef. I guess that would work! Maar wel net wat heavier on the resources. Lijkt me wel de beste optie tot nu toe :).