Vaag probleem met cookies

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Hans Vereyken

Hans Vereyken

25/09/2008 15:36:00
Quote Anchor link
Ik heb een klein beveiligings-script geschreven voor een website, voor mij werkt het perfect, maar er komen zeer veel klachten van mensen die niet meer kunnen inloggen. Zelf heb ik het probleem nog niet kunnen reconstrueren. Wel heb ik ondervonden dat het op sommige computers lukt, bij andere niet. Het probleem is niet browser-gebonden, als het met ff niet gaat gaat het ook niet met ie of andere. Het is niet netwerk of firewall -gebonden, computers in hetzelfde netwerk/achter dezelfde firewall geven verschillende resultaten.
Het enige waar een lijn in te trekken lijkt is het besturingssysteem, de computers die ik heb gevonden waar de boel niet werkt zijn allemaal vista (2). Maar naar het schijnt werkt het ook niet op andere systemen. Met de cookie instellingen heeft het niets te maken, aangezien andere websites die cookies gebruiken wel werken op deze 2 vista computers.
Het gaat over deze website:
http://www.helicon.be, om in te loggen moet je op het logo klikken.
Hier is de relevante code:
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
<?php
if(isset($_POST['submit'])){
    $ww=md5($_POST['ww']);
    include("dblogin.php");
    $query="SELECT * FROM ww WHERE ww='$ww'";
    $result=mysql_query($query)or die("Fout bij het uitvoeren van de wachtwoordquery");
    $num=mysql_num_rows($result);
    mysql_close();
    if($num=="0"){
        header("Location: http://www.helicon.be/menu/fout_ww.htm");
        exit;
    }
elseif($num>1){
        echo "This website is protected against hackers";
    }
elseif($num==1){
        $naam=mysql_result($result,0,"naam");
        $ww=mysql_result($result,0,"ww");
        $url=mysql_result($result,0,"url");
        setcookie('naam',$naam);
        setcookie('ww',$ww);
        echo "Wachtwoord is OK, aanmelden...";
        echo '<script>window.top.location="'.$url.'";</script>';
    }
}

?>


Op de pagina wordt dan nagekeken of er een cookie is gemaakt:

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?php
function secu($type){
    $naam=$_COOKIE['naam'];
    $ww=$_COOKIE['ww'];
    $num="0";
    switch($type){
        case
"leden":
        if($naam=="leden"){
            include("dblogin.php");
            $query="SELECT * FROM ww WHERE naam='$naam' AND ww='$ww'";
            $result=mysql_query($query)or die("Fout bij het uitvoeren van de wachtwoordquery");
            $num=mysql_num_rows($result);
            mysql_close();
        }

        break;
        case
"bestuur":
        if($naam=="bestuur"){
            include("dblogin.php");
            $query="SELECT * FROM ww WHERE naam='$naam' AND ww='$ww'";
            $result=mysql_query($query)or die("Fout bij het uitvoeren van de wachtwoordquery");
            $num=mysql_num_rows($result);
            mysql_close();
        }

        break;
    }

    if($num=="0"){
        $secu=false;
    }
elseif($num>1){
        $secu=false;
    }
elseif($num==1){
        $secu=true;
    }

    return $secu;
}

if(!secu("leden")){
    echo "This website is protected against hackers";
    echo '<script>window.top.location="http://www.helicon.be/index.htm";</script>';
    exit;
}

?>


Is er iemand die ziet waar het aan kan liggen?
Alvast bedankt!
 
PHP hulp

PHP hulp

20/04/2024 04:40:02
 
Hans Vereyken

Hans Vereyken

13/10/2008 10:29:00
Quote Anchor link
Helemaal niemand?
 
Jelle Posthuma

Jelle Posthuma

13/10/2008 10:35:00
Quote Anchor link
Dit is niet echt een oplossing, maar het maakt je script wel net iets korter:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
if($num=="0"){
    $secu=false;
}elseif($num>1){
    $secu=false;
}elseif($num==1){
    $secu=true;
}


==

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
    if($num < 1 || $num > 1)
    $secu=false;
else
    $secu = true;


En heb je het al uitgebreid gedebugged?
Door alle verwerkingen weer te geven op het scherm enz, zoals uitlezen cookies enz.
Gewijzigd op 01/01/1970 01:00:00 door Jelle Posthuma
 
- SanThe -

- SanThe -

13/10/2008 10:39:00
Quote Anchor link
Regel 15, 16 en 17 (bovenste script) zouden errors moeten geven. Je voert daar mysql uit terwijl je, als het goed is, geen verbinding meer hebt met de sql-server. Die zet je namelijk dicht op regel 8.

Edit:
Jelle Posthuma schreef op 13.10.2008 10:35:
... maar het maakt je script wel net iets korter:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
    if($num < 1 || $num > 1)
    $secu=false;
else
    $secu = true;


Zo is het nog korter. ;-)
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
if($num == 1) return true;
return false;
?>
Gewijzigd op 01/01/1970 01:00:00 door - SanThe -
 
Hans Vereyken

Hans Vereyken

13/10/2008 10:49:00
Quote Anchor link
@Jelle Posthuma & SanThe: Inderdaad, dat is wel overzichtelijker.
@SanThe: hij geeft geen error, hij doet ook gewoon zijn werk. Het resultaat van de query, en dus ook de data zitten opgeslagen in $result, de link met de database is dus niet meer nodig (zo heb ik het toch begrepen, en blijkbaar is het niet verkeerd, want voor ongeveer de helft van de bezoekers werkt het)

Edit:
Ik heb geprobeerd het te veranderen en de mysql_close(); van plaats te veranderen, maar dit lost het probleem niet op.
Gewijzigd op 01/01/1970 01:00:00 door Hans Vereyken
 
- SanThe -

- SanThe -

13/10/2008 11:06:00
Quote Anchor link
Haal regel 8 gewoon weg. Dan weet je zeker dat het moet werken.
 
Hans Vereyken

Hans Vereyken

13/10/2008 11:37:00
Quote Anchor link
Opgelost!:
Het probleem zat in het gebruik van verschillende servers voor dezelfde website:
Na wat ronddwalen op internet vond ik dit in de Apple Mailing Lists:

Quote:
Hi Christiaan,


Am Mittwoch, 28.04.04, um 07:01 Uhr (Europe/Berlin) schrieb Christiaan Knol <email@hidden>:

OK, I am now trying this without cookies after a quick read-up of
session variables. However I still can't seem to get it to work.


Even though you've given up on cookies I'd like to add a few comments on that subject:

1. Most browsers allow the user to configure not to accept cookies. So possibly this is the case on your windows testing machine.

2. I have used cookies with PHP and they worked fine in all browsers including Windows IE 6. (Subject to my remark above.)

3. A browser may refuse to accept a cookie if the domain doesn't match that of the current page URL. Again this depends on the users configuration. So if your cookie is coming from a different server than the rest of the web page that might be the problem.

4. Since cookies are set during the HTTP request you need to make sure that the HTTP headers have not been sent yet when setting the cookie. Either send it before the first byte of the page content or use output buffering to catch the page output and sent the buffer at the end of your script. Use the PHP function headers_sent() in your debug code to verify that they have not been sent just before setting the cookie.

5. After setting the cookie you should get it back from the browser with the NEXT request. So setting a cookie and expecting to see it to be set on the same page immediatly (during "this" script execution) is a wrong assumption. The transaction goes something like this:
Browser: GET some/url -> Server
Server: Set cookie A, send page -> Browser
Browser: GET some/other/url, send along cookie A -> Server
Server: Do something with cookie A, send page -> Browser

6. I use $_COOKIE since the $HTTP_COOKIE_VARS is no longer recommended. See <http://us2.php.net/manual/en/function.setcookie.php> for info. Works fine for me.

7. Cookies can be very useful in conjuction with sessions. Without cookies you need to pass the session id around in the url which looks kind of ugly. With cookies you can transport it invisibly.

8. Cookies are fragile. They are not always available, they can de deleted by the user or they can even be forged, and storage for cookies in the browser may be limited. So think about what you store in a cookie and have a fallback method ready if they fail. Also you might employ some sort of encryption to make forgery harder and you might want to do some additional checks on security sensitive data to avoid someone taking over a session for example. (Note: All this applies to session IDs and other sensitive data in urls as well.)



Het gaat mij hier vooral om punt 3, dit is bij de website van helicon het geval.
In het geval van Helicon staat de website op de server die ook het domein helicon.be beheert, vanaf het moment dat iemand probeert in te loggen worden in bepaalde iframes pagina's geladen van een andere server, die van mij (artexanis.be), via deze pagina's worden dan de cookies gemaakt, deze kunnen dus geweigerd worden. (de index die de iframes bevat staat op helicon.be, de pagina die het loginscript bevat staat op artexanis.be en wordt weergegeven in een iframe van de index die dus op helicon.be staat...)

Na het verplaatsen van de index naar mijn server werkt alles bij iedereen. Nu moet ik het nog online zetten, maar dat lukt me wel.
In ieder geval bedankt!
Gewijzigd op 01/01/1970 01:00:00 door Hans Vereyken
 



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.