Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Logowanie
Forum PHP.pl > Forum > Przedszkole
kamilo818
Witam,
czy taki system logowania jest bezpieczny?
Ewentualnie co jeszcze dodać/zmienić aby ulepszyć go?

login_form.php
  1. <form action="login.php" method="POST" class="form">
  2.  
  3. <input type="text" id="login"/><br>
  4. <input type="password" id="password"/><br>
  5. <input type="submit" value="Login"/>
  6.  
  7. </form>
  8.  
  9. <script>
  10. $('.form').on('submit', function(e) {
  11.  
  12. var login = $('#login').val();
  13. var password = $("#password").val();
  14. var dataString = 'login='+login+'&password='+ password;
  15.  
  16. $.ajax({
  17. type: 'post',
  18. url: ('login.php'),
  19. data: dataString,
  20.  
  21. beforeSend: function () {
  22. $('body').html('wait...');
  23. },
  24. success: function (obj) {
  25. $('body').html(obj);
  26. }
  27. });
  28.  
  29.  
  30. e.preventDefault();
  31. });
  32. </script>
  33. login.php
  34. [php]
  35. <?php
  36. $login = $_POST['login'];
  37. $password = $_POST['password'];
  38.  
  39. if($_SERVER['REQUEST_METHOD'] == 'POST') {
  40. if(empty($login) || empty($password)){
  41. die ( 'Wypełnij wszystkie dane.' );
  42. }else{
  43. include('config.php');
  44.  
  45. connect($adres, $user, $pass, $baza);
  46.  
  47. $login = trim(strip_tags(mysqli_real_escape_string($link, $login)));
  48. $password = hash('sha1', trim(strip_tags(mysqli_real_escape_string($link, $password))));
  49.  
  50. $result = mysqli_query($link, "SELECT login,ip,mail FROM logowanie_users WHERE login='$login' AND password='$password'");
  51. $count = mysqli_num_rows($result);
  52. $row = mysqli_fetch_array($result);
  53.  
  54. $new_ip = $_SERVER['REMOTE_ADDR'];
  55.  
  56. if($count == 1){
  57.  
  58. $ip_array = explode(',',$row['ip']);
  59. if(!in_array($new_ip,$ip_array)){
  60.  
  61. $add_ip = $row['ip'].','.$new_ip;
  62. $mysql_update_ip = mysqli_query($link, "UPDATE logowanie_users SET ip='$add_ip' WHERE login='$login' AND password='$password'");
  63. echo "Logowanie z nieznanego adresu IP. W celu dodania adresu IP do zaufanych kliknij w link podany w e-mailu i zaloguj się ponownie!";
  64.  
  65. }else{
  66. $_SESSION['ip'] = $new_ip;
  67. $_SESSION['nick'] = $login;
  68. setcookie('islogged', 'islogged', time() + 3600);
  69. header('Location: userpanel.php');
  70. }
  71.  
  72. }else{
  73. echo 'Brak użytkownika w bazie';
  74. }
  75.  
  76. disconnect($adres, $user, $pass, $baza);
  77. }
  78. }
  79. ?>

register_form.php
  1. <form action="register.php" method="POST" class="form">
  2.  
  3. <input type="text" id="login"/><br>
  4. <input type="password" id="password"/><br>
  5. <input type="password" id="password_confirm"/><br>
  6. <input type="email" id="email"/><br>
  7. <input type="submit" value="Register"/>
  8.  
  9. </form>
  10.  
  11. <script>
  12. $('.form').on('submit', function(e) {
  13.  
  14. var login = $('#login').val();
  15. var email = $("#email").val();
  16. var password = $("#password").val();
  17. var password_confirm = $("#password_confirm").val();
  18. var dataString = 'login='+login+'&email=' + email + '&password=' + password + '&password_confirm=' + password_confirm;
  19.  
  20. $.ajax({
  21. type: 'post',
  22. url: ('register.php'),
  23. data: dataString,
  24.  
  25. beforeSend: function () {
  26. $('body').html('wait...');
  27. },
  28. success: function (obj) {
  29. $('body').html(obj);
  30. }
  31. });
  32.  
  33.  
  34. e.preventDefault();
  35. });
  36. </script>

