Avatar billede internet Nybegynder
26. juli 2009 - 00:32 Der er 33 kommentarer og
4 løsninger

Redirect, hvis browser ikke accepterer cookies

Jeg har brug for hjælp til at lave et script, der 1) tjekker om browseren accepterer cokkies 2) Hvis browseren ikke accepterer cookies redirecter til siden no_cookies.php

Håber der er nogle der kan hjælpe mig.

På forhånd tak.
Avatar billede repox Seniormester
26. juli 2009 - 00:38 #1
Du kan ikke gøre det med PHP før du henter den næste side.
Det vil sige at du skal gøre noget ala dette:

side1.php
<?php
    setcookie("test", "test", time()+3600);
    header("Location: side2.php");
?>

side2.php
<?php
    if(!isset($_COOKIE["test"]))
    {
        header("Location: side2.php");
        exit;
    }
?>
Avatar billede repox Seniormester
26. juli 2009 - 00:39 #2
Eller side2.php:
side1.php
<?php
    setcookie("test", "test", time()+3600);
    header("Location: no_cookies.php");
?>
Avatar billede Slettet bruger
26. juli 2009 - 01:05 #3
Kunne også gøres således:

<?php
    if ($_GET['cookieset']) {
        if (isset($_COOKIE["test"])) {
            //Side
        }
        else { header("Location: no_cookies.php"); }
    else { setcookie("test", "test", time()+3600); }
    }
?>
Avatar billede repox Seniormester
26. juli 2009 - 01:13 #4
#3
Hvordan skal dit forslag fungere i praksis?
Avatar billede internet Nybegynder
26. juli 2009 - 01:19 #5
Det ville være fedt hvis jeg nøjes med noget kode på en side fx header.php, der så tjekker om folk accepterer cookies. Hvis de ikke gør skal siden ikke vises men istedet for no_cokkies.php

Kan det ikke lade sig gøre, men en kode på en side/fil?
Avatar billede repox Seniormester
26. juli 2009 - 01:21 #6
Du kan ikke gøre det med en enkelt sideindlæsning i PHP.
Avatar billede Slettet bruger
26. juli 2009 - 01:30 #7
Måske med PHP + Javascript. PHP = set cookie, javascript = læs cookie.
Avatar billede Slettet bruger
26. juli 2009 - 01:35 #8
<?php
    if(!isset($_COOKIE["test"]))
    {
        setcookie("test", "test", time()+3600);
    }
?>

<script type="text/javascript">
    var cookies=document.cookie.indexOf(test + "=");
    if (test = -1) {
        window.location = "no_cookies.php"
    }
</script>
Avatar billede Slettet bruger
26. juli 2009 - 01:36 #9
Whoops.

<?php
    if(!isset($_COOKIE["test"]))
    {
        setcookie("test", "test", time()+3600);
    }
?>

<script type="text/javascript">
    var cookies=document.cookie.indexOf("test=");
    if (test = -1) {
        window.location = "no_cookies.php"
    }
</script>
Avatar billede repox Seniormester
26. juli 2009 - 01:39 #10
#9
En cookie er stadig ikke tilgængelig før næste sideindlæsning.
Avatar billede Slettet bruger
26. juli 2009 - 01:44 #11
Okay.
Avatar billede opuer2 Nybegynder
26. juli 2009 - 02:08 #12
mmm cookies
Avatar billede Slettet bruger
26. juli 2009 - 02:41 #13
Mmm... Folk ved navn opuer2, helst til morgenmad.
Hvad gjorde din kommentar godt for?
Avatar billede opuer2 Nybegynder
26. juli 2009 - 02:53 #14
hvad gør din kommentar af min kommentar godt for ?
Avatar billede Slettet bruger
26. juli 2009 - 03:28 #15
Den får dig forhåbentligt til at ændre din adfærd, og stoppe med at skrive meningsløse indlæg.
Avatar billede opuer2 Nybegynder
26. juli 2009 - 03:31 #16
hvorfor blande dig i andres  liv når du har dit eget
Avatar billede showsource Seniormester
26. juli 2009 - 07:27 #17
opuer2 -> Du er da en underlig fætter!
Avatar billede Slettet bruger
26. juli 2009 - 13:33 #18
Hvorfor være en lam flamer, i stedet for at prøve at hjælpe folk?
Avatar billede jesperhgh Nybegynder
26. juli 2009 - 13:54 #19
Hvis du kun vil have EN fil, kan du evt prøve dette:
------------------------------
<?php
session_start();
if(isset($_SESSION['secondCall'])) {
  if(isset($_COOKIE['test'])) {
      echo '<html><body>cookie er accepteret</body></html>';
  } else {
      echo '<html><body>cookie er afvist</body></html>';
  }
} else {
  $_SESSION['secondCall'] = 'yes';
  setcookie('test', 'test', time() + 3600);
  echo '<html><head><meta http-equiv="REFRESH" content="0;url=http://';
  echo $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'] . '?' . SID . '"></head></html>';
}
?>
------------------------------
Avatar billede jesperhgh Nybegynder
27. juli 2009 - 12:05 #20
Denne løsning er nok lidt mere elegant end ovenstående:

<?php

session_start();
if(isset($_COOKIE['test']))
    header('Location: http://'.$_SERVER['HTTP_HOST'].'/cookieYes.php');
else
    if(isset($_SESSION['secondCall']))
        header('Location: http://'.$_SERVER['HTTP_HOST'].'/cookieNo.php');
    else {
        $_SESSION['secondCall'] = true;
        setcookie('test', 'test', time() + 30);
        header('Location: http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?'.SID);

    }
?>
Avatar billede Slettet bruger
27. juli 2009 - 12:34 #21
Nu kan det godt være at jeg er helt galt på den, men bruger PHP ikke cookies til at gemme session-id?
Avatar billede Slettet bruger
27. juli 2009 - 12:53 #22
Undskyld, havde ikke set at du havde taget højde for det med:
.'?'.SID);
Avatar billede Slettet bruger
27. juli 2009 - 12:54 #23
Derfor kunne det måske stadig gøres lettere med:

<?php
if(isset($_COOKIE['test']))
    header('Location: http://'.$_SERVER['HTTP_HOST'].'/cookieYes.php');
else
    if(isset($_get['secondCall']))
        header('Location: http://'.$_SERVER['HTTP_HOST'].'/cookieNo.php');
    else {
        setcookie('test', 'test', time() + 30);
        header('Location: http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?secondCall=1);
    }
?>
Avatar billede repox Seniormester
27. juli 2009 - 12:55 #24
#21
Nej, du er ikke galt på den. Det er det normale opsæt.
Den løsning som #20 giver indbyder til en forældet metode at arbejde på - en metode som i øvrigt har voldt mange kvaler fra PHP4 (særligt i forbindelse med HTML validering).

Løsningen er dårlig og er ren dobbeltkonfekt.
Med den måde som sessions fungerer på idag som default, kan du lige så godt benytte dig af sessions til at kontrollere for cookies. Kan du ikke få adgang til sessions data er det fordi cookien med session id'et ikke er sat.
Avatar billede jesperhgh Nybegynder
27. juli 2009 - 14:05 #25
#24

Metoden med ?SID er ikke en forældet måde at håndtere sessions på, det er en ALTERNATIV måde at håndtere sessions på. Det virker også når klienten IKKE accepterer cookies - derfor!
Avatar billede jesperhgh Nybegynder
27. juli 2009 - 14:12 #26
#24

Og iøvrigt: Hvis en klient KUN skal have adgang til en side hvis den accepterer cookies er ?SID den bedste løsning.

Metoden ?x=y vil kunne give brugeren mulighed for at tiltvinge sig adgang til siden, selvom browseren ikke accepterer cookies!
Avatar billede repox Seniormester
27. juli 2009 - 14:30 #27
#25
Der er nok nogen der bliver hurtige pigesure, hva'?

SID konstanten er kun tilgængelig såfremt at session_start() ikke blev placeret korrekt i en cookie. Så i min verden er det en nødløsning, et levn fra PHP4 - en holdning jeg har. At du mener det er et lige så godt alternativ som cookiebaserede sessions er jo sin holdning.

Udover det sludrer du vist i #26.
SID konstanten har intet at gøre med det at en klient kun skal have adgang hvis denne accepterer cookies. Hverken som 'den bedste' eller 'den dårligste'. Det er en mulighed som du benytter dig af; og jeg har heldigvis ikke stødt på nogle i flere år, udover dig i denne tråd, der bruger den konstant til noget. Den eneste kommentar skrevet i manualen omkring konstanten er da en advarsel om at være påpasselig med den!
Men jeg går ud fra du har tænkt dig at argumentere for hvorfor du mener at SID konstanten er den bedste løsning til at afgøre hvorvidt en klient skal have adgang til noget eller ej?

PHP byder på så mange andre elementer at kontrollere en klients adgang til diverse services på. Langt størstedelen af alle PHP udviklere benytter sig af sessions.
Avatar billede Slettet bruger
27. juli 2009 - 14:33 #28
#26 Metoden ?x=y vil kunne give brugeren mulighed for at tiltvinge sig adgang til siden, selvom browseren ikke accepterer cookies!

Det er ikke korrekt.
Brugeren vil være i stand til at sætte $_GET['secondCall'] til false/0, men det vil kun gøre, at siden refresher endnu engang. Han vil ikke, ved at sætte get parameteret kunne komme ind på cookieYes.php. Til gengæld vil han, hvis han virkelig gerne vil, kunne sende en http-request med cookien test=test selvom hans browser ikke har gemt cookien, men det er der jo ingen grund til.

#24, enig. Det indbyder til at bruge Sessions på en forkert/forældet måde, selvom det godt kan lade sig gøre.
Avatar billede jesperhgh Nybegynder
27. juli 2009 - 14:57 #29
#28: "Brugeren vil være i stand til at sætte $_GET['secondCall'] til false/0, men det vil kun gøre, at siden refresher endnu engang."
Du har ret!

#27: "SID konstanten er kun tilgængelig såfremt at session_start() ikke blev placeret korrekt i en cookie."
Vrøvl!

Metoden ?SID er ikke ment som adgangskontrol, men som en hurtig måde at fordele klienter til coockie/nocookie scripts. Hvordan vil du iøvrigt håndtere sessions hvis klienten ikke accepterer cookies?
Avatar billede Slettet bruger
27. juli 2009 - 15:05 #30
#29, hvis session cookies ikke blev accepteret af klienten ville jeg give ham/hende en passiv version af siden, uden sessions, eller en fejlmeddelelse.
Avatar billede repox Seniormester
27. juli 2009 - 15:12 #31
#29
Det er ikke noget vrøvl, du kan da selv læse manualen: http://us2.php.net/manual/en/session.constants.php

SID er en konstant, ikke en metode. At du vil bruge SID konstanten er din egen sag, så længe jeg slipper.

Og så til dit egentlige spørgsmål:
Nemt; jeg håndterer ikke sessions, hvis klienten ikke tager imod sessions.
Hvis klienten ikke kan få adgang til mine applikationer, gennem en ganske normal metode at anvende sessions på, så er klienten ikke vigtig. Søgemaskiner benytter sig ikke af cookies og sessions - og for mig ville det være lidt uheldigt at få indekseret sider med SID konstanten i min URL; så mine applikationer er altid udviklet med søgemaskiner i mente og den forventede klient. Langt størstedelen af alle klienter tillader cookies; dem der ikke gør, får kun begrænset adgang.
Avatar billede jesperhgh Nybegynder
27. juli 2009 - 15:27 #32
EN OMMER - du har ret - jeg giver mig!

SID er kun tilgængelig uden $_get parameter i første kald fra klienten.
Så set i det lys er brug af session ikke nødvendigt for at besvare det oprindelige spørgsmål i denne tråd (#1).
Avatar billede Slettet bruger
27. juli 2009 - 15:56 #33
Internet, har du fået besvaret dit spørgsmål?
Vi (mig, repox og jesperghgh) er vist tilsammen nået frem til en løsning a la denne:

<?php
if(isset($_COOKIE['test']))
    header('Location: cookies.php');
else
    if(isset($_get['secondCall']))
        header('Location: ingencookies.php');
    else {
        setcookie('test', 'test', 0);
        header('Location: http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?secondCall=1);
    }
?>
Avatar billede jesperhgh Nybegynder
27. juli 2009 - 16:32 #34
Lige for at kneppe fluen helt færdig, så mangler der et ' (single quote) i sidste linie efter '?secondCall=1

...Så, nu skal jeg nok holde min kæft ... for en tid.
Avatar billede snowball Novice
27. juli 2009 - 19:53 #35
opuer2: Såfremt du ikke har noget reelt at bidrage med, så undlad venligst at kommentere spørgsmålet - især ikke som et svar da du så rent faktisk overtræder 2 punkter i reglerne - http://www.eksperten.dk/brugerbetingelser punkt 2.1.8 og 2.1.18.

Husk det venligst, tak :)
Avatar billede Slettet bruger
28. marts 2010 - 22:33 #36
Hmm... Hvorfor vik Opour2 point her?
Avatar billede internet Nybegynder
28. marts 2010 - 22:57 #37
Det var mig der var for hurtig på knapperne.

Desværre er der ikke nogen undo knap :(

Det beklager jeg selvfølgelig.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester