Gå til innhold

Logg inn script - nekter å fungere


Anbefalte innlegg

  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
Videoannonse
Annonse

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 av Crowly
Lenke til kommentar

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 av adeneo
  • Liker 1
Lenke til kommentar

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 av Debutanten
Lenke til kommentar

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

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

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...