Pitäis saada sivujen kirjautuminen toimii niin että kun rekisteröityessä nimeksi on pistetty vaikka Xuvo niin sitten kun kirjautuu niin nimenä toimisi vaikka xUvo
Tällä hetkellä ei suostu toimimaan noin.
Eli siis pitäisi muuttaa ensimmäinen kirjain pieneksi ja toinen isoksi, sitäkö haet takaa?
Ilmeisesti haettiin takaa sitä, että tunnuksen kirjainkoolla ei ole väliä kirjautumisessa. Käytä funktiota strcasecmp.
Vertaat vain onko kummankin muuttujan ("oikea login-nimi" ja käyttäjän antama arvo) strtolower()-arvot samat.
Juuri tuota tarkoitin mitä olga sanoi mutta ensaanut sitä toimimaan
Miksei se toimi? Missä kohtaa menee pieleen?
Kirjautuminen ei toimi jos laittaa tunnukseksi suominen90.
Rekisteröityessä laitoin Suominen90.
Kokeilin myös tota Leben ehdotusta muttei toiminut silläkään.
Pitää jatkaa kokeiluja
Xuvo kirjoitti:
Kirjautuminen ei toimi jos laittaa tunnukseksi suominen90.
Rekisteröityessä laitoin Suominen90.
Kokeilin myös tota Leben ehdotusta muttei toiminut silläkään.
Pitää jatkaa kokeiluja
Kyllä se toimii jos sen oikein teet. Sinulla on nyt vaan joku virhe koodissa.
Kokeile debugata eli laajenna koodia aina vaikkapa rivi kerrallaan, ja tutki esim. echon avulla muuttujien arvoja ja katso, mihin asti kaikki toimii, kuten pitää.
Tohon koodin vois joku kokeilla soveltaa.
<?php $user_dir="usr/kayttajat.txt"; // Rekistereröityneet käyttäjät $login="stat/login/"; // Kirjautuneet-hakemisto $salasana=$_POST['salasana']; $nimi=$_POST['nimi']; if($_POST["submit"]) { $fs=file($user_dir); for ($i=0;$i<count($fs);$i++) { if (substr_count($fs[$i],$_POST['nimi'])<>0) { $str=explode("|",$fs[$i]); $kirj=md5($_POST['salasana']); // Verrataan annettua tunnusta muistissa olevaa if ($_POST['nimi']==$str[0] && $kirj==trim($str[1])) { // luodaan kirjautunut-tiedosto if(!file_exists($login.$_POST['nimi'])) { touch($login.$_POST['nimi']); } // Lisätään tieto kirjautumisesta kaynnit.txt tiedostoon $lisaa=fopen("kaynnit.txt" ,"a"); fwrite($lisaa, "".date("d.m.y H:i:s")."|".$_POST['nimi'].""."\r\n"); fclose($lisaa); // Tehdään eväste $_SESSION["nimi"]=$nimi; $_SESSION["salasana"]=$salasana; setcookie($cookie3,$nimi,time()+86400)or die("Virhe"); // luodaan eväste vuorokaudeksi // Ohjataan omalle sivulle header("location:index.php?sivu=omasivu"); } else { echo $lg[115]; return; } } } } ?>
Xuvo kirjoitti:
Tohon koodin vois joku kokeilla soveltaa.
if (strtolower($_POST['nimi'])==strtolower($str[0]) && $kirj==trim($str[1]))
mauza kirjoitti:
Xuvo kirjoitti:
Tohon koodin vois joku kokeilla soveltaa.
if (strtolower($_POST['nimi'])==strtolower($str[0]) && $kirj==trim($str[1]))
Tuota on kokeiltu
Oletko kokeillut sitä debugausta? Pistä sinne pari echoa, jotka tulostavat kaikkien muuttujien arvot ja lisäksi noiden trim- ja strtolower-funktioiden palauttamat arvot, niin sitten näet niistä arvoista, että onko vika niissä, vai jossain muualla.
Substr taitaa olla case-sensitive, joten edellä mainitun muutoksen lisäksi rivi
if (substr_count($fs[$i],$_POST['nimi'])<>0)
muotoon
Eikun nimenomaan !==. Se kun on eri asia kuin !=. Pidempi versio vertailee identtisyyttä (myös muuttujien tyypit pitää olla samat), lyhyt vain yhtäläisyyttä.
Esim. 0 == false on tosi, mutta 0 === false epätosi.
Jaa.Taidanpa sitten poistaa tuon viestin :)
Kokeilin näin
echo strtolower($_POST['nimi'])."<br/>"; echo strtolower($str[0])."<br/>";
Kirjauduin sisään tunnuksella Suominen90 joka on sama jonka annoin rekisteröinnissä ja toi sano
suominen90
suominen90
ja kirjautui sisään mutta kun kokeilin kirjautua nimellä suominen90 niin ei onnistunu
vinkkinä vielä
$kirj=md5($_POST['salasana']);
ei ole "turvallinen" salauskeino
md5 ei ole salaus-algoritmi vaan ns. hash-algoritmi. md5:n pystyy "avaamaan", koska kahdella eri alkuarvolla pystyy olemaan sama md5-summa.
Käytä esim. sha1:stä, tai kehitä oma salaus-funktio, jota käytät tuon md5:n tilalla.
tai sitten sijoitat mukaan muutakin kuin pelkän salasanan, sillä esim. tyhjä (null) arvo palauttaa md5:lla aina tietyn hashin, jolloin pelkkien hash-arvojen perusteella saa helposti selville kaikkien käyttäjien salasanat (netti pullollaan ilmaisia md5-purkajia, joilla saa kaivettua salasanat esiin hash-arvon perusteella.
esim.
function Salaus($salasana){ $palauta = sha1("avainsana".$salasana.md5($salasana."avainsana2")); // tai pelkkä md5-summa // tosin, on vielä "avattavissa", mutta ei palauta pelkkää md5-hashia // $palauta = md5("avainsana".$salasana.md5($salasana."avainsana2")); return $palauta; } .... .... $salasana = Salaus($_POST['salasana'])
Lebe tota on kyl nyt aika vaikeeta alkaa muokkaamaan kun käyttäjiä on 377
Xuvo kirjoitti:
Kirjauduin sisään tunnuksella Suominen90 joka on sama jonka annoin rekisteröinnissä ja toi sano
suominen90
suominen90
Siinä tapauksessa mukana saattaa olla whitespace-merkkejä, jotka eivät näy tekstissä. Jommankumman sanan perässä saattaa olla esim. välilyönti. Käytäpä trim-funktiota noihin ja vertaa sitten.
Edit: Jos tämäkään ei auta, niin silloin vika voi olla tuon &&:n toisella puolella.
Lebe80 kirjoitti:
md5:n pystyy "avaamaan", koska kahdella eri alkuarvolla pystyy olemaan sama md5-summa.
Kahdella eri merkkijonolla voi kyllä olla sama md5-summa, mutta ei se suinkaan ole syynä siihen, että md5-hashin voi arvata. Arvailussa voidaan päätyä oikeaan alkuperäiseen merkkijonoon yhtä hyvin kuin uuteen merkkijonoon, josta tulee sama md5-hashi. Ja sha1 on myös hash-algoritmi, käytä vaikka cryptiä. Ja kuinka tuota md5-hashin brute forcettamista sitten oikeasti hyödynnetään? Jatkuvat arvauskyselyt servuille eivät kuulosta järkevältä, ja jos vaikka kannassa oleviin hasheihin pääsee käsiksi, niin vain tietyn tyyppisillä sivustoilla niiden murtamisesta on enää siinä tilanteessa hyötyä.
Koodi on nyt tollanen mutta sanoo tunnus väärin vaikka sen laittais niin kuin rekisteröityessä <?php $user_dir="usr/kayttajat.txt"; // Rekistereröityneet käyttäjät $login="stat/login/"; // Kirjautuneet-hakemisto $salasana=$_POST['salasana']; $nimi=$_POST['nimi']; if($_POST["submit"]) { $fs=file($user_dir); for ($i=0;$i<count($fs);$i++) { if (substr_count($fs[$i],strtolower(trim($_POST['nimi'])))<>0) { $str=explode("|",$fs[$i]); $kirj=md5($_POST['salasana']); // Verrataan annettua tunnusta muistissa olevaa if (strtolower(trim($_POST['nimi']))==strtolower(trim($str[0])) && $kirj==trim($str[1])) { // luodaan kirjautunut-tiedosto if(!file_exists($login.$_POST['nimi'])) { touch($login.$_POST['nimi']); } // Lisätään tieto kirjautumisesta kaynnit.txt tiedostoon $lisaa=fopen("kaynnit.txt" ,"a"); fwrite($lisaa, "".date("d.m.y H:i:s")."|".$_POST['nimi'].""."\r\n"); fclose($lisaa); // Tehdään eväste $_SESSION["nimi"]=$nimi; $_SESSION["salasana"]=$salasana; setcookie($cookie3,$nimi,time()+86400)or die("Virhe"); // luodaan eväste vuorokaudeksi // Ohjataan omalle sivulle header("location:index.php?sivu=omasivu"); } else { echo $lg[115]; return; } } else { echo "Tunnus väärin"; return; } } } ?>
Antaako skripti ilmoituksen "Tunnus väärin", vai eikö kirjautuminen muuten vain toimi? Vika voi nimittäin olla sessioissa.
// Tehdään eväste $_SESSION["nimi"]=$nimi;
Tässä sessionin nimi arvoksi asetetaan POSTina tullut tunnus. Näin ollen, kun jossain kohtaa tarkistat kirjautumista (ilmeisesti muussa sivun skriptissä) on sessionissa pienellä kirjoitettu käyttäjänimi. Tällöin käyttäjää ei löydetä, kun sen olemassa oloa yritetään etsiä. Lisääppä muihinkin tiedostoihin/skripteihin nuita strtolower funktioita, niin uskoisin toimivan. Jos siis tuo ei anna tuota "Tunnus väärin"-ilmoitusta.
Se sanoo tunnus väärin
tsuriga kirjoitti:
Kahdella eri merkkijonolla voi kyllä olla sama md5-summa, mutta ei se suinkaan ole syynä siihen, että md5-hashin voi arvata. Arvailussa voidaan päätyä oikeaan alkuperäiseen merkkijonoon yhtä hyvin kuin uuteen merkkijonoon, josta tulee sama md5-hashi.
No tässähän tiedot on tallennetty vain tekstitiedostoon, jonka löytymisen jälkeen salasanojen md5-hashit on kaikkien nähtävillä.
Ja salasananhan ei tarvitse olla oikein, kun sen hash on sama kuin oikean salasanan.
Xuvo:
testaa tuota koodia, ilman salasana tarkistusta. Jotenkin tuntuu että virhe johtuukin salasanan tarkistuksesta eikä käyttäjätunnuksista.
Lebe80 kirjoitti:
Ja salasananhan ei tarvitse olla oikein, kun sen hash on sama kuin oikean salasanan.
Enkös minä tämän jo maininnut ^^'? Tarkoitin vain, että duplikaattihashien olemassaolo ei ole purkamisen mahdollistava tekijä, se vain helpottaa urakkaa. Brute forcetuksella murtuu vaikka Kiinan muuri.
Ja itse koodista:
-Vaihdapa "if (substr_count($fs[$i],strtolower(trim($_POST[
-Kuulemma kaikki selaimet eivät lähetä POST['submit'].
-Kannattaakohan tuota salasanaa laittaa sessioon? Session hijackilla sitten olisi mahdollista saada tietoon mahdollisesti käyttäjän yleissalasana (ei suositeltavaa tietysti käyttää
-Ihmeelliset sisennykset.
-PHP:n default virheilmoitukset tulostuvat käyttäjälle (ei virheentarkistusta fopenissa sun muissa).
-POSTin arvoihin viitatessa käytetään " ja ', yhtenevät merkinnät ovat hawt.
Kiitoksia kaikille avusta sain nyt ton toimimaan tolla tsurigan koodilla tosin mun piti vielä korjata monia kohtia
niin sitä vanhaa asiaa vielä... ;)
tsuriga kirjoitti:
Enkös minä tämän jo maininnut ^^'? Tarkoitin vain, että duplikaattihashien olemassaolo ei ole purkamisen mahdollistava tekijä, se vain helpottaa urakkaa.
Jeps, mutta tuossahan verrataankin pelkkiä hashejä keskenään, jolloin duplikaattihaskeillä pääsee sisään.
Mutta jos sotketaan vielä md5():n sekaan muuta kirjoitusta, ei ennalta laskettut md5-hashit toimikaan suoraan.
Brute Force onkin sitten eriasia, siksi salasanojen pitäisikin olla tarpeeksi pitkät ja sisältää ainakin numeroita ja isoja ja pieniä kirjaimia, jolloin laskeminen on paljon hitaampaa.
Aihe on jo aika vanha, joten et voi enää vastata siihen.