Wątek przeniesiony 2015-04-21 15:10 z PHP przez dzek69.

Potwierdzenie rejestracji w mailu

0

Mam pewien problem z kodem, a mianowicie napisałem skrypt formularza rejestracji. Po rejestracji konta na adres e-mail przychodzi wiadomość z linkiem aktywacyjnym, ale przed wejściem w link można spokojnie zalogować się na konto z dostępem do zasobów użytkownika. Poniżej plik register.php oraz login.php Proszę o jakieś sugestue.

<?php

            echo '<legend>Logownie do konta</legend>';

if($_SESSION['zalogowany_mastercooks'] == "TAK"){           
            ?>

    <form action="" method="post" id="rejestracja_form" autocomplete="off">
        <ul style="list-style-type: none;">
            <li><input type="text" name="login_l" id="login_l" placeholder="Login" style="width: 172px; margin-left: -11px;"/></li>
            <li><input type="password" name="haslo_l" id="haslo_l" placeholder="Haslo" style="width: 172px; margin-left: -11px;" /></li>
        </ul>
        <input type="hidden" name="sublogin" value="true" />
        <input class="btn" type="submit" value="Zaloguj" name="submit" style="height: 27px; margin-left: -12px; margin-top: -5px;" />
    </form>
    <?php
}
  if($_GET['logout'] == 'tak'){
      session_destroy();
      echo "<span class=\"alert alert-dismissable alert-success\" />Zostałeś pomyślnie wylogowany ze swojego konta. Za chwilę nastąpi przekierownie na stronę główną ...</span> <meta http-equiv=\"Refresh\" content=\"2; url=index.php\" />";
}
else if($user != ''){
echo "JESTEŚ ZALOGOWANY JAKO: $user";   
}
else if (!isset($_POST['sublogin']))
{

}
else {
$loginl = $_POST['login_l'];
$haslol = $_POST['haslo_l'];

if(empty($loginl) || empty($haslol)){

}
else {
    $haslol = md5($haslol);

$da = mysql_query("SELECT * FROM users WHERE MD5(nick) = MD5('$loginl') AND haslo='$haslol'");
$ilewpisow = mysql_num_rows($da);

if($ilewpisow > 0){

    $zapytanie2 = mysql_fetch_assoc(mysql_query("SELECT * FROM users WHERE MD5(nick) = MD5('$loginl')"));
        $haslo = $zapytanie2['haslo']; 
        $idto = $zapytanie2['id'];
        /*
            session_register("zalogowany_mastercooks");
            session_register("nick_mastercooks");
            session_register("id_mastercooks");*/
            $_SESSION['zalogowany_mastercooks'] = "TAK";
            $_SESSION['nick_mastercooks'] = $loginl;

            $_SESSION['id_mastercooks'] = $idto;
            echo "<span class=\"alert alert-dismissable alert-success\" />Zostałeś pomyślnie zalogowany na swoje konto. Za chwilę nastąpi przekierownie na stronę główną ...</span> <meta http-equiv=\"Refresh\" content=\"3; url=index.php\" />";

}
else {
echo "<span class=\"alert alert-dismissable alert-errors\" />Wpisałeś niepoprawne hasło lub login. Spróbuj ponownie</span>";    
}
}
}
    ?> 
<?php
    if(!isset($_POST['submitted'])){

    }else{  
        $loginf = clear($_POST['login']);
        $haslof = clear($_POST['haslo']);
        $emailf = clear($_POST['email']);
        $regf = clear($_POST['regulamin']);

    if(empty($loginf) || empty($haslof) || empty($emailf)){
        echo "Uzupełnij wszystkie dane!!";
    }else{
        $t = mysql_query("SELECT * FROM users WHERE MD5(nick) = MD5('$loginf')");
        $ilenickow = mysql_num_rows($t);
        $ta = mysql_query("SELECT * FROM users WHERE email = '$emailf'");
        $ilemail = mysql_num_rows($ta);

        if($ilenickow > 0){
            error("Login jest już używany.");           
        }else if($ilemail > 0){
            error('Email jest już używany.');
                    }else if($regf > 0){
            error('Zatwierdź regulamin serwisu.');
        }else{
            $haslof = md5($haslof);
            mysql_query("INSERT INTO users SET nick='$loginf', haslo='$haslof', email='$emailf', kasa='1', active='0'");
            $id = mysql_insert_id(); 

            $link = str_replace('register.php', '', $_SERVER['SCRIPT_NAME']);           
            $link = $_SERVER['HTTP_HOST'].$link;

            success("Zostałeś zarejestrowany. Aby się zalogować musisz potwierdzić adres email poprzez wejście w link który został wysłany na twóją skrzynkę.");    

            $naglowki  = "Reply-to: [email protected] <[email protected]>".PHP_EOL;
            $naglowki .= "From: [email protected] <[email protected]>".PHP_EOL;
            $naglowki .= "MIME-Version: 1.0".PHP_EOL;
            $naglowki .= "Content-type: text/html; charset=UTF-8".PHP_EOL; 

            $messange = '<div style="text-align:center">
                            <span style="color:rgb(0,0,255)">
                                <font size="6">
                                    <b>Witaj '.$loginf.'!</b>
                                </font>
                                </span>
                                <br>
                                <font size="4">
                                    Aby aktywować swoje konto kliknij <a target="_blank" href="http://'.$link.'?activate='.$id.'&key='.$haslof.'">Tutaj</a><br /><br />
                                    Jeśli nie działa link wklej w go swoją przeglądarkę<br />
                                        http://'.$link.'?activate='.$id.'&key='.$haslof.'
                                </font>
                        </div>';

            mail($emailf, 'Potwierdzenie adresu e-mail [email protected]', $messange, $naglowki);

        }
    }

}
    ?> 
1

Zapisuj w bazie czy konto już jest aktywowane? ;p

Poza tym:
1.Nie korzystaj z mail.
2.Nie korzystaj z funkcji mysql_* - są zdeprecjonowane i będą usunięte z PHP.
3.W ogóle to masz niezły rozpiź... brud w tym kodzie. Podziel to sensownie na kontroler, model i widok.

0
RewriteEngine On
RewriteBase /
RewriteRule ^produkty,([0-9]+),([0-9]+)\.html$ '.$link.'?activate='.$id.'&key='.$haslof [L]

Coś takiego ma sens?

0

Może i tak, ale nie w naszym świecie.
Co to miałoby robić? Wiesz w ogóle, jak działa RewriteRule? :P

0

Dobra odpadam :) Kombinowałem, ale nie wykombinowałem.

0

Pomógłby ktoś zabezpieczyć lukę w kodzie?

0

Kiedyś jak trochę dziargałem w php to korzystałem z PDO. Pewności nie mam że tak dalej się robi ale na pewno jest to jeden ze sposobów zabezpieczenia SQL Injection:
http://code.tutsplus.com/tuto[...]or-database-access--net-12059

Using prepared statements will help protect you from SQL injection.

Konkrety:
http://php.net/manual/en/pdostatement.bindvalue.php

0

W jaki sposób to mogę zastosować w kodzie na pobieranie danych? Czy to zwiększy bezpieczeństwo?

<?php

   try
   {
      $pdo = new PDO('mysql:host=localhost;dbname=produkty', 'root', 'root');
      $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

      $stmt = $pdo->query('SELECT id, nazwa, opis FROM produkty');
      echo '<ul>';
      foreach($stmt as $row)
      {
          echo '<li>'.$row['nazwa'].': '.$row['opis'].'</li>';
      }
      $stmt->closeCursor();
      echo '</ul>';
   }
   catch(PDOException $e)
   {
      echo 'Połączenie nie mogło zostać utworzone: ' . $e->getMessage();
   }
?>

Nie mam pojęcia jak załatać tą lukę sql injection w kodzie poniżej:

<?php
    if(!isset($_POST['submitted'])){

    }else{    
        $loginf = clear($_POST['login']);
        $haslof = clear($_POST['haslo']);
        $emailf = clear($_POST['email']);
        $regf = clear($_POST['regulamin']);

    if(empty($loginf) || empty($haslof) || empty($emailf)){
        echo "Uzupełnij wszystkie dane!!";
    }else{
        $t = mysql_query("SELECT * FROM users WHERE MD5(nick) = MD5('$loginf')");
        $ilenickow = mysql_num_rows($t);
        $ta = mysql_query("SELECT * FROM users WHERE email = '$emailf'");
        $ilemail = mysql_num_rows($ta);

        if($ilenickow > 0){
            error("Login jest już używany.");            
        }else if($ilemail > 0){
            error('Email jest już używany.');
                    }else if($regf > 0){
            error('Zatwierdź regulamin serwisu.');
        }else{
            $haslof = md5($haslof);
            mysql_query("INSERT INTO users SET nick='$loginf', haslo='$haslof', email='$emailf', kasa='1', active='0'");
            $id = mysql_insert_id(); 

            $link = str_replace('register.php', '', $_SERVER['SCRIPT_NAME']);            
            $link = $_SERVER['HTTP_HOST'].$link;

            success("Zostałeś zarejestrowany. Aby się zalogować musisz potwierdzić adres email poprzez wejście w link który został wysłany na twóją skrzynkę.");    

            $naglowki  = "Reply-to: [email protected] <[email protected]>".PHP_EOL;
            $naglowki .= "From: [email protected] <[email protected]>".PHP_EOL;
            $naglowki .= "MIME-Version: 1.0".PHP_EOL;
            $naglowki .= "Content-type: text/html; charset=UTF-8".PHP_EOL; 

            $messange = '<div style="text-align:center">
                            <span style="color:rgb(0,0,255)">
                                <font size="6">
                                    <b>Witaj '.$loginf.'!</b>
                                </font>
                                </span>
                                <br>
                                <font size="4">
                                    Aby aktywować swoje konto kliknij <a target="_blank" href="http://'.$link.'?activate='.$id.'&key='.$haslof.'">Tutaj</a><br /><br />
                                    Jeśli nie działa link wklej w go swoją przeglądarkę<br />
                                        http://'.$link.'?activate='.$id.'&key='.$haslof.'
                                </font>
                        </div>';

            mail($emailf, 'Potwierdzenie adresu e-mail [email protected]', $messange, $naglowki);

        }
    }

}
    ?>  
0

Przepisz na PDO :P

0

Masz tu tak na szybko

<?php

class RejestracjaUzytkownika {
    private $login;
    private $haslo;
    private $email;
    private $bazaDanych;

    public function ($formularz) {
        if (empty($this->login) || empty($this->hassle) empty($this->email) empty($this->regulamin))
            return "Wypelnij wszystkie pola formularza";

        $this->login = md5($_POST['login']);
        $this->login = md5($_POST['haslo']);
        $this->login = md5($_POST['email']);

        $this->bazaDanych = $bazaDanych = new PDO("tutajConnectionStringDlaTwojejBazy");
        $uzytkownicy = $bazaDanych->prepare("SELECT count(*) FROM users WHERE nick=:login OR email=:email");
        $uzytkownicy->bindValue(':login', $this->login);
        $uzytkownicy->bindValue(':email', $this->email);
        $uzytkownicy->execute();
        $uzytkownicy = $uzytkownicy->fetch(PDO::FETCH_ASSOC);

        if ($uzytkownicy['count(*)] > 0)
            return "Login lub e-mail jest juz w uzyciu";

        $dodaj = $this->bazaDanych->prepare("INSERT INTO users (nick, haslo, email, klasa, active) VALUES (":nick", ":haslo", ":email", 1, 0));
        $dodaj->bindValue('nick', $this->login);
        $dodaj->bindValue('haslo', $this->haslo);
        $dodaj->bindValue('email', $this->email);
        $dodaj->execute();

        // tutaj mozesz zweryfikowac czy uzytkownik zostal dodany, ale nie widze pola ID wiec takie troche grzebanie kijem w mrowisku
        return "Uzytkownik zostal dodany";
    }

    public function WyslijEmailRejestracyjny() {
        // zrob to po Bozemu i nie uzywaj mail bo 70% maili w ogole nie dojdzie
    }
}

?>
  1. Mozesz wrapnac PDO w try...catch jezeli zwroci wyjatek.
  2. Nie uzywaj mail!!
  3. Nie znam twojej bazy danych ale juz na oko mi cos nie pasuje jezeli zaczniesz z relacjami walczyc. Obawiam sie dalszej spojnosci bazy jezeli bedziesz mial sporo rzeczy zwiazanych z uzytkownikami w bazie
  4. Ja bym do bazy dodal tez osobiscie timestamp. Moze sie przydac w wielu sytuacjach ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0