[PHP] direct bezoek pagina b redirect naar a

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik zat mij af te vragen of het mogelijk is in PHP of in een andere taal/script om het volgende voor elkaar te krijgen.

De bezoeker komt van de main-pagina.php op pagina-a.php. Vandaaruit kan men naar pagina-b.php.

Via links van andere sites komt men nu soms direct op pagina-b.php, zonder eerst op pagina-a.php geweest te zijn.

Is het mogelijk om, zodra men pagina-b.php bezoekt zonder op pagina-a.php geweest te zijn deze bezoekers te redirecten naar pagina-a.php?

Acties:
  • 0 Henk 'm!

  • Sosabowski
  • Registratie: Juni 2003
  • Laatst online: 18-09 21:03

Sosabowski

nerd

Tuurlijk. Je kan de referer controleren of gebruik maken van een cookie.

The whole problem with the world is that fools and fanatics are always so certain of themselves, and wiser people so full of doubts. -- Bertrand Russell


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 22:34
Ja, je kunt bijvoorbeeld in een sessie bijhouden of de bezoeker al op a geweest is. Belangrijker is vaak de vraag waarom je niet zou willen dat de bezoeker direct op b komt. Als a en b zo samenhangen dan zou dat op pagina b gewoon kunnen blijken (of had je het beter 1 pagina gemaakt). Als de context een applicatie is gebruik je wellicht de mogelijkheden van je request-variabelen niet voldoende.

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • t-x-m
  • Registratie: November 2003
  • Laatst online: 24-08 11:21

t-x-m

.NET Nerd

#pagina a:
PHP:
1
2
3
4
5
<?php
session_start();
$_SESSION['from_page_a'] = true;
print 'klik <a href="./b.php">hier</a> om naar pagina b te gaan';
?>


#pagina b
PHP:
1
2
3
4
5
6
7
8
9
10
11
<?php
session_start();
if ($_SESSION['from_page_a'] !=true){
  print 'Sorry je moet eerst naar <a href="./a.php">pagina a</a>';
} else {
  // Voor Erkens ;-)
  unset($_SESSION['from_page_a']);

  print 'welkom op pagina b';
}
?>


zoiets misschien?? niet getest

[ Voor 23% gewijzigd door t-x-m op 10-01-2006 13:19 . Reden: Unsetten sessie bij pagina b ]

GC.Collect();


Acties:
  • 0 Henk 'm!

Verwijderd

a
PHP:
1
2
3
4
<?php
session_start();
$_SESSION['from_a'] = true;
?>


b
PHP:
1
2
3
4
5
6
<?php
session_start();
if ($_SESSION['from_a'] !== true) {
 header('Location: pagina-a.php');
}
?>

Acties:
  • 0 Henk 'm!

  • YopY
  • Registratie: September 2003
  • Laatst online: 13-07 01:14
Of:

PHP:
1
2
3
4
5
6
<?php
if ($HTTP_REFERER != 'http://url.naar.bestand.a')
{
header (location: 'http://url.naar.bestand.b');
}
?>


Zo word hij direct doorgestuurd naar bestand A als hij naar bestand B gaat zonder eerst bij A te zijn geweest, zonder dat hij (als het goed is) bestand B ooit ziet. Een voorwaarde is wel dat het voor alle output moet komen, anders krijg je een 'headers already sent by XXX'-fout.

(btw: $HTTP_REFERER werkt alleen met een bepaalde php.ini instelling, als dit niet werkt moet je $_SERVER['HTTP_REFERER'] gebruiken.)

(disclaimer: Ik weet niet of dit beter / slechter is dan de eerder genoemde voorbeelden, maar ik gebruik altijd deze methode)

Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

YopY schreef op dinsdag 10 januari 2006 @ 12:51:
(btw: $HTTP_REFERER werkt alleen met een bepaalde php.ini instelling, als dit niet werkt moet je $_SERVER['HTTP_REFERER'] gebruiken.)
correctie, je moet altijd $_SERVER['HTTP_REFERER'] gebruiken, als je $HTTP_REFERER hebt moet je je register_globals eens snel uit gaan zetten ;)
(disclaimer: Ik weet niet of dit beter / slechter is dan de eerder genoemde voorbeelden, maar ik gebruik altijd deze methode)
referer wordt niet altijd (correct) mee gestuurd, betrouwbaar is het iig niet.

Als je het met die session gaat doen, vergeet dan niet die sessie var weer te deleten als je bij pagina b bent aangekomen (of uberhaupt op een andere pagina) anders schiet je er niks mee op.

Acties:
  • 0 Henk 'm!

  • We Are Borg
  • Registratie: April 2000
  • Laatst online: 22:25

We Are Borg

Moderator Wonen & Mobiliteit / General Chat
YopY: Nu kan ik er compleet naast zitten, maar volgens mij kan je bij o.a. Firefox de referer uitzetten. Als je die dus standaard hebt uitstaan, dan werkt je idee niet meer :)

Edit: wat Erkens dus al zegt :X

[ Voor 10% gewijzigd door We Are Borg op 10-01-2006 12:56 ]


Acties:
  • 0 Henk 'm!

  • Hydra
  • Registratie: September 2000
  • Laatst online: 21-08 17:09
Ik zou sowieso niet op referrer basis werken. Dat hoeft niet meegestuurd te worden nl., en bovendien wordt die code erg omslachtig als je vanuit andere pagina's ook op pagina B kunt komen.

https://niels.nu


Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 18-09 14:42
Geen van gegeven oplossnigen zijn betrouwbaar.
Cookies kunnen uitstaan, referers kunnen utistaan of gefaked worden.

Als je het echt waterdicht wilt hebben moet je een algoritme gebruiken, welke een ander niet kan raden. Je kunt bijvoorbeeld in je link naar pagina B een timestamp meegeven, waarbij je in pagina B controleerd of deze minder dan een bepaald aantal seconden oud is.
Door de timestamp te 'coderen' is het voor derden niet mogelijk pagina B aan te roepen zonder de hash uit pagina A.

Pagina A
PHP:
1
2
$hash = codeer(time());
echo "<a href=\"paginaB.php?hash=$hash\">Pagina B</a>";


Pagina B
PHP:
1
2
if(!isset($_GET['hash']) || decodeer($_GET['hash']) + 60 < time())
  exit(header("Location: paginaA.php"));


Als ze echt willen hotlinken naar pagina B kunnen ze natuurlijk automatisch de URL uit jouw pagina ophalen en hiermee hun eigen link maken. Waterdicht is het nog steeds niet, maar wel meer dan eerder genoemde oplossingen.
De codeer() en decodeer()-functies zul je zelf iets moiois van moeten maken met bijv mod_mcrypt.

[ Voor 7% gewijzigd door frickY op 10-01-2006 14:07 ]


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

frickY schreef op dinsdag 10 januari 2006 @ 14:06:
Geen van gegeven oplossnigen zijn betrouwbaar.
Cookies kunnen uitstaan, referers kunnen utistaan of gefaked worden.
cookie (voor je sessie) niet aanwezig? -> geen toegang
Als je het echt waterdicht wilt hebben moet je een algoritme gebruiken, welke een ander niet kan raden. Je kunt bijvoorbeeld in je link naar pagina B een timestamp meegeven, waarbij je in pagina B controleerd of deze minder dan een bepaald aantal seconden oud is.
Door de timestamp te 'coderen' is het voor derden niet mogelijk pagina B aan te roepen zonder de hash uit pagina A.
<knip>
Als ze echt willen hotlinken naar pagina B kunnen ze natuurlijk automatisch de URL uit jouw pagina ophalen en hiermee hun eigen link maken. Waterdicht is het nog steeds niet, maar wel meer dan eerder genoemde oplossingen.
De codeer() en decodeer()-functies zul je zelf iets moiois van moeten maken met bijv mod_mcrypt.
je speekt jezelf tegen :P
tijden gebruiken is uiterst onbetrouwbaar.

Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 18-09 14:42
Niet wanneer je ze codeerd, zoals duidelijk uit mijn voorbeeld naar voren komt.
cookie (voor je sessie) niet aanwezig? -> geen toegang
Cookies uitgeschakeld? -> nooit toegang.

Nu kun je je natuurlijk afvragen hoeveel mensen cookies 100% blokken.. Ik denk dat dat wel mee zal vallen, waardoor het in principe prima te doen is met een sessie (welke ook nog via de URL doorgegeven kan worden). Maar het ging me even om het idee.

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Een kleine opmerking Fricky, een hash kun je niet decoderen. ;)

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • JeroenT
  • Registratie: Juli 2001
  • Laatst online: 14-09 08:48

JeroenT

hoi!

Inderdaad , die oplossing van frickY kan ook niet werken.

Probleem is dat alles wat je zo-waterdicht-mogelijk encrypt , je niet meer kan decrypten.
Gewoon met $_SESSION gaan werken , lijkt mij prima als basis.

Acties:
  • 0 Henk 'm!

  • eamelink
  • Registratie: Juni 2001
  • Niet online

eamelink

Droptikkels

Grijze Vos schreef op dinsdag 10 januari 2006 @ 17:59:
Een kleine opmerking Fricky, een hash kun je niet decoderen. ;)
Dat hoeft toch ook niet?

Doe dan zoiets (al is het nog steeds omslachtig)

Pagina A
PHP:
1
2
$time = time();
echo '<a href="http://bla/b.php?timestamp_visited_a='.$time.'&checksum='. md5('eamelink_is_tof'. $time).'" />Ga naar Pagina B!</a>';


Pagina B
PHP:
1
2
3
4
5
if($_REQUEST['checksum'] != md5('eamelink_is_tof'. $_REQUEST['timestamp_visited_a'])){ 
echo "Jaaaaaa, een timestamp veranderen trap ik natuurlijk niet in :P";
} else if(time() - $_REQUEST['timestamp_visited_a'] > 1000){
echo "Deze link is oud man! Ga eens een nieuwe halen @ pagina A!";
}

[ Voor 12% gewijzigd door eamelink op 10-01-2006 20:29 ]


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Maar zodra je weet dat 'eamelink_is_tof' is gebruikt is het al genoeg :)
Wel kan je die string ook 'random' gebruiken en in je sessie zetten, maar dan heeft het ook geen nut om te md5'en, gewoon die timestamp opslaan is dan ook al genoeg, het gaat er immers om dat die 'code' niet al een keer gebruikt is en door pagina A gezet is.

Acties:
  • 0 Henk 'm!

  • eamelink
  • Registratie: Juni 2001
  • Niet online

eamelink

Droptikkels

Erkens schreef op dinsdag 10 januari 2006 @ 21:17:
Maar zodra je weet dat 'eamelink_is_tof' is gebruikt is het al genoeg :)
Wel kan je die string ook 'random' gebruiken en in je sessie zetten, maar dan heeft het ook geen nut om te md5'en, gewoon die timestamp opslaan is dan ook al genoeg, het gaat er immers om dat die 'code' niet al een keer gebruikt is en door pagina A gezet is.
Het hele idee van het gebruik van deze methode is dat je de 'salt' string (eamelink_is_tof) dan ook geheim houdt he :P

En daar is ook niet gemakkelijk achter te komen dus het 'zodra je weet dat' klinkt ook wel erg optimistisch :P

Acties:
  • 0 Henk 'm!

Verwijderd

encryptie kan idd (maakt niet uit welke manier, symmetrisch of met hash), maar het probleem blijft bij die tijden... je kan er volgens mij redelijkerwijs vanuit gaan dat mensen cookies aanzetten en in de 'foutmelding' op pagina B zetten dat ze die aan moeten zetten

de beste manier bedenk ik net (als je ook mensen die alle cookies blokkeren blij wilt maken) is denk ik een random sleutel genereren die je zowel in de link naar de volgende pagina plaatst als opslaat op de server (bestand, database). De volgende pagina checkt dan of die sleutel klopt. (evt werken met een id + sleutel)

Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Maar uiteindelijk weet je dan nog niet of pagina A wel de vorige pagina is geweest die op het scherm heeft gestaan bij de gebruiker. Iemand kan die URL kopieeren en op een andere computer bijvoorbeeld intikken. Dan kan je natuurlijk in je sessie ook nog gegevens als het IP adres en eventueel de user_agent opslaan, maar daar heb je ook weinig aan, IP adres kan hetzelfde zijn (NAT/Proxy) en de user_agent_string is iets wat de client mee stuurt en waar je dus niet kan vertrouwen.
Kortom, je kan het redelijk secure maken, maar 100% waterdicht is niet mogelijk.
Pagina: 1