Olen tehnyt kirjautumis systeemin sivuilleni mutta se ei vaan jostain syystä lähde vörkkimään. Käyttäjätunnukset ja salasanat salasanankäsittelijä hakee sql-kannasta. Osaisiko joku neuvoa mikä koodissani mättää.
kirjaudu.php koodi:
<?php <h3 align="center">Kirjautuminen</h3> <form name="form2" method="post" action="salakasittelija.php"> <table width="250" border="0" align="center" background="kuvat/tausta.jpg"> <tr background="kuvat/tausta.jpg"> <td width="146"><div align="center">Tunnus</div></td> <td width="144"><div align="center">Salasana</div></td> </tr> <tr background="kuvat/tausta.jpg"> <td><div align="center"> <input name="tunnus" type="text" id="tunnus" size="20"> </div></td> <td><div align="center"> <input name="salasana" type="password" id="salasana" size="20"> </div></td> </tr> <tr background="kuvat/tausta.jpg"> <td colspan="2"><div align="center"> <input type="submit" name="Submit" value="Kirjaudu sisään"> </div></td> </tr> </table> </form> ?>
salakasittelija.php koodi:
<?php $yhteys=mysql_connect("localhost","","") or die ("Tietokantayhteyttä ei voitu avata"); mysql_select_db("***") or die ("Tietokantaa ei voitu avata"); $kysely=mysql_query("SELECT salasana FROM tunnukset WHERE tunnus='$tunnus'"); $rivi=mysql_fetch_row($kysely); $oikea=($rivi[0]); if ($salasana==$oikea) { session_register("tunnus"); $_SESSION["tunnus"]="$tunnus"; $_SESSION["salasana"]="$salasana"; setcookie("evaste",$_POST['tunnus'];()+60*1) // luodaan eväste 1 minuutiksitime echo("<html>\n<head>\n"); echo("<meta http-equiv=\"Refresh\" content=\"0;url=****\index.php\">\n"); echo("</head>\n</html>"); } else { print "Väärä tunnus tai salasana!!"; } ?>
Jos palvelimella on register globals off (toivottavasti) niin joudut tuolla salakasittelija.php:n alussa ottamaan nuo lähetetyt arvot tyyliin:
$tunnus = $_POST['tunnus']; $salasana = $_POST['salasana'];
Lisäksi kannattaa tutkia onko noita arvoja edes lähetetty (if isset), jolloin tietokantakyselyä ei tarvi suorittaa.
Niin ja se perustietoturva:
$tunnus = mysql_real_escape_string($_POST['tunnus]);
Ja jos on magic_quotes_gpc päällä, niin silloin
$tunnus = mysql_real_escape_string(stripslashes($_POST['tunnus]));
niin ei pääse käyttäjä vahingossakaan ajamaan omia lauseitaan tietokantaan.
Muutenkin kyllä miettisin uudestaan, mitä sinne sessioon tallentaa. Jos tallennat sinne tunnus/salasana-parin tuollaisenaan, saattaa niitä päästä suht helpostikkin lueskelemaan serveriltä. Eli kirjautumisen yhteydessä luot sessiotunnuksen (esim unqid()) ja tallennat sen kantaan ja saman sessiotunnuksen laitat sessioon. Sen jälkeen jokaisella sivunlatauksella tarkistat löytyykö sessiota ja jos löytyy, niin löytyykö se myös kannasta.
Tietoturvaan vielä jatkoa sen verran että salasanatkin kannattanee tallentaan kantaan salattuna (esim. MD5).
kasetti kirjoitti:
Tietoturvaan vielä jatkoa sen verran että salasanatkin kannattanee tallentaan kantaan salattuna (esim. MD5).
Niin ajattelinkin toteuttaa...
Kannattaisi ehkä lukea uudestaan joku tutoriaali jossa käsitellään html:än upottamista php:hen. :P
Eli toisin sanoen, kirjaudu.php:stä php-tagit pois HTML:n ympäriltä, koska se on HTML:ää eikä PHP:tä.
Metabolix kirjoitti:
Eli toisin sanoen, kirjaudu.php:stä php-tagit pois HTML:n ympäriltä, koska se on HTML:ää eikä PHP:tä.
No eipä ne ole koodissa!!! Lisäsin ne vaan tänne foorumiin et toi koodi näyttäis järkevämmältä...
<h3 align="center">Kirjautuminen</h3> <form name="form2" method="post" action="salakasittelija.php"> <table width="250" border="0" align="center" background="kuvat/tausta.jpg"> <tr background="kuvat/tausta.jpg"> <td width="146"><div align="center">Tunnus</div></td> <td width="144"><div align="center">Salasana</div></td> </tr> <tr background="kuvat/tausta.jpg"> <td><div align="center"> <input name="tunnus" type="text" id="tunnus" size="20"> </div></td> <td><div align="center"> <input name="salasana" type="password" id="salasana" size="20"> </div></td> </tr> <tr background="kuvat/tausta.jpg"> <td colspan="2"><div align="center"> <input type="submit" name="Submit" value="Kirjaudu sisään"> </div></td> </tr> </table> </form>
ONKS NYT HYVÄ!?
Nyt taitaa jollakulla olla hieman väärä asenne.
Ei nyt kannata ruveta tuollaisesta asiasta meuhkaamaan, mutta kieltämättä php-väritys kävisi kyllä HTML:äänkin. Värityksestä voisi poistaa vaatimuksen, että koodi on oltava tagien sisällä.
No ei nii... :)
No selvisikö ongelma? Kerro toki hieman tarkemmin mikä tuossa ei toimi.
ajv kirjoitti:
No selvisikö ongelma? Kerro toki hieman tarkemmin mikä tuossa ei toimi.
No en oikein tiedä... evästeen asettamisen riville parse errori tulee...
rivi 15 ainakin näyttää tältä
setcookie("evaste",$_POST['tunnus'];()+60*1) // luodaan eväste 1 minuutiksitime
eli katsopas missä tuo puolipiste on!
Ja mitkä ihmeen tyhjät sulut tuossa samassa on?
Metabolix kirjoitti:
Ja mitkä ihmeen tyhjät sulut tuossa samassa on?
Joo siitä oli jäänyt time funktio pois ja puolipiste väärässä paikassa... mut ei kyl toimi vieläkään. Muutin rivin seuraavanlaisesti:
Ainakin olet käyttänyt sessioneita vaikka session_start() puuttuu..
ipe kirjoitti:
Ainakin olet käyttänyt sessioneita vaikka session_start() puuttuu..
Minne toi session_start() komento laitetaan? Tai siis mihin kohtaan...
Nyt mun mielestä tossa on kaikki oikein mut ei toimi vieläkään... heh...
<?php session_start(); $_SESSION["tunnus"]="$tunnus"; $_SESSION["salasana"]="$salasana"; setcookie("evaste",$_POST["$tunnus"],time()+ 60 * 1); // luodaan eväste 1 minuutiksitime echo("<html>\n<head>\n"); echo("<meta http-equiv=\"Refresh\" content=\"0;url=index.php\">\n"); echo("</head>\n</html>"); ?>
Kokeilepa näin (register_globals pois päältä, uudelleenohjaus headerilla)
<?php session_start(); $_SESSION["tunnus"] = $_POST['tunnus']; $_SESSION["salasana"] = $_POST['salasana']; setcookie("evaste",$_POST['tunnus'],time()+ 60); // luodaan eväste 1 minuutiksi header("Location: index.php"); ?>
Vinkki: Tutustu $_GETin ja $_POSTin saloihin tarkemmin, $_POST["$tunnus"] hakisi kenttää nimeltä $tunnus, $_POST["tunnus"] kenttää nimeltä tunnus.
[fiilausta]
mutta eikös php käsittele lainausmerkkien ( " ) sisällä dollarialkuiset tekstit saman nimisinä muuttujina ;)
Taas hipsujen ( ' ) sisällä dollarimerkki tulostuu.
[/fiilausta]
Muista sitten kryptata salasanat ennen tallentamista sessioneihin mahdollisten tietoturva-aukkojen takia.
Eli mieluummin
function salaa($txt){ return sha1("avain".$txt).md5("avain".$txt); }
$_SESSION["tunnus"] = $_POST['tunnus']; $_SESSION["salasana"] = salaa($_POST['salasana']);
Lebe80 kirjoitti:
mutta eikös php käsittele lainausmerkkien ( " ) sisällä dollarialkuiset tekstit saman nimisinä muuttujina ;)
Kyllä, mutta on nopeampaa ja selkeämpää laittaa nuo suoraan kuin ruveta parsimaan niitä. Ihmettelen, miksi monet kokeneetkin koodarit laittavat $foo = "$bar";
jarspa kirjoitti:
ipe kirjoitti:
Ainakin olet käyttänyt sessioneita vaikka session_start() puuttuu..
Minne toi session_start() komento laitetaan? Tai siis mihin kohtaan...
Lueppa vaikka ihan tän putkan opas sessiosta. Ite käytän nyrkkisääntöä, että session_start() aina ylimmäksi. En sitten tiedä onko se aina ihan viisasta, mutta ainakin toiminut on :P
joo luin ja nyt toimii kaikki niinku pitää...
Juice kirjoitti:
<?php session_start(); $_SESSION["tunnus"] = $_POST['tunnus'];
Miksikäs tuossa käytetään $_SESSIONissa indeksissä " ja $_POSTissa '?;) Juu itteki ihmettelen aina $foo = "$bar";
No, tuo $_SESSION["tunnus"] oli valmiina, oma tapani on laittaa hipsuilla, koska siitä saa hyvän mielen, koska tietää niiden olevan pari millisekuntia nopeampia, jos sitäkään :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.