Debutanten Skrevet 30. juli 2017 Del Skrevet 30. juli 2017 if(isset($_SESSION['user']) && $_SESSION['user']!=''){ ////////////////// FRONTPAGE - LOGGED IN ///////////////////////////////////////////////////////////////////////////////////////////////// include("corridor/loggedin.php"); echo '</div>'; ////////////////////////////// FRONTPAGE - NOT LOGGED IN /////////////////////////////////////////////////////////////////////////////////// }else{ if($_POST){ if(isset($_SESSION['user']) && $_SESSION['user']!=''){echo "Logget inn! Hei, $_SESSION[user]";} $email=$_POST['mail']; $password=$_POST['pass']; if(isset($_POST) && $email!='' && $password!=''){ $sqli = "SELECT * FROM users WHERE username = '$email'"; $r = mysql_fetch_assoc(mysql_query($sqli)); $p=$r['password']; $p_salt=$r['psalt']; $id=$r['id']; $site_salt="subinsblogsalt"; $salted_hash = hash('sha256',$password.$site_salt.$p_salt); if($p == $salted_hash){ $_SESSION['user'] = $id; echo' <script type="text/javascript" language="JavaScript"> setTimeout(function () { location.href = \'index.php\'; }, 0); </script> '; }else{ echo "<h2>Username/Password is Incorrect.</h2>"; } } } Av en eller annen grunn, så vil ikke det forbanna logg inn-skriptet fungere. Brukernavn og passord blir korrekt skrevet inn, men jeg får allikavel opp feilmeldingen min ("Username / Password is incorrect"). Noen idéer? Lenke til kommentar
Emancipate Skrevet 30. juli 2017 Del Skrevet 30. juli 2017 Bruk var_dump($variabel) på de forskjellige variablene, så du ser hva som går for seg. Lenke til kommentar
Crowly Skrevet 30. juli 2017 Del Skrevet 30. juli 2017 (endret) Ikke bruk mysql_* funksjonene, de er utdaterte og har blitt erstattet av mysqli_*, alternativt sjekk ut PDO. Alltid saniter og valider data fra bruker, denne koden er helt åpen for sql injections (ett veldig stort sikkerhetshull). Sjekk bl.a. filter_var() og filter_input(), oversikt og hvilke filtre som kan brukes ser du her: http://php.net/manual/en/filter.filters.php $email = filter_input(INPUT_POST, 'mail', FILTER_SANITIZE_EMAIL); // alternativt $email = filter_var($_POST['mail'], FILTER_SANITIZE_EMAIL); I det minste kjør all data fra bruker igjennom real_escape_string() Prepared statements er også nyttig for å beskytte mot sql injections: http://php.net/manual/en/mysqli.prepare.php $sql = "SELECT * FROM users WHERE username = ?"; $statment= mysqli_prepare($link, $sql); if ($statment) { mysqli_stmt_bind_param($statment, "s", $email); mysqli_stmt_execute($statment); $result = mysqli_stmt_get_result($statment); $r = mysqli_fetch_assoc($result); mysqli_stmt_free_result($result); }For å sjekke innholdet i $_SESSION og $_POST så bruk enten som nevnt var_dump(), eller print_r(), da kan du kontrollere om ting er som forventet i forhold til hva som sjekkes i if'ene echo '<pre>' . print_r($_POST, true) . '</pre>'; Dette skriver ut innholdet av $_POST på en lett lesbar måte. Pre taggene er for at line break og slikt blir vist i nettleseren. Endret 30. juli 2017 av Crowly Lenke til kommentar
Emancipate Skrevet 30. juli 2017 Del Skrevet 30. juli 2017 Godt tips over. Ved å alltid bruke prepared statements, kan du sove godt om natta. Lenke til kommentar
xibriz Skrevet 30. juli 2017 Del Skrevet 30. juli 2017 Det ser ut som at session_start mangler. Lenke til kommentar
0laf Skrevet 30. juli 2017 Del Skrevet 30. juli 2017 (endret) Huffda, kjapp gjennomgang, men noe mer som dette if(isset($_SESSION['user']) && $_SESSION['user'] !== ""){ /* FRONTPAGE - LOGGED IN */ include("corridor/loggedin.php"); echo '</div>'; }else{ /* FRONTPAGE - NOT LOGGED IN */ if( !empty($_POST) && isset($_POST['mail']) && isset($_POST['pass']) && $_POST['mail'] !== "" && $_POST['pass'] !== "") { $email = filter_var( $_POST['mail'], FILTER_SANITIZE_EMAIL); $password = filter_var( $_POST['pass'], FILTER_SANITIZE_STRING); $sqli = "SELECT * FROM `users` WHERE `username` = '$email'"; $r = mysql_fetch_assoc(mysql_query($sqli)); $p = $r['password']; $p_salt = $r['psalt']; $id = $r['id']; $site_salt = "subinsblogsalt"; $salted_hash = hash('sha256', $password.$site_salt.$p_salt); if($p === $salted_hash) { $_SESSION['user'] = $id; header('Location: /index.php'); } else { echo "<h2>Username / Password is Incorrect.</h2>"; } } else { echo "<h2>No POST data ?.</h2>"; } } Som nevnt ovenfor, bruk PDO, samt de innebygde funksjonene for hashing og salting. Endret 30. juli 2017 av adeneo 1 Lenke til kommentar
Debutanten Skrevet 30. juli 2017 Forfatter Del Skrevet 30. juli 2017 (endret) Tusen takk for gode tips, folkens! Jeg fikk både skriptet til å fungere utmerket nå, for ikke å nevne selvfølgelig bedre og tryggere. Enda flere tips og maler ville vært høyt prissatt.Jeg skjønner meg virkelig ikke på PDO Mysqli, derfor jeg egentlig har holdt meg unna det nå når jeg kom tilbake til PHP. Prøver å transportere koden min til det, men jeg får bare feilmelding på feilmelding på feilmelding. Endret 30. juli 2017 av Debutanten Lenke til kommentar
Crowly Skrevet 31. juli 2017 Del Skrevet 31. juli 2017 Det mest av mysql_* funksjonene kan erstattes med tilsvarende mysqli_*. PDO er noe annet, men greit å lære seg hvis man skal jobbe mot forskjellige databaser, da blir det meste likt og man trenger kun å endre på PDO driveren for databasen man skal jobbe mot, og evt. de forskjellene det er i SQL i mellom databasene (men man kommer langt med standard SQL). Det kan også være greit å lære seg ett rammeverk, f.eks. Laravel, da får du veldig mye ferdig. Laracasts er en god side med mange gode opplæringsvideoer (noen serier er helt eller delvis gratis). Codecourse er en annen god side. Lenke til kommentar
Crowly Skrevet 31. juli 2017 Del Skrevet 31. juli 2017 Litt eksempel kode for mysqli og PDO <?php $email = filter_input(INPUT_POST, 'mail', FILTER_SANITIZE_EMAIL); // mysqli uten prepared statment $link = new mysqli('localhost', 'my_user', 'my_password', 'my_db'); if (!$link) { return 'Db connect error'); $sql = sprintf("SELECT * FROM `users` WHERE `username` = '%s'", real_escape_string($email)); $result = mysqli_query($link, $sql); $data = $result ? mysqli_fetch_assoc($result) : []; mysqli_free_result($result); mysqli_close($link); echo '<pre>' . print_r($data, true) . '</pre>'; <?php $email = filter_input(INPUT_POST, 'mail', FILTER_SANITIZE_EMAIL); // PDO, kun objekt orientert $dns = 'mysql:dbname=testdb;host=127.0.0.1;port=3306;charset=UTF8'; $user = 'test'; $pwd = '123'; $pdo = new PDO($dns, $user, $pwd); // set default fetch mode, hvis man ikke ønsker å oppgi det hver gang som jeg har gjort under // $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); // uten prepared statment, ikke anbefalt $sql = sprintf("SELECT * FROM `users` WHERE `username` = '%s'", PDO::quote($email)); $data = $pdo->query($sql, PDO::FETCH_ASSOC); echo '<pre>' . print_r($data, true) . '</pre>'; // prepared statment med "named parameters" $sql = "SELECT * FROM `users` WHERE `username` = :username"; $stmt = $pdo->prepare($sql); // klargjør sql // Alt. 1: bind parameter direkte i execute $stmt->execute([':username' => $email]); // kjør spørring med data, hvor :username erstattet med $email // Alt. 2: bind parameter med egen metode // $stmt->bindParam(':username', $email, PDO::PARAM_STR); // $stmt->execute(); $data = $stmt->fetchAll(PDO::FETCH_ASSOC); echo '<pre>' . print_r($data, true) . '</pre>'; <?php $dns = 'mysql:dbname=testdb;host=127.0.0.1;port=3306;charset=UTF8'; $user = 'test'; $pwd = '123'; $pdo = new PDO($dns, $user, $pwd); // en kjekk sak med bindParam() siden variabler blir "bind by reference" $sql = "SELECT * FROM `users` WHERE `id` = :userID"; $stmt = $pdo->prepare($sql); $id = null; // trenger bare gjøre dette en gang, når $id endrer verdi så blir spørringen også oppdatert (ikke 100% nøyaktig, men godt nok for dette eksemplet) $stmt->bindParam(':userID', $id, PDO::PARAM_INT); $testData = [1,2,3,4,5,6,7]; echo '<pre>'; foreach ($testData as $value) { // kjør 7 spørringer $id = $value; // utfør spørring if (!$stmt->execute()) { echo 'SQL feil'; continue; } $row = $stmt->fetch(PDO::FETCH_ASSOC); print_r($row); } echo '</pre>'; Lenke til kommentar
Debutanten Skrevet 1. august 2017 Forfatter Del Skrevet 1. august 2017 Mange takk! Blir spennende å lære mer om dette kule språket.På den annen side - hva er grunnen til at mysqli og PDO er nå å anbefale? Er det fordi det er nyere og bedre og sikrere? Og mine gamle koder med PHP - burde jeg skrive alt om igjen? Eller vil jeg fortsatt kunne holde gamle sider relativt sikker med bruken av å sjekke inputs, escape strings etc?Takk for svar! Lenke til kommentar
xibriz Skrevet 1. august 2017 Del Skrevet 1. august 2017 Mysql biblioteket er deprecated så med mindre du vil kjøre på utdaterte servere vil det stoppe opp en dag. Men så lenge man escaper korrekt så er man trygg. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå