[js/php]secure inlog probleempje

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hee mensen, ik ben bezig met maken van een 'simpel' inlogsysteem..
Na wat lezen in topics bouw ik em als volgt op:

1. genereer serverside een random variabele x
2. sla deze op in een sessie
3. stuur formulier door naar client met variabele x
4. gebruiker typt wachtwoord in
5. genereer nu een waarde y1 dmv md5(md5(wachtwoord) + x)
6. stuur y1 terug naar server
7. server haalt wachtwoord z van gebruiker uit database - deze is
natuurlijk al als md5 opgeslagen
8. server berekent zelf y2 dmv md5(z + x)
9. als y1 == y2 dan mag de gebruiker verder, anders terug naar 1)

Dmv js heb ik nu een md5 variabele van ww+random var x. Laten we zeggen:hash.
dus hash = hex_md5(ww + randomkey);
Alleen nu moet dus ik deze variabele gebruiken in me php code. Hoe ga ik dat doen? Enige optie leek me een refresh, maar dat kan niet, want dan veranderd me sessie en dus me key...

Acties:
  • 0 Henk 'm!

  • André
  • Registratie: Maart 2002
  • Laatst online: 12-09 14:32

André

Analytics dude

Met xmlHTTP doorsturen naar PHP?

Acties:
  • 0 Henk 'm!

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 10-08 02:59

Gerco

Professional Newbie

In een hidden form variable stoppen en dan form.submit() roepen? Misschien begrijp ik je verkeerd, maar zoiets moet gewoon kunnen.

HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
<script>
  function h(p) {
    document.getElementById("hiddenvar").value = 
      md5(md5(document.getElementById("password")) + x);
    return true;
  }
</script>
<form onsubmit="h()">
  <input type="hidden" name="hiddenvar" />
  <input type="password />
  <input type="text" />
  <input type="submit" />
</form>


Uiteraard geheel ongetest en gechecked, maar iets als dit is wel het idee lijkt me.

[ Voor 116% gewijzigd door Gerco op 09-11-2004 13:13 ]

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ff duidelijker...

ik heb een js functie die aangeroepen wordt bij submit<form name="login" method="post" onsubmit="genereerKey()">:

function genereerKey()
{
hier wordt hash= hex_md5(ww + randomkey) berekend
}

vervolgens gaat ie naar :
if ($_POST['login'])
en hier wil ik dus die hash uit de js functie gaan gebruiken...

Acties:
  • 0 Henk 'm!

  • Flake
  • Registratie: Februari 2001
  • Laatst online: 01-11-2024
I see. Dat betekent dat je een <input type="hidden" name="key" value="een of andere JS procedure">, waarbij je m vervolgens via $_POST['key'] kunt uitlezen.

Ik weet niet precies hoe je dat met JS moet doen, maar jij misschien wel, dus dit is alvast een duwtje in de goede richting. IMHO is dit de enige oplossing :)

Acties:
  • 0 Henk 'm!

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 10-08 02:59

Gerco

Professional Newbie

Dat is precies wat ik hierboven heb gedaan. Je mist alleen nog de hidden form var.

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
nou, ik hoef dan niks meer met js te doen..
het vreemde is, dat als ik sleutel bekijk deze leeg is.. Hoewel ik $_SESSION['random'] bovenaan de pagina een random waarde heb gegeven....

<input type="hidden" name="sleutel" value="<? $_SESSION['random'] ?> ">

oftwel
if ($_POST['login'])
{ {
$test = $_POST['sleutel'];
echo"<script>alert($test)</script>";
blabla..
}
geeft leeg popup..

Acties:
  • 0 Henk 'm!

  • KurtDB
  • Registratie: Juni 2004
  • Laatst online: 13-09 11:55
code:
1
<input type="hidden" name="sleutel" value="<? echo $_SESSION['random']; ?>">


Niet vergeten je waarde ook te tonen. (echo dus)

[ Voor 23% gewijzigd door KurtDB op 09-11-2004 13:38 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
oeps.. echo :D thnx ;)

alleen is het wel veilig om bovaan de pagina die te doen:
code:
1
$_SESSION['random']= mt_rand(100000000, 999999999);


en in de js:
code:
1
2
3
4
5
6
7
8
9
function genereerKey()
{
    ww = this.document.login.wachtwoord.value;
    randomkey = '<? echo  $_SESSION['random']  ?>';
    
    hash = hex_md5(ww + randomkey);
    alert(hash);
  
}


of kan ik beter de random key uit de hiddenfield halen? ipv randomkey = '<? echo $_SESSION['random'] ?>';

Acties:
  • 0 Henk 'm!

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 10-08 02:59

Gerco

Professional Newbie

Als je de random key uit de form gaat gebruiken ipv uit de session, loop je het risico dat iemand die key gewoon verandert naar een waarde die hij eerder heeft onderschept. Op die manier zou hij toch kunnen inloggen door een paar packets te sniffen. Het hele idee hiervan is dat dat niet meer kan :)

1. Genereer key op server
2. Genereer hash op client met key van server
3. Controleer hash op server met key van server

Als je in de laatste stap de key van de client zou gebruiken, was je hele systeem nutteloos.

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Gerco schreef op 09 november 2004 @ 14:33:
Als je de random key uit de form gaat gebruiken ipv uit de session, loop je het risico dat iemand die key gewoon verandert naar een waarde die hij eerder heeft onderschept. Op die manier zou hij toch kunnen inloggen door een paar packets te sniffen. Het hele idee hiervan is dat dat niet meer kan :)

1. Genereer key op server
2. Genereer hash op client met key van server
3. Controleer hash op server met key van server

Als je in de laatste stap de key van de client zou gebruiken, was je hele systeem nutteloos.
Thnx voor je react Gerco;)
maar ff je stappen:
1. doe ik :$_SESSION['random']= mt_rand(100000000, 999999999);
2. das de js:
code:
1
2
3
4
5
6
7
8
9
function genereerKey()
{
    ww = this.document.login.wachtwoord.value;
    randomkey = '<? echo  $_SESSION['random']  ?>';
    
    hash = hex_md5(ww + randomkey);
    this.document.login.sleutel.value =hash;
     
}
waarbij sleutel de hash waarde krijgt. Sleutel is name van hidden field.
3. controleren waarde van sleutel(uit hidden field) met waarde van pass uit db + key.

je stappen heb ik toch?

Acties:
  • 0 Henk 'm!

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 10-08 02:59

Gerco

Professional Newbie

Verwijderd schreef op 09 november 2004 @ 14:42:
3. controleren waarde van sleutel(uit hidden field) met waarde van pass uit db + key.

je stappen heb ik toch?
Zo te zien wel ja, zo lang je de 'key' uit de laatste stap maar niet uit de gePOSTte form haalt, maar uit de session of de database (serverside iig) gaat dat goed. Verder kun je misschien beter document.getElementById() gebruiken ipv document.login.blablaba aangezien die eerste vziw in alle browsers werkt en de laatste alleen in IE en browsers die IE nadoen.

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Gerco schreef op 09 november 2004 @ 14:49:
[...]

Zo te zien wel ja, zo lang je de 'key' uit de laatste stap maar niet uit de gePOSTte form haalt, maar uit de session of de database (serverside iig) gaat dat goed. Verder kun je misschien beter document.getElementById() gebruiken ipv document.login.blablaba aangezien die eerste vziw in alle browsers werkt en de laatste alleen in IE en browsers die IE nadoen.
ik zal er document.getElementById() van maken, thnx 4 tip;)

maar goed, ik gebruik dus $_SESSION['random']
van ($_SESSION['random']= mt_rand(100000000, 999999999)

alleen de hash gaat nu terug in het hiddenfield en server gaat checken of deze hash overeenkomt met md5($_SESSION['random']+wachtwoord uit DB)
Alleen dan moet in de db het ww wel als plaintext staan.. :S Heb je daar suggestie voor?

Acties:
  • 0 Henk 'm!

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 10-08 02:59

Gerco

Professional Newbie

Precies wat je zelf zegt in je topicstart. Genereer de hash zo: md5(md5(password) + key).

Kan zowel op client als server, dus dan hoef je het password van de user niet plaintext op te slaan. Je kunt eventueel nog een salt gebruiken voor het md5()'en van het password.

Als je een user specifieke salt gebruikt (de username bijv) bij het md5en van het password hebben users met hetzelfde password toch een andere md5 hash. Op die manier is het ook niet mogelijk om te zien of mensen hetzelfde password hebben indien je passwords gestolen worden. Je krijgt dan deze formule: md5(md5(password + username) + key).

Let op dat mijn opmerking over die salt hierboven weleens nutteloos zou kunnen zijn aangezien je javascript ook die salt zou moeten weten. Als dat script die salt weet, kun je die natuurlijk ook onderscheppen als attacker en dan is het wellicht nutteloos. Denk er eens over na en beslis dan of je er iets mee wilt doen.

PS. Bij het registreren van een user wil je eigenlijk ook je password veilig over de lijn sturen, maar aangezien dat niet met md5 kan (de server kent het password immers niet) moet je dat anders doen. Er zijn ook manieren om dit voor elkaar te krijgen, maar die ken ik helaas niet, ik wilde je er alleen even van bewust maken dat dit ook nog een gaatje kan zijn.

[ Voor 15% gewijzigd door Gerco op 09-11-2004 15:28 ]

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ok, thnx .. ik snap em

Van die salt is niet zo'n gek idee.. Maar zoveel gebruikers zullen er niet op de site komen, dus dan zal het wel toevallig zijn als er 2 x dezelfde pass in voor komt.. Dus ik denk ik mijn geval dat het niet nodig is

En met registreren denk ik dat dat nooit veilig kan maken.. Dan zou je SSL moeten gaan gebruiken.. Of je moet zeggen dat registreren alleen intern mag.. :)
Zoiets zal altijd plain over het netwerk gaan ... Das wel minder :(

Acties:
  • 0 Henk 'm!

  • RTBravo
  • Registratie: April 2000
  • Laatst online: 10-09 19:00

RTBravo

Verkopen jullie ook jojn?

Vraag anders ff aan Gerlofsma of ie een idee heeft ;)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
hmmm ik denk dat ik toch probleem heb.. wat jij bij punt 3 denk ik bedoelde Gerco..
Als ik submit dan veranderd blijkbaar mijn sessie en dus me random key waardoor ik niet kan inloggen :S

Acties:
  • 0 Henk 'm!

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 10-08 02:59

Gerco

Professional Newbie

Verwijderd schreef op 09 november 2004 @ 16:43:
hmmm ik denk dat ik toch probleem heb.. wat jij bij punt 3 denk ik bedoelde Gerco..
Als ik submit dan veranderd blijkbaar mijn sessie en dus me random key waardoor ik niet kan inloggen :S
Ik heb dan sterk het idee dat je die code om een random key te maken twee keer uitvoert, 1x wanneer het form opgevraagd wordt en nog een keer op het moment dat je naar hetzelfde bestand POST.

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!

Pagina: 1