referer controleren
Allen,
Wat is de beste manier om te controleren op de vorige pagina?
http_referer is te spoofen, dus geen goede oplossing.
Zijn er andere manieren?
Het gaat erom dat ik wil controleren of een POST daadwerkelijk van mijn eigen server komt en dus niet van iemand die het formulier namaakt. Misschien zijn er ook andere ideeen om dit te voorkomen.
Bvd
Wat is de beste manier om te controleren op de vorige pagina?
http_referer is te spoofen, dus geen goede oplossing.
Zijn er andere manieren?
Het gaat erom dat ik wil controleren of een POST daadwerkelijk van mijn eigen server komt en dus niet van iemand die het formulier namaakt. Misschien zijn er ook andere ideeen om dit te voorkomen.
Bvd
Gewijzigd op 27/03/2014 10:01:49 door Michael -
Zet een uniek veld in je formulier waarvan jij alleen de waarde weet.
Als ik dan het formulier opsla om m'n pc dan zit dat veld er toch ook bij in?
Als je het formulier toont maak je de unieke waarde pas aan. Die waarde stop je ook in de database of in een session zodat je kan kijken of die overeen komt met het ingezonden formulier.
Hoe zie je dit voor je dan? Want als ik de pagina dan refresh, wordt er een session gemaakt met een uniqid() bijvoorbeeld en dan ik controleer bij de post request of ie het veld overeenkomt met de session en dan wis ik de session. Dan kan ik nog steeds de pagina openen, session wordt gemaakt, de html opslaan, request doen, vervolgens de andere pagina refreshen en weer opslaan.. etc.
Wat je zoekt heet CSRF token.
Zoek daar eens op middels google.
Zoek daar eens op middels google.
ik zag bij het spammen op een site steeds het patroon:
vanaf ip1 wordt form aangeroepen.
vanaf ip2 wordt enkele seconden later een spam-bericht geplaatst.
ip1 is dan bijvoorbeeld Taiwan en ip2 in Chili of Kenia etc.
Blacklisten van de ip1 adressen bleek daarbij het effetiefste op den duur.
Maar goed: je hebt kans dat een dergelijke techniek ook jouw "unieke code" gewoon mee pakt.
Misschien moet je bij het tonen van een form direct het ip-adres onthouden in de database en een post alleen accepteren als in de de afgelopen (kies accepteble aantal minuten/uur) form door dat ip is opgevraagd.
vanaf ip1 wordt form aangeroepen.
vanaf ip2 wordt enkele seconden later een spam-bericht geplaatst.
ip1 is dan bijvoorbeeld Taiwan en ip2 in Chili of Kenia etc.
Blacklisten van de ip1 adressen bleek daarbij het effetiefste op den duur.
Maar goed: je hebt kans dat een dergelijke techniek ook jouw "unieke code" gewoon mee pakt.
Misschien moet je bij het tonen van een form direct het ip-adres onthouden in de database en een post alleen accepteren als in de de afgelopen (kies accepteble aantal minuten/uur) form door dat ip is opgevraagd.
@Bart, bedankt voor je reactie. Dit is eigenlijk min of meer het antwoord wat SanThe al gaf, maar de tutorials gaan er soms nog iets verder in. Zoals deze. Nog steeds kun je dan naar mijn idee de pagina opslaan en een request doen, omdat alles sessions dan gemaakt zijn en overeenkomen met de velden. Om een nieuwe request te doen moet je alleen de pagina refreshen en opnieuw opslaan. Geeft mij nog geen zeker gevoel.
@Ivo, dat is geen optie omdat ik echt geen 24/7 alles zit te monitoren en het kwaad dus allang uitgebreid geschied kan zijn. Daarnaast, wat zegt een IP blok tegenwoordig nog? Binnen een paar seconden heb je een andere.
Dat laatste is inderdaad zeker wel een optie mits goed uitgewerkt.
@Ivo, dat is geen optie omdat ik echt geen 24/7 alles zit te monitoren en het kwaad dus allang uitgebreid geschied kan zijn. Daarnaast, wat zegt een IP blok tegenwoordig nog? Binnen een paar seconden heb je een andere.
Dat laatste is inderdaad zeker wel een optie mits goed uitgewerkt.
Gewijzigd op 27/03/2014 10:51:58 door Michael -
Volgens mij moet zoiets als dit werken.
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
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
<?php
ini_set('display_errors', 1); // 0 = uit, 1 = aan
error_reporting(E_ALL);
session_start();
if($_SERVER['REQUEST_METHOD'] == 'POST')
{
if(isset($_POST['code'], $_SESSION['code']) and $_POST['code'] == $_SESSION['code'])
{
echo 'Eigen formulier';
}
else
{
echo 'Van een andere server';
}
}
else
{
$_SESSION['code'] = sha1(microtime());
echo '<form action="" method="post">';
echo 'Naam: <input type="text" name="naam"/>';
echo '<input type="hidden" name="code" value="'.$_SESSION['code'].'"/>';
echo '<input type="submit" value="Zend"/>';
echo '</form>';
}
?>
ini_set('display_errors', 1); // 0 = uit, 1 = aan
error_reporting(E_ALL);
session_start();
if($_SERVER['REQUEST_METHOD'] == 'POST')
{
if(isset($_POST['code'], $_SESSION['code']) and $_POST['code'] == $_SESSION['code'])
{
echo 'Eigen formulier';
}
else
{
echo 'Van een andere server';
}
}
else
{
$_SESSION['code'] = sha1(microtime());
echo '<form action="" method="post">';
echo 'Naam: <input type="text" name="naam"/>';
echo '<input type="hidden" name="code" value="'.$_SESSION['code'].'"/>';
echo '<input type="submit" value="Zend"/>';
echo '</form>';
}
?>
Gewijzigd op 27/03/2014 10:54:41 door - SanThe -
ik bedoel idd niet dat je dat op die manier moet bijhouden.
ik bedoel eigenlijk dat je er rekening mee moet houden dat bots eerst een form uitlezen om te zien of je daarin recent nog iets hebt aangepast en daarna (evt vanaf een ander ip) een post doen.
ik bedoel eigenlijk dat je er rekening mee moet houden dat bots eerst een form uitlezen om te zien of je daarin recent nog iets hebt aangepast en daarna (evt vanaf een ander ip) een post doen.
@SanThe; Bedankt voor je reactie. Hierin zou je dan nog wel de session moeten unsetten na de post. Nou kan ik net zo lang post vanaf m'n pc sturen totdat ik de andere pagina refresh waardoor de session niet meer overeenkomen. Maar dan is het nog altijd mogelijk in ieder geval 1 post te kunnen doen.
@Ivo P; Dan had ik je verkeerd begrepen ;)
@Ivo P; Dan had ik je verkeerd begrepen ;)
- SanThe - op 27/03/2014 10:12:27:
Als je het formulier toont maak je de unieke waarde pas aan. Die waarde stop je ook in de database of in een session zodat je kan kijken of die overeen komt met het ingezonden formulier.
Zo doe ik het idd ook... nooit meer spam of rare fratsen. :)