register.php
  1. <?php
  2. include('config.php');
  3.  
  4. $login = $_POST['login'];
  5. $password = $_POST['password'];
  6. $password_confirm = $_POST['password_confirm'];
  7. $email = $_POST['email'];
  8.  
  9. if($_SERVER['REQUEST_METHOD'] == 'POST'){
  10. if(empty($login) || empty($password) || empty($password_confirm) || empty($email)){
  11. die ( 'Wypełnij wszystkie dane.' );
  12. }elseif(!filter_var($email, FILTER_VALIDATE_EMAIL)){
  13. die ('Nie poprawny adres E-mail.' );
  14. }elseif($password!=$password_confirm){
  15. die('Hasła niezgodne!');
  16. }else{
  17. connect($adres, $user, $pass, $baza);
  18.  
  19. $login = trim(strip_tags(mysqli_real_escape_string($link,$login)));
  20. $password = hash('sha1', trim(strip_tags(mysqli_real_escape_string($link,$password))));
  21. $email = trim(strip_tags(mysqli_real_escape_string($link,$email)));
  22. $ip = $_SERVER['REMOTE_ADDR'];
  23. $now = date("Y-m-d H:i:s");
  24.  
  25. $sql = "SELECT login FROM logowanie_users WHERE login='$login'";
  26. $result = mysqli_query($link, $sql);
  27. $count = mysqli_num_rows($result);
  28. if($count!=0){
  29. die('Taki login już istnieje');
  30. }
  31.  
  32. $sql = "SELECT mail FROM logowanie_users WHERE mail='$email'";
  33. $result = mysqli_query($link, $sql);
  34. $count = mysqli_num_rows($result);
  35. if($count!=0){
  36. die('Taki e-mail już istnieje');
  37. }
  38.  
  39. mysqli_query($link,"INSERT INTO logowanie_users SET login='$login', password='$password', mail='$email',date='$now',ip='$ip'");
  40.  
  41. if(mysqli_affected_rows($link) == 1){
  42. echo 'Zostałeś pomyślnie zarejestrowany';
  43. }
  44.  
  45. disconnect($adres, $user, $pass, $baza);
  46. }
  47. }
  48. ?>

userpanel.php
  1. <?php
  2. if(empty($_COOKIE['islogged'])){
  3. header('Refresh: 2; url=login_form.php');
  4. die( 'Czas sesji wygasł. Proszę zalogować się ponownie.<br> Za chwilę nastąpi przepierowanie');
  5. }
  6.  
  7. if(isset($_SESSION['nick']) && isset($_SESSION['ip']) && $_SESSION['ip']==$_SERVER['REMOTE_ADDR']){
  8. echo '<p>Treść dla zalogowanych</p>';
  9. echo '<a href="logout.php">Wyloguj</a>';
  10. }else{
  11. echo 'Nie jesteś zalogowany. Przejdź do <a href="login_form.php">Formularza logowania</a>.';
  12. }
  13. ?>
daniel1302
Myślę, że jest dobrze napisany.
Czemu nie napiszesz funkcji która będzie ci czyściła ciągi znakowe np:
  1. function quoteString($string) {
  2. return trim(strip_tags(mysqli_real_escape_string($string)));
  3. }

Ale proponuje przesiąść się na jakis adapter do bazy np PDO jak nie chcesz używać dodatkowych bibliotek.


Pyton_000
  1. $login = $_POST['login'];
  2. $password = $_POST['password'];
  3.  
  4. if($_SERVER['REQUEST_METHOD'] == 'POST') {

Zła kolejność, jak nie będzie POST to sypnie Notice
kamilo818
Dzięki panowie. Zaraz obie sugestie zastosuje.

viking
A po co z hasła usuwasz trim i strip_tags? To może wyciąć użytkownikowi sporą ilość znaków jakie wprowadził.
Tego nie rozumiem UPDATE logowanie_users SET ip='$add_ip' WHERE login='$login' AND password='$password' Dziwna strasznie tabela.
setcookie - http only
kamilo818
Faktycznie, wogole to walidację jeszcze wprowadze hasła i loginu do tego.

'UPDATE logowanie_users SET ip='$add_ip' WHERE login='$login' AND password='$password''
To jest tak tylko testowo wprowadzone.
Docelowo ma to działać tak że jeśli user loguje się z innego ip niż jest w bazie to wyrzuca mu komunikat że ktos z takiego ip probowal sie logować i jeśli to on to musi dodać ip do zaufanych.
jak zatwierdzi to ip zostanie dodane do tabeli = UPDATE logowanie_users SET ip='$add_ip' WHERE login='$login'

setcookie - http only - już dodaje
zidek
eee, jak ktoś loguje się na zmianę na smartfonie, laptopie i jeszcze na PC to za każdym razem wyskoczy mu alert, że loguje się z nowego urządzenia?
Pyton_000
Czytać umie? Stanie się tak tylko przy pierwszym logowaniu z nowego IP.

Choć fakt rozwiązanie głupie bo ktoś kto ma zmienne IP codziennie będzie miał alert.
zidek
Cytat(Pyton_000 @ 26.01.2015, 14:03:59 ) *
Czytać umie? Stanie się tak tylko przy pierwszym logowaniu z nowego IP.

Choć fakt rozwiązanie głupie bo ktoś kto ma zmienne IP codziennie będzie miał alert.


Lol, chyba właśnie o tym pisałem... I kto nie umie czytać :|
kamilo818
Fakt zmienne IP to bedzie niedogodność.
Ale to jest rozwiązanie do tego konkretnego przypadku.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.