Yritin tehdä koodivinkin avulla sisäänkirjautumisen ohjelmointiputkaan, mutta epäonnistuin. Pyydän Metabolixia tekemään korjaukset ja kommentit ohjelmaan, jotta ymmärtäisin jotain siitä cURLista. Kiitoksi etukäteen vaivasta.
<?php function kirjautuu_ohjelmointiputkaan($tunnus, $salasana) { $ch = curl_init(); curl_setopt($ch, CURLOPT_USERAGENT, "PHP"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FAILONERROR, 1); curl_setopt($ch, CURLOPT_ENCODING, ""); curl_setopt($ch, CURLOPT_COOKIESESSION, 1); curl_setopt($ch, CURLOPT_COOKIEJAR, "/dev/null"); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_REFERER, "https://www.ohjelmointiputka.net"); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array("username" => $tunnus, "password" => $salasana))); curl_setopt($ch, CURLOPT_URL, "https://www.ohjelmointiputka.net/"); $tmp = curl_exec($ch); if ($tmp === false || strpos($tmp, "Kirjautuminen epäonnistui") !== false) { $ok = false; trigger_error("Kirjautuminen epäonnistui!"); } else {echo ("Sisäänkirjautuminen onnistui!"); } curl_close($ch); return $ok; } kirjautuu_ohjelmointiputkaan("oma tunnus", "oma salasana"); ?>
Toimisikohan muuttamalla tämä:
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array("username" => $tunnus, "password" => $salasana)));
Täksi ?
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array("tunnus" => $tunnus, "salasana" => $salasana)));
En jaksa testata...
Tässä sinun nykyisessä koodissa sinä yrität kirjautua sisään lähettämällä tunnuksen ja salasanan putkan etusivulle.
Tälläinen on putkan etusivun kirjautumislomakkeen alku:
... <h2>Kirjautuminen</h2> <form action="/sisaan.php" method="post"> ...
Lomakkeen kohde on siis sivu osoitteessa https://www.ohjelmointiputka.net/sisaan.php. Tuolle sivulle sinun tulee siis lähettää kirjautumispyyntö. Muuten tuo koodi näyttäisi olevan oikein, mutta en ole testannut toimiiko.
Edit: Peran on myös oikeassa, tuota virhettä en huomannutkaan
Semmonen siitä tuli, kiitoksia avusta (hyvää harjoitusta minulle):
<?php function kirjautuu_ohjelmointiputkaan($tunnus, $salasana) { $ch = curl_init(); curl_setopt($ch, CURLOPT_USERAGENT, "PHP"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FAILONERROR, 1); curl_setopt($ch, CURLOPT_ENCODING, ""); curl_setopt($ch, CURLOPT_COOKIESESSION, 1); curl_setopt($ch, CURLOPT_COOKIEJAR, "/dev/null"); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_REFERER, "https://www.ohjelmointiputka.net/"); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array("tunnus" => $tunnus, "salasana" => $salasana))); curl_setopt($ch, CURLOPT_URL, "https://www.ohjelmointiputka.net/sisaan.php/"); $tmp = curl_exec($ch); if ($tmp === false || strpos($tmp, "Kirjautuminen epäonnistui") !== false) { $ok = false; trigger_error("Kirjautuminen epäonnistui!"); } else {echo ("Sisäänkirjautuminen onnistui!"); } curl_close($ch); return $ok; } kirjautuu_ohjelmointiputkaan("oma tunnus", "oma salasana"); ?>
Tuloksena tuli "Sisäänkirjautuminen onnistui!" Toivottavasti toimii oikein.
Nimittäin, kun kokeilin vaihta rivin
curl_setopt($ch, CURLOPT_URL, "https://www.ohjelmointiputka.net/sisaan.php/");
riviksi
curl_setopt($ch, CURLOPT_URL, "https://www.ohjelmointiputka.net/");
onnistui myös sisäänkirjautuminen ja sen lisäksi ei ollut väliä, millainen oli tunnus tai salasana, kaikki kävi - "Sisäänkirjautuminen onnistui!" viesti tuli aina.
Mod. lisäsi kooditageja!
riksu, ei tietenkään oikeasti onnistu kirjautuminen väärällä osoitteella. Tuo koodi tarkistaa ainoastaan, että sivunlataus onnistuu eikä sivulla ole tekstiä ”Kirjautuminen epäonnistui”. Tämä ei ole mikään yleispätevä tapa kirjautumisen tarkistukseen, vaan nuo ehdot on suunniteltu yhden tietyn sivuston yhtä tiettyä kirjautumissivua varten. (Vinkki: se sivusto ei ole Ohjelmointiputka, ja se sivu ei ole sivuston etusivu.) Kun olet vaihtanut koodiin väärän osoitteen, tarkistuksen tulos ei pidä paikkaansa. Sattumalta tarkistus toimii kuitenkin oikein Ohjelmointiputkan kirjautumisessa.
Tarinan opetus: Et voi kopioida koodia ja muuttaa hätäisesti paria kohtaa, vaan pitää lukea ja ymmärtää koko koodi ja muuttaa siitä kaikki olennaiset kohdat. Kun yrität muokata koodia, jota et ymmärrä, on oma syysi, jos se toimii väärin.
Kirjautumisen onnistumisen tarkistamiseen yksi keino olisi tutkia, asettaako palvelin evästeitä kirjautumisen yhteydessä. Evästeen asettaminen on yleensä merkki onnistuneesta kirjautumisesta.
Poikkeuksiakin on, monet sivustot varmasti vahingossa pyrkivät asettamaan uuden evästeen kirjautumisen epäonnistuttua, ja monet varmasti ovat luoneet session jo anonyymille käyttäjälle ja käyttävät samaa sessiota (siten myös samaa sessioevästettä) kirjautumisen jälkeenkin. Luulisin kuitenkin, että aika hyvällä prosentilla tuolla pääsee eteenpäin.
The Alchemist kirjoitti:
Kirjautumisen onnistumisen tarkistamiseen yksi keino olisi tutkia, asettaako palvelin evästeitä kirjautumisen yhteydessä. Evästeen asettaminen on yleensä merkki onnistuneesta kirjautumisesta.
Hyvä ajatus ja kiitos vinkistä. Mutta voisiko, joku ystävällisesti näyttää esimerkin evästeen käytöstä kirjautumisen tarkistamiseen? Joku koodipätkä, missä on kommentit mukana selvitystä varten. Esim. miten ja mistä eväste haetaan.
Aihe on jo aika vanha, joten et voi enää vastata siihen.