Jag har en applikation med en inloggningsfunktion, där anv.namn och lösen anges i två inputfält och sedan skickas vidare till en servlet (för att kontrollera om användaren är behörig). Är användaren behörig skickas han/hon vidare till en annan sida. En sessionsvariabel sätts också, för att hålla reda på användaren.
När användaren sedan loggar ut, tas sessionsvariabeln bort och användaren skickas till startsidan igen.
Nu till mitt problem: Använder man "Bakåt-knappen" kan man gå bakåt till sidan som besökaren först kommer till, efter inloggning. Då dyker följande text upp:
Varning! Sidan gäller inte längre. Sidan som du begärde skapades med hjälp av informationen i ett formulär som du skickade. Den här sidan finns inte längre tillgänglig. Som en säkerhetsåtgärd kommer informationen inte automatiskt att skickas igen.
Om du vill skicka informationen igen och visa den här webbsidan klickar du på knappen Uppdatera.
Klickar man på uppdatera, så verkar anv.namn och lösen skickas till servleten igen och användaren loggas in! Inte speciellt säkert m.a.o. :(
Finns det något sätt att undvika detta? Jag vill ju inte att man skall kunna logga in igen, bara genom att använda bakåtknappen!
Eftersom det du gör när du går "bakåt" i din webläsare är att ställa exakt samma request en gång till (med parametrar och allt) så är det lite lurigt.
Det du kan göra för att säkra upp lite är följande:
På sidan där man skriver lösenordet. Sätt en sessionsvariabel (mayLogin) till true. Kolla sedan om denna är satt i servleten. Är den inte det, skicka användaren tillbaka (då denna inte kom från den sidan). Logga sedan in användaren och sätt mayLogin variabeln till false
Eftersom sessionen INTE skickas med så kommer nu back inte att fungera för att logga in. Dock kan man ju läsa av innehållet i requesten lokalt, ta ut lösenordet och på så vis logga in igen, men då har du helt plötsligt lite mer avancerade användare.
För "säkerheten" ovan MÅSTE man dock logga in via ditt formulär, eller en sida på servern som sätter sessionsvariabeln till true innan man loggar in.
Grejen är ju den att användaren hamnar på sidan för inloggning (d.v.s. startsidan), när han/hon blir utloggad.
Det som då händer är att sessionsvariabeln (mayLogin) sätts till true. När användaren sedan trycker på Tillbaka-knappen och kommer till det ställe där han/hon uppmanas att uppdatera sidan, så är ju variabeln redan satt till true och inloggningen kan ske ändå.
Skit också!!! :)
Finns det inte någon som har löst detta på något bra sätt??
Du kan ju göra på ett annat sätt också...
Lägg till ett "hidden" field på inloggningen med ett datum/tid fält. Om X antal sekunder förflutit så får man inte logga in.
det ända sättet att få bort uppdatera sidan är att ha kontroller... går inte att inaktivera det hos klienten... eftersom det är klientprogramvaran som skickar en http request, kan du som server aldrig bestämma vem eller vad som skickar vad.. man kan ju skicka det från telnet t.ex.
En reload skulle då betyda att du skickade samma sak 2 ggr.
Jag byggde vidare på Jaar´s förslag och löste problemet!!
På inloggningssidan skickade jag med användarens sessionsid tillsammmans med login och lösen.
När användaren sedan loggade ut, förstörde jag sessionen. På så sätt får användaren automatiskt ett nytt sessionsid. I själva inloggningsfunktionen (som tar emot sessionsid, login och lösen)jämförde jag det sessionsid som skickats med loginformuläret med användarens aktuella sessionsid. Om det inte överensstämmde så skickade jag användaren till en error-sida istället.
På så sätt kan man inte använda bakåtknappen och använda data i ett gammalt request (eftersom sessionsid:t inte längre överensstämmer med det nya)
Hahaha.... Där fick jag allt till det!! :)
255 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849