Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [skrypt/ocena] Sytem logowania cz.1
Forum PHP.pl > Forum > PHP
sebap123
Witam ostatnio napisałem sobie skrypt logowania i rejestracji. Na razie tutaj umieszczam już w 100% działający skrypt rejestracji na stronę, a potem dodam skrypty logowania.
Proszę o ocenę w szczególności bezpieczeństwa jak i porady co można tam pozmieniać. Dziękuję za wszelkie rady.

rejestracja:
  1. <?
  2. require('admin/db/connect.php');
  3. include('admin/includes/text.php');
  4. include('functions/checks.php');
  5. if (isset($_POST['submit'])) {
  6. $name = ($_POST['name']);
  7. $pass = ($_POST['password']);
  8. $pass2 = ($_POST['password_2']);
  9. $mail = trim($_POST['mail']);
  10. $query = mysql_query("SELECT * FROM CMS WHERE login = '$name'");
  11. $fetch = mysql_fetch_array($query);
  12. if ($pass == $pass2){
  13. if (verifyEmail($mail)){
  14. if (checkLogin($name)){
  15. if (strlen($pass)>3){
  16. if (strlen($name)>2){
  17. if (strlen($mail)>5){
  18. if (!$fetch){
  19. $add = mysql_query("INSERT INTO CMS (login, password, email) VALUES ('$name', md5('$pass'), '$mail')");
  20. $pass_message='dodano';
  21. }
  22. else{
  23. $pass_message='zarejestrowany';
  24. }}
  25. else{
  26. $pass_message='za krótki mail';}}
  27. else{
  28. $pass_message='za krotkie name';
  29. }}
  30. else{
  31. $pass_message='za krótkie pass';
  32. }}
  33. else{
  34. $pass_message='zły login';}}
  35. else{
  36. $pass_message='błędny mail';}}
  37. else{
  38. $pass_message='zle hasla';
  39. }}
  40.  
  41.  
  42.  
  43. ?>
  44. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  45. <html xmlns="http://www.w3.org/1999/xhtml">
  46. <head>
  47. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2" />
  48. <title>Untitled Document</title>
  49. </head>
  50.  
  51. <body>
  52. <form action="register.php" method = "POST" name="register">
  53. <p>Login
  54. <input type="text" name="name" />
  55. </p>
  56. <br />
  57. <p>E-mail
  58. <input type="text" name="mail" />
  59. </p>
  60. <br />
  61. <p>Hasło
  62. <input type="password" name="password" />
  63. </p>
  64. <br />
  65. <p>Powtórz hasło
  66. <input type="password" name="password_2" />
  67. </p>
  68. <br />
  69. <?php echo $pass_message;?>
  70. <input type="submit" name="submit" value="Login" />
  71. </form>
  72. </body>
  73. </html>


funkcje potrzebne w rejestracji:
  1. <?
  2. //sprawdzanie poprawności e-maila
  3. function verifyEmail($mail) {
  4.  
  5. $wholeexp = '/^(.+?)@(([a-z0-9\.-]+?)\.[a-z]{2,5})$/i';
  6. $userexp = "/^[a-z0-9\~\\!\#\$\%\&\(\)\-\_\+\=\[\]\;\:\'\"\,\.\/]+$/i";
  7.  
  8. if (preg_match($wholeexp, $mail, $regs)) {
  9. $username = $regs[1];
  10. $host = $regs[2];
  11.  
  12. if (checkdnsrr($host, MX)) {
  13. if (preg_match($userexp, $username)) {
  14. return true;
  15. } else { return false; }
  16. } else { return false; }
  17. } else { return false; }
  18. }
  19.  
  20. //sprawdzanie poprawności loginu
  21. function checkLogin($name){
  22. if (preg_match("/^([0-9A-Za-zążśźćęńół\-\_]+)$/",$name)) {
  23. return true;
  24. }
  25. else{
  26. return false;}}
  27. ?>
l0ud
Podatne na sql injection. Weryfikację nazwy powinieneś wykonać przed wykonaniem zapytania. Aby zapobiec XSS (na przyszłość - po tym kodzie tego nie widać) przepuszczaj wszystko od usera przed wyświetleniem przez htmlspecialchars().

No i dużo czytelniejsze by to było ze wcięciami...
sebap123
Dobra skrypt poprawiłem. Proszę o dalsze podpowiedzi.
Fragment poprawiony:
  1. require('admin/db/connect.php');
  2. include('admin/includes/text.php');
  3. include('functions/checks.php');
  4. if (isset($_POST['submit'])) {
  5. $name = ($_POST['name']);
  6. $pass = ($_POST['password']);
  7. $pass2 = ($_POST['password_2']);
  8. $mail = trim($_POST['mail']);
  9. if (checkLogin($name)){
  10. $query = mysql_query("SELECT * FROM CMS WHERE login = '$name'");
  11. $fetch = mysql_fetch_array($query);
  12. if ($pass == $pass2){
  13. if (verifyEmail($mail)){
  14. if (checkPass($pass)){
  15. if (strlen($pass)>3){
  16. if (strlen($name)>2){
  17. if (strlen($mail)>5){
  18. if (!$fetch){
  19. $add = mysql_query("INSERT INTO CMS (login, password, email) VALUES ('$name', md5('$pass'), '$mail')");
  20. $pass_message='dodano';
  21. }
  22. else{
  23. $pass_message='zarejestrowany';
  24. }}
  25. else{
  26. $pass_message='za krótki mail';}}
  27. else{
  28. $pass_message='za krotkie name';}}
  29. else{
  30. $pass_message='za krótkie pass';}}
  31. else{
  32. $pass_message='zle haslo';}}
  33. else{
  34. $pass_message='błędny mail';}}
  35. else{
  36. $pass_message='zle hasla';}}
  37. else{
  38. $pass_message='zly login';}}
  39.  


Funkcje z dodaną checkPass:
  1. <?
  2. //sprawdzanie poprawności e-maila
  3. function verifyEmail($mail) {
  4.  
  5. $wholeexp = '/^(.+?)@(([a-z0-9\.-]+?)\.[a-z]{2,5})$/i';
  6. $userexp = "/^[a-z0-9\~\\!\#\$\%\&\(\)\-\_\+\=\[\]\;\:\'\"\,\.\/]+$/i";
  7.  
  8. if (preg_match($wholeexp, $mail, $regs)) {
  9. $username = $regs[1];
  10. $host = $regs[2];
  11.  
  12. if (checkdnsrr($host, MX)) {
  13. if (preg_match($userexp, $username)) {
  14. return true;
  15. } else { return false; }
  16. } else { return false; }
  17. } else { return false; }
  18. }
  19.  
  20. //sprawdzanie poprawności loginu
  21. function checkLogin($name){
  22. if (preg_match("/^([0-9A-Za-zążśźćęńół\-\_]+)$/",$name)) {
  23. return true;
  24. }
  25. else{
  26. return false;}}
  27.  
  28. //sprawdzanie poprawności hasła
  29. function checkPass($pass){
  30. if (preg_match("/^([0-9A-Za-zążśźćęńół\-\_\@]+)$/",$pass)) {
  31. return true;
  32. }
  33. else{
  34. return false;}}
  35. ?>
darko
To co poprawiłeś? Dalej nie używasz htmlspecialchars, strip_tags, ani htmlentities na danych pochodzących od użytkownika.
sebap123
A no racja zapomniałem o tym.
Tutaj poprawiony:
  1. require('admin/db/connect.php');
  2. include('admin/includes/text.php');
  3. include('functions/checks.php');
  4. if (isset($_POST['submit'])) {
  5. $name = htmlspecialchars($_POST['name']);
  6. $pass = htmlspecialchars($_POST['password']);
  7. $pass2 = htmlspecialchars($_POST['password_2']);
  8. $mail1 = trim($_POST['mail']);
  9. $mail = htmlspecialchars($mail1);
  10. if (checkLogin($name)){
  11. $query = mysql_query("SELECT * FROM CMS WHERE login = '$name'");
  12. $fetch = mysql_fetch_array($query);
  13. if ($pass == $pass2){
  14. if (verifyEmail($mail)){
  15. if (checkPass($pass)){
  16. if (strlen($pass)>3){
  17. if (strlen($name)>2){
  18. if (strlen($mail)>5){
  19. if (!$fetch){
  20. $add = mysql_query("INSERT INTO CMS (login, password, email) VALUES ('$name', md5('$pass'), '$mail')");
  21. $pass_message='dodano';
  22. }
  23. else{
  24. $pass_message='zarejestrowany';
  25. }}
  26. else{
  27. $pass_message='za krótki mail';}}
  28. else{
  29. $pass_message='za krotkie name';}}
  30. else{
  31. $pass_message='za krótkie pass';}}
  32. else{
  33. $pass_message='zle haslo';}}
  34. else{
  35. $pass_message='błędny mail';}}
  36. else{
  37. $pass_message='zle hasla';}}
  38. else{
  39. $pass_message='zly login';}}
nospor
Sorki, ale tu nie ma co oceniać a już na pewno nie w dziale oceny. Przenoszę
matix
Taka moja praktyczna uwaga. Zrób sobie wyświetlanie komunikatów do użytkownika w trochę inny sposób:
  1. $aMessage = array('error' => array(), 'notice' => array());


gdzie do notice wrzucasz wszystko co zakończone zostało pomyślnie, a do error wszystko co jest wykonane niepoprawnie. Potem tylko prosta pętla i masz dość dobry system, jednak to nie wszystko.
Do tego zrób validację formularz, analogicznie do tego:
  1. $aErrorFields = array('login' => array(), 'password' => array(), 'email' => array());


Gdzie kluczem jest po prostu nazwa danego formularza. W bardzo prosty sposób możesz potem sprawdzić czy nie ma błędów i np. wyświetlić odpowiedni komunikat:
  1. if (!count($aErrorFields))
  2. $aMessage['notice'][] = 'Poprawnie dodano danego użytkownika/Poprawnie zalogowano';


Jest na prawdę wiele możliwości. Przede wszystkim oddziel logikę od szablonów.

Pozdr.
sebap123
Ok. Dzięki za radę. Zobaczę jak to wcisnąć tutaj i może potem umieszczę ten poprawiony kod.
No własnie tak muszę się przyznać, że mnie miałem pomysłu co z tym zrobić, żeby ładnie wyglądało.
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.