Inleiding
Ik ben bezig bepaalde functionaliteiten aan een website die ik ooit gemaakt heb toe te voegen, hierbij komen er ook een hoop functionaliteiten die voorheen slordig afgehandeld werden allemaal samen in objecten die ik toe voeg.
De laatste klasse die ik aan mijn php applicatie toe gevoegd heb is een sessie afhandel klasse die alle gegevens op de server op slaat in een bestand (per gebruikerssessie uiteraard). Deze haalt bij initialisatie het sessie-id op van de huidige gebruiker (kan uit cookie komen). Ik heb dat zo gedaan voor extra controle over de sessiegegevens. (Alle controlezaken en alles wat eventueel de gegevens beinvloed heb ik er uit gehaald tijdens mijn poging dit probleem op te lossen en zijn dus niet relevant)
Alles betreffende deze sessie afhandelklasse werkt prima; ik kan netjes gegevens opslaan en weer terug halen.
Het probleem
Sinds het toevoegen van de sessieklasse werkt het inlogformulier voor beveiligde pagina's niet meer. Ik heb een kopie van de inlogpagina hier bij gevoegd, ook hier heb ik dingen weg gehaald tijdens het testen om zoveel mogelijke oorzaken buiten te sluiten.
).
Wat er gebeurd
Als ik naar de login pagina ga dan ziet mijn php script dat de pagina niet toegankelijk is voor de huidige gebruiker en stuurt deze naar de volgende locatie (lokaal) http://localhost/sitenaam/login.php?page_name=index.php&page_id=10. Nu heb ik in mijn form (zie boven) 'method="post" action="login.php"' staan wat er voor zou moeten zorgen dat als het formulier ingestuurd wordt dat dit naar de pagina login.php gaat, en dat de variabelen in de $_POST globale variabele terecht moeten komen. En ook zou de URL na submitten http://localhost/sitenaam/login.php moeten zijn!
Dit is allemaal niet het geval! Als ik "phpinfo(32);" of "print_r($_POST);" als allereerste commando van login.php zet zie ik de gewenste _POST variabelen nergens staan, of (bij print_r) drukt hij Array() af... Bovendien is de URL na het submitten nog steeds "http://localhost/sitenaam/login.php?page_name=index.php&page_id=10". Ik zie wel dat de hele pagina geladen wordt, en extra "echo 'hi';" commando's en dergelijke worden na het submitten wel weer gegeven.
Het is wellicht handig er bij te vermelden dat dit in zowel IE als in FF gebeurd...
Overigens gebruik ik Apache 2.0.54 als server en PHP 4.1.16. op Windows 2000.
Wat ik geprobeerd heb
Heeft iemand enig idee waar dit mis gaat/zou kunnen gaan, en wat ik nog meer kan proberen?
Ik vindt het zeer vreemd dat twee identieke webpagina bestanden (voor de client) dan niet gelijk verstuurd worden...
Ik ben bezig bepaalde functionaliteiten aan een website die ik ooit gemaakt heb toe te voegen, hierbij komen er ook een hoop functionaliteiten die voorheen slordig afgehandeld werden allemaal samen in objecten die ik toe voeg.
De laatste klasse die ik aan mijn php applicatie toe gevoegd heb is een sessie afhandel klasse die alle gegevens op de server op slaat in een bestand (per gebruikerssessie uiteraard). Deze haalt bij initialisatie het sessie-id op van de huidige gebruiker (kan uit cookie komen). Ik heb dat zo gedaan voor extra controle over de sessiegegevens. (Alle controlezaken en alles wat eventueel de gegevens beinvloed heb ik er uit gehaald tijdens mijn poging dit probleem op te lossen en zijn dus niet relevant)
Alles betreffende deze sessie afhandelklasse werkt prima; ik kan netjes gegevens opslaan en weer terug halen.
Het probleem
Sinds het toevoegen van de sessieklasse werkt het inlogformulier voor beveiligde pagina's niet meer. Ik heb een kopie van de inlogpagina hier bij gevoegd, ook hier heb ik dingen weg gehaald tijdens het testen om zoveel mogelijke oorzaken buiten te sluiten.
HTML:
Zoals je kunt zien is er niks raars, niks bijzonders of niks speciaals aan deze pagina. Het enige verschil met de eerdere versie van deze login pagina is dat er bij het genereren gebruik is gemaakt van nieuwe php code, maar de pagina is letter voor letter gelijk (met uitzondering van de challenge uiteraard 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
| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <title>Login form</title> <meta http-equiv="content-type" content="text/html; charset=iso-8859-15"> <script type="text/javascript"> // Beide functies staan eigenlijk in een extern js bestand. // Voor overzichtelijkheid heb ik ze even hier gezet. function hex_md5(s) { // deze functie berekend de md5 hash maar heb ik even er // uit geknipt om het voorbeeld korter te maken. } function fnBuildResponse(strLoginResponse, strLoginPassword, strLoginChallenge) { document.getElementById(strLoginResponse).value = hex_md5(hex_md5(document.getElementById(strLoginPassword).value) + document.getElementById(strLoginChallenge).value); document.getElementById(strLoginPassword).value = ''; return true; } </script> </head> <body> <form id="loginForm" method="post" action="login.php" onsubmit="return fnBuildResponse('login_response', 'login_pwd', 'login_challenge');"> <fieldset> <legend>User login form</legend> <input type="hidden" name="login_challenge" id="login_challenge" value="785097075996994691ef7d311c58ec70"> <input type="hidden" name="login_response" id="login_response" value=""> <input type="hidden" name="parameter[page_id]" value="10"> <input type="hidden" name="parameter[page_name]" value="index.php"> <input type="text" name="login_login" id="login_login" value=""> <input type="password" name="login_pwd" id="login_pwd" value=""> <input class="button" type="submit" value="Log in"> </fieldset> </form> </body> </html> |
Wat er gebeurd
Als ik naar de login pagina ga dan ziet mijn php script dat de pagina niet toegankelijk is voor de huidige gebruiker en stuurt deze naar de volgende locatie (lokaal) http://localhost/sitenaam/login.php?page_name=index.php&page_id=10. Nu heb ik in mijn form (zie boven) 'method="post" action="login.php"' staan wat er voor zou moeten zorgen dat als het formulier ingestuurd wordt dat dit naar de pagina login.php gaat, en dat de variabelen in de $_POST globale variabele terecht moeten komen. En ook zou de URL na submitten http://localhost/sitenaam/login.php moeten zijn!
Dit is allemaal niet het geval! Als ik "phpinfo(32);" of "print_r($_POST);" als allereerste commando van login.php zet zie ik de gewenste _POST variabelen nergens staan, of (bij print_r) drukt hij Array() af... Bovendien is de URL na het submitten nog steeds "http://localhost/sitenaam/login.php?page_name=index.php&page_id=10". Ik zie wel dat de hele pagina geladen wordt, en extra "echo 'hi';" commando's en dergelijke worden na het submitten wel weer gegeven.
Het is wellicht handig er bij te vermelden dat dit in zowel IE als in FF gebeurd...
Overigens gebruik ik Apache 2.0.54 als server en PHP 4.1.16. op Windows 2000.
Wat ik geprobeerd heb
- Allereerst heb ik het gehele sessie opslaan en sessie ophalen beurtelings en gelijktijdig uitgeschakeld. Dan wordt het formulier correct verstuurd maar zonder het sessie gebeuren kun je niet inloggen...
- Ik heb het onsubmit gedeelte uit het formulier gehaald terwijl de sessie afhandeling ingeschakeld was; ook nu wordt het formulier verzonden. Maar het wachtwoord wordt nu niet versleuteld en dat is nu juist niet de bedoeling (bovendien werkt het systeem dan uiteraard niet).
- Alles wat ik uit het systeem kan halen er uit gehaald om zeker te weten dat deze zaken niet de boosdoener zijn.
- Ik heb met return true geprobeerd in de onsubmit. (Dit heb ik om misverstanden te voorkomen nu ook hier toegevoegd en getest op de server; dit maakte geen verschil)
Heeft iemand enig idee waar dit mis gaat/zou kunnen gaan, en wat ik nog meer kan proberen?
Ik vindt het zeer vreemd dat twee identieke webpagina bestanden (voor de client) dan niet gelijk verstuurd worden...
[ Voor 46% gewijzigd door RwD op 21-03-2006 10:12 . Reden: Extra informatie toevoegen. functie iets veranderd. ]