Sellainen ongelma, että.
Minulla on sovellus 1 ja 2, joissa käytän samanlaista kirjautumisjärjestelmää. Liite koodina.
Jos kirjaudun kohteeseen 1 riittää minulle, että kirjoitan kohteen kaksi osoiteen ja ohitan kirjautumissivun, siirtymällä suoraan etusivulle ei minun tarvitse kirjautua kohteeseen 2 ollenkaan sillä olen jo kirjautunut kohteeseen yksi.
Kumpikin käyttää $_SESSION muuttujana samaa sanaa "log_key", eli vaihtamalla vain toiseen kirjautumiseen tuon sanan olettaisin, että näin ei enää tapahtuisi. Mutta entäpäs jos joku satunnainen heppu käyttää samaa sanaa ja sattuu sattumalta yrittämään minun ohjelmistooni. Hän pääsee sisään. Miten tämä ongelma kannattaisi korjata, jos viitsitte päätänne vaivata.
<?php require_once("config.php"); session_start(); ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <link rel="stylesheet" href="./css/index.css" type="text/css"> <head> <style type="text/css"> .nappi{ background:rgb(51,153,102); color:white; border-left:2px; border-right:1px; border-top:1px; border-bottom:2px; border-style:solid; border-color:rgb(0,102,0); } .nappi:hover{ background:rgb(51,153,102); color:yellow; border-left:1px; border-right:2px; border-top:2px; border-bottom:1px; border-style:solid; border-color:rgb(0,102,0); } </style> <title>Kirjautuminen tietokantaan</title> <?php if(!empty($_POST['tunnus']) && !empty($_POST['salasana'])){ $tunnus = get_magic_quotes_gpc() ? $_POST['tunnus'] : mysql_real_escape_string($_POST['tunnus']); $salasana = get_magic_quotes_gpc() ? $_POST['salasana'] : mysql_real_escape_string($_POST['salasana']); $salaus = 'ia8ksk3ä'.$salasana.'qhlslmw2'; $kaanteinen = strrev($salaus); $merkkijono = strlen($kaanteinen); for($i=0; $i<$merkkijono; $i++){ $koodattusalasana .= $kaanteinen[$i].$salaus[2].$salaus[3].$salaus[$i]; } $salasana = md5($koodattusalasana); $istuntotunnus = md5(uniqid(rand(), true)); $k = "UPDATE kayttajat SET istunto = '$istuntotunnus' WHERE tunnus = '$tunnus' AND salasana = '$salasana'"; if(!($t = mysql_query($k))){ echo 'tsdfsdf'; //header("location:index.php"); return; } if(mysql_affected_rows() == 1){ $_SESSION['log_key'] = $istuntotunnus; } } if(!empty($_SESSION['log_key'])){ header('location:./paasivu.php'); } ?> </head> <body> <form method="post"> <table align="center" width="40%" height="70%" border="0"> <tr> <td> <table border="0" width="100%" style="border-bottom:2px solid #339966;"> <tr> <td style="color:#339966; font-size:xx-large; text-align:right; width:45%;">Laskutusjärjestelmä</td> </tr> </table> <br /> <![if !IE]> <table border="0" align="center" class="Kirjautuminen"> <tr> <td width="180" id="d1"> Käyttäjätunnus</td> <td><input type="text" name="tunnus" size="25" maxlength="15"></td> </tr> <tr> <td width="180" id="d2">Salasana </td> <td><input type="PASSWORD" name="salasana" size="25" maxlength="15"></td> </tr> <tr> <td colspan="2"><input type="submit" class="nappi" value="Kirjaudu sisään"></td> </tr> </table> <br /> </form> <![endif]> </td> </tr> </table> </body> </html>
Eivätkös sessionit ja keksit ole sivukohtaisia?
MIB kirjoitti:
Eivätkös sessionit ja keksit ole sivukohtaisia?
Jos tarkoitat sivustokohtaisia, niin ovat. Sessiot ja keksit ovat oikein omiaan tiedon siirtämiseen sivulta toiselle. Esimerkiksi tämä ohjelmointiputka ei toimisi ollenkaan hyvin, jos evästeet olisivat sivukohtaisia. Joutuisit siis jokaisella sivulla kirjautumaan aina uudelleen, mikäli jollakin sivuston sivulla luotua keksiä ei voisia lukea käyttäjän tunnistavassa scriptissä.
Joo, ajatusvirhe. Sivustokohtaisia tarkoitin, että aloittajalla ei ole mitään hätää tuollaisen asian kanssa.
Tietenkin yksi vaihtoehto olisi, että tekisi vielä kantaan yhden kentän jossa on projektitunnus, mutta olisi mielenkiintoinen ratkaista ongelma muutenkin.
Niin toi ongelmahan ilmenee ainoastaan silloin kun sovellukset on samalla palvelimella, eikös.
Siitä en osaa minä varmuutta sanoa, sillä ei ole kuin yksi palvelin. Tuli mieleen, että eihän tuo projektitunnuskaan auta, tai no jos sille tekee vielä toisen tarkistuksen.
Jos se on yhden palvelimen ongelma niin .htaccess tunnuksellahan siitä eroon pääsee, mutta siihen en ole oikein tyytyväinen vaan haluaisin ratkaista ongelman muuten. Onko kellään ideoita?
Missä kaikki nörtit on ? :)
Siis, jos edelleen pohdit sitä, että porukka pääsee "kirjautumaan" jos on sellainen log_key sessioni/keksi, niin kannattaa huomioida, että ne ovat sivustokohtaisia.
Mitä tällä projektitunnuksella haluat, kun ymmärsin että olet huolissasi kirjautumisesta?
Eli jos minulla on sivu
www.jokusivu.com/projekti1
www.jokusivu.com/projekti2
www.jokusivu.com/projekti3
Kirjaudun projektiin yksi. Tämän jälkeen pääsen nuihin kaikkiin muihin kuin varkain. Sen haluaisin estää.
$k = "UPDATE kayttajat SET istunto = '$istuntotunnus' WHERE tunnus = '$tunnus' AND salasana = '$salasana' AND projekti = '$projekti'"; if(!($t = mysql_query($k))){ echo 'tsdfsdf'; //header("location:index.php"); return; }
Eikös se silloin estyisi kun projekti määritettäisiin kaikkiin muuttujissa kiinteästi. Eli pelkkä oikea istunto ei riittäisi.
En nyt tiedä, että meneekö ihan metsään tämä ajatus, mutta yritetään.
Eikös sinne sessioniin vois laittaa vaikka muuttujan projekti. Sitten sille annetaan jokaisessa projektissa uniikki tunnus tms. Sitten voidaan aina vertailla, että jos löytyy eri niin tietysti halutaan kirjautumista, jonka jälkeen projektikohtainen tunniste uudistetaan...
Toivottavasti lukasin kyssärin oikein jne.. vähä väsy ja sillai...
Juuri tämän kaltaista vastausta hain tukemaan ajatustani.
Aihe on jo aika vanha, joten et voi enää vastata siihen.