[PHP of Javascript] Formulier kan niet gepost worden

Pagina: 1
Acties:
  • 105 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • RwD
  • Registratie: Oktober 2000
  • Niet online

RwD

kloonikoon

Topicstarter
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.
HTML:
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>
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 ;)).

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
  1. 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...
  2. 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).
  3. Alles wat ik uit het systeem kan halen er uit gehaald om zeker te weten dat deze zaken niet de boosdoener zijn.
  4. 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)
Help mij!
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. ]


Acties:
  • 0 Henk 'm!

  • Psychokiller
  • Registratie: Oktober 2001
  • Niet online
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.
Submit je je form uberhaubt wel, of link je de gebruiker met een header() of wat dan ook naar de andere lokatie ?
Je zegt daar de gebruiker naar een andere url te sturen, maar volgens mij maak je verder geen gebruik van je formulier, en blijft de POST dus logischerwijs inderdaad leeg.

[ Voor 4% gewijzigd door Psychokiller op 20-03-2006 13:43 . Reden: Quoten blijft lastig :p ]


Acties:
  • 0 Henk 'm!

  • RwD
  • Registratie: Oktober 2000
  • Niet online

RwD

kloonikoon

Topicstarter
Als ik op de input submit druk, dan wordt het onsubmit event afgewerkt en ik neem aan dat er daarna daadwerkelijk een submit volgt. Ik weet niet precies wat je bedoelt, want alle code voor het clientgedeelte staat daarboven, ik doe geen aparte redirects met javascript ofzo... En ik controleer meteen in de eerste regel van login.php wat de inhoud van $_POST is en die blijft leeg. Geen redirect...

Wat ik gedaan heb om te testen is namelijk nadat de pagina geladen is login.php aanpassen zodat het enige dat er in staat <?php print_r($_POST);?> is. Als ik dan submit weet ik zeker dat er geen gekke dingen meer serverside gebeuren mbt de inhoud van het inlogscript zelf...

[ Voor 43% gewijzigd door RwD op 20-03-2006 13:49 ]


Acties:
  • 0 Henk 'm!

Verwijderd

http://www.htmlcodetutorial.com/forms/_FORM_onSubmit.html

Lees ff hoe de onsubmit werkt :) Als je die op een verkeerde manier gebruikt, wordt het geheel niet gesubmit...

Acties:
  • 0 Henk 'm!

  • Psychokiller
  • Registratie: Oktober 2001
  • Niet online
Ah ok, ik miste even wat met lezen, excuses :)
Heb hem zelf even online getest en hier werkte dezelfde code wel.
Volgens de pagina van Boland moet je echter nog wel een return true; doen in je fnBuildResponse().
Op de een of andere manier geeft deze lokaal altijd false terug bij jou blijkbaar.
RwD schreef op maandag 20 maart 2006 @ 14:01:
Ik zal even toevoegen dat ik met een "return true" geprobeerd heb, maar dit maakt geen verschil omdat zonder dat gedeelte het wel werkt als ik het sessiegedeelte uitschakel...

Daarom vindt ik dit zo vaag; zonder onsubmit werkt het; zonder sessiebestand op te slaan werkt het ook...
Edit: Hmm, dan moet het haast wel een of andere lokale setting zijn denk ik ?
Aangezien het verder online gewoon werkt hiero, en er verder inderdaad geen echt gekke code te zien is.

[ Voor 48% gewijzigd door Psychokiller op 20-03-2006 14:05 ]


Acties:
  • 0 Henk 'm!

  • RwD
  • Registratie: Oktober 2000
  • Niet online

RwD

kloonikoon

Topicstarter
Ik zal even toevoegen dat ik met een "return true" geprobeerd heb, maar dit maakt geen verschil omdat zonder dat gedeelte het wel werkt als ik het sessiegedeelte uitschakel...

Daarom vindt ik dit zo vaag; zonder onsubmit werkt het; zonder sessiebestand op te slaan werkt het ook...

Acties:
  • 0 Henk 'm!

Verwijderd

code:
1
onsubmit="fnBuildResponse('login_response', 'login_pwd', 'login_challenge'); return true"

Werkt dus niet? Alleen met onsubmit werkt het niet en aan die sessies ligt het volgens mij niet (het ligt aan het submitten...), dus je moet daar ff goed naar kijken :)

Krijg je ook geen javascript warnings?

Acties:
  • 0 Henk 'm!

  • RwD
  • Registratie: Oktober 2000
  • Niet online

RwD

kloonikoon

Topicstarter
Verwijderd schreef op maandag 20 maart 2006 @ 14:03:
code:
1
onsubmit="fnBuildResponse('login_response', 'login_pwd', 'login_challenge'); return true"

Werkt dus niet?
Nee, dat maakt helaas geen enkel verschil. Ik heb de topicstart aangepast zodat return true er bij staat zodat hier niet meer naar gevraagd hoeft te worden.
Alleen met onsubmit werkt het niet en aan die sessies ligt het volgens mij niet (het ligt aan het submitten...), dus je moet daar ff goed naar kijken :)
Verklaar mij dan waarom ik twee identieke bestanden ontvang aan de clientside met en zonder de sessie klasse. Maar dat als de sessieklasse uitgeschakeld was tijdens de generatie van die pagina het geheel wel gesubmit wordt bij een druk op de knop en anders niet...
Krijg je ook geen javascript warnings?
Nee, FF en IE geven niet aan fouten of problemen te zien...

Acties:
  • 0 Henk 'm!

  • RwD
  • Registratie: Oktober 2000
  • Niet online

RwD

kloonikoon

Topicstarter
Nu bijna een dag later, en ik ben echt helemaal niks opgeschoten, het is een vreemde fout die ik op drie verschillende computers met 2 (enigzins) verschillende OS-en (win2000 en winXP) met apache server en twee verschillende browsers altijd die fout opleveren. Voor zover ik kan nagaan met de developer toolbars zijn er geen vreemde zaken aanwezig, en wordt de submit wel uitgevoerd, wat er achter de schermen gebeurd is me een raadsel, wellicht moet ik eens een extra veld toevoegen voor een bestandje, zien of het geupload wordt :?

Acties:
  • 0 Henk 'm!

  • RwD
  • Registratie: Oktober 2000
  • Niet online

RwD

kloonikoon

Topicstarter
Ik heb om het te proberen er een bestandsinvoerveld aan toegevoegd, als volgt:
HTML:
1
2
3
<form id="loginForm" method="post" action="login.php" enctype="multipart/form-data" onsubmit="return fnBuildResponse('login_response', 'login_pwd', 'login_challenge');">
...
    <input type="file" name="thefile">
Als ik dan nu een 5Mb bestand er aan vasthang kan ik zien (naar een externe server) dat er voor ongeveer 5Mb aan gegevens verzonden wordt (klopt best aardig). Maar als ik de $_FILES en $_POST variabelen bekijk zijn beide nog steeds leeg. De url verspringt in dit voorbeeld wel bij het 5Mb bestand, bij een bestand van een paar Kb veranderd de url ook niet.

Hoezo vreemd :Y)

Acties:
  • 0 Henk 'm!

  • RwD
  • Registratie: Oktober 2000
  • Niet online

RwD

kloonikoon

Topicstarter
En vanaf 10 uur en 20 minuten vandaag, zonder enige vorm van code verder aangepast te hebben en zonder enige aankondiging werkt het wel. Na een herstart nog steeds. Nu is dus het punt waarop ik erg graag wil weten wat er mis ging. Want dit mag als de site weer in gebruik is natuurlijk niet zomaar voorkomen.
Klant/Koning: Ik kan niet inloggen
Ik: Ja, het systeem voelt zich soms niet zo lekker, maar het zal met een dag of twee wel weer beter zijn.
Ik zie het zo gebeuren :+

Overigens heb ik nadat het weer werkte het bestandsinvoerveld weer verwijderd inclusief het enctype attribuut, ook daarna bleef het werken...

edit
Einde van dit topic; Ik heb gevonden dat het vergeten van een dollarteken in je sessieobject weliswaar kan leiden tot correct uitziende resultaten, maar dat de werking toch wel beinvloed kan worden. Even kort: de sessievariabele die bepaald of je ingelogd bent of niet werd onterecht aangepast na het inloggen wat op de bveiligde pagina een redirect veroorzaakte. Bij de redirect wordt natuurlijk geen _POST mee gestuurd en het leek alsof er niks gebeurde. Ik kan ook verklaren waarom het weglaten van het onsubmit gedeelte wel leek te werken; er werd dan niet ingelogd dus trad het hele probleem niet op, dus leek het dan wel te werken. (En ondertussen dacht ik "ja ok, zonder javascript werkt het systeem niet; inloggen is dan niet mogelijk. Maar het doet wel meer dan anders")

Als iemand het al wil doen, ik was je voor: 8)7

[ Voor 81% gewijzigd door RwD op 21-03-2006 11:05 ]


Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

In je online voorbeeldje, word volgens mij de password niet goed afgevangen, als je middels print_r($_POST) uitpoept, blijft het veld van pwd leeg? :?

Lijkt me namelijk niet de bedoeling ;)

[ Voor 16% gewijzigd door CH4OS op 21-03-2006 14:55 ]


Acties:
  • 0 Henk 'm!

  • RwD
  • Registratie: Oktober 2000
  • Niet online

RwD

kloonikoon

Topicstarter
GJ-tje schreef op dinsdag 21 maart 2006 @ 14:55:
In je online voorbeeldje, word volgens mij de password niet goed afgevangen, als je middels print_r($_POST) uitpoept, blijft het veld van pwd leeg? :?

Lijkt me namelijk niet de bedoeling ;)
Ik weet niet waar je precies op doelt, maar het wachtwoord veld wordt leeg gemaakt voor het versturen, dit wordt samen met de challenge verwerkt tot een response welke open en bloot verzonden wordt. De server kent de challenge en het wachtwoord en doet hetzelfde. Als de server op dezelfde string komt als de response dan neemt de server aan dat het juiste wachtwoord gebruikt was om de response te genereren. Lijkt me prima in orde.

Dus als ik in de _POST kijk blijft het pwd veld leeg..
Pagina: 1