Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [skrypt] uniwersalny skrypcik logowania
epud
post 5.06.2006, 17:58:17
Post #1





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 5.06.2006

Ostrzeżenie: (0%)
-----


jako, że zaczynam dopiero zabawe z obiektowym php prosze o ocene skrypciku na ponize, jest to "uniwersalny" skrypcik logowania uzytkownika do systemu... zalozenie bylo takie abym mogl to prosto przystosowac do innych projetkow bez za duzego grzebania w kodzie, dla tego podajemy nazwe tabeli z uzytkownikami, i nazwe pol z loginem i haslem

co myslicie nadaje sie?

a pod wzgledem obiektowym?

  1. <?php 
  2. class auth{
  3. var $db = NULL;
  4. var $table_name;
  5. var $login_name;
  6. var $pass_name;
  7. var $md5;
  8. var $login;
  9. var $pass;
  10. var $dbpass;
  11. var $errors = array();
  12. public function __construct($db, $table_name, $login_name, $pass_name, $md5 = false){
  13. //$_SESSION['isLoggedIn'] = false;
  14. $this -> db = $db;
  15. $this -> table_name = $table_name;
  16. $this -> login_name = $login_name;
  17. $this -> pass_name = $pass_name;
  18. $this -> md5 = $md5;
  19. }
  20. public function authorize($login, $pass){
  21. if(empty($login) || empty($pass)){
  22. array_push($this -> errors, 'login i hasło nie mogą być puste');
  23. return false;
  24. }
  25. $this -> login = $login;
  26. if($this -> md5){
  27. $this -> pass = md5($pass);
  28. }
  29. else{
  30. $this -> pass = $pass;
  31. }
  32. if($this -> getPass()){
  33. if($this -> pass == $this -> dbpass){
  34. $_SESSION['isLoggedIn'] = true;
  35. $_SESSION['userData'] = $this -> getUserData();
  36. header("Location: index.php");
  37. }
  38. else{
  39. array_push($this -> errors, 'błędny login lub hasło');
  40. }
  41. }
  42. else{
  43. array_push($this -> errors, 'błędny login lub hasło');
  44. }
  45. }
  46. private function getPass(){
  47. $this -> dbpass = $this -> db -> GetOne("SELECT ". $this -> pass_name ." FROM ". $this -> table_name ." WHERE ". $this -> login_name." = '".$this -> login."'");
  48. if($this -> dbpass){
  49. return true;
  50. }
  51. return false;
  52. }
  53. public function isLoggedIn(){
  54. return $_SESSION['isLoggedIn'];
  55. }
  56. private function getUserData(){
  57. return trim_array($this -> db -> GetRow("SELECT * FROM ".$this -> table_name." WHERE ".$this -> login_name." = '".$this -> login."'"));
  58. }
  59. }
  60. ?>


sprawdzanie czy zalogowany czy nie..

  1. <?php 
  2. $auth = new auth($db, PREFIX."users", 'user_name', 'user_pass', true);
  3. /* END AUTH */
  4.  
  5. if($auth -> isLoggedIn()){//jesli zalogowany
  6. $smarty -> display('index.tpl');
  7. }
  8. else{//jesli nie zalogowany
  9. $smarty -> display('loginForm.tpl');
  10. }//if($auth -> isLoggedIn())
  11. ?>

wersyfikacjia usera
  1. <?php
  2. $auth = new auth($db, PREFIX."users", 'user_name', 'user_pass', true);
  3. $auth -> authorize($_POST['login']['user_name'], $_POST['login']['user_pass']);
  4. ?>



z gory dzieki za wszelkie wypowiedzi winksmiley.jpg

Ten post edytował epud 5.06.2006, 18:03:37
Go to the top of the page
+Quote Post
dyktek
post 6.06.2006, 08:54:17
Post #2





Grupa: Zarejestrowani
Postów: 240
Pomógł: 0
Dołączył: 18.01.2004
Skąd: rzeszów / kraków

Ostrzeżenie: (0%)
-----


na początek zaznacze ze sam jestem początkujący jeśli chodzi o oop.
testowałem klase i fajnie działa ale mam jedno pytanie po co to
  1. <?php
  2. array_push($this -> errors, 'błędny login lub hasło');
  3. ?>
skoro piszesz w php5
Go to the top of the page
+Quote Post
AcidBurnt
post 6.06.2006, 09:16:39
Post #3





Grupa: Zarejestrowani
Postów: 215
Pomógł: 1
Dołączył: 13.04.2003
Skąd: z ławki przed blokiem

Ostrzeżenie: (0%)
-----


zwrocenie komunikatu o blednym loginie i hasle, ktory mozna wyswietlic pozniej uzytkownikowi.
Go to the top of the page
+Quote Post
dyktek
post 6.06.2006, 09:33:58
Post #4





Grupa: Zarejestrowani
Postów: 240
Pomógł: 0
Dołączył: 18.01.2004
Skąd: rzeszów / kraków

Ostrzeżenie: (0%)
-----


no to wiem:) tylko chodziło mi raczej po co skoro są wyjątki
Go to the top of the page
+Quote Post
TomASS
post 6.06.2006, 09:44:38
Post #5





Grupa: Zarejestrowani
Postów: 1 660
Pomógł: 13
Dołączył: 9.06.2004
Skąd: Wrocław i okolice

Ostrzeżenie: (0%)
-----


Witam smile.gif

1. jeśli funkcje nazywasz public, to zmienne nazwij konsekwentnie (teraz masz var $zmienna) private (tutaj jest wyjaśnione dlaczego)
2. uważaj z zapytaniem:
  1. <?php
  2. "SELECT ". $this -> pass_name ." FROM ". $this -> table_name ." WHERE ". $this -> login_name." = '".$this -> login."'"
  3. ?>
na SQL Injection/Insertion.

Narazie to tylko to co mi się w oczy rzuciło.

Sam kiedyś chciałem napisac jakiś porządny krypcik logowania dla początkujących, bo czasmi ludzie mają z tym problemy.

Ten post edytował TomASS 6.06.2006, 09:45:54


--------------------
Go to the top of the page
+Quote Post
epud
post 6.06.2006, 10:27:06
Post #6





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 5.06.2006

Ostrzeżenie: (0%)
-----


Cytat(dyktek @ 6.06.2006, 10:33 ) *
no to wiem:) tylko chodziło mi raczej po co skoro są wyjątki


eee. no dobra ale z tego co sie orientuje wyjatek zatrzyma wykonywanie strony dalej tak? a jak chce tylko napisac nad formem logowania ze bledne haslo jest nic wiece, zaden z tych bledow nie jest krytyczny

Cytat(TomASS @ 6.06.2006, 10:44 ) *
1. jeśli funkcje nazywasz public, to zmienne nazwij konsekwentnie (teraz masz var $zmienna) private (tutaj jest wyjaśnione dlaczego)
2. uważaj z zapytaniem:
  1. <?php
  2. "SELECT ". $this -> pass_name ." FROM ". $this -> table_name ." WHERE ". $this -> login_name." = '".$this -> login."'"
  3. ?>
na SQL Injection/Insertion.


masz racjie z tym sql injection... tzn w tym przypadku dbam o to zanim wysle zmienne do klasy... na samyum pocatku stronki mam cos takiego:

  1. <?php
  2. $_POST = trim_array($_POST);
  3. ?>


co usuwa z tresc zmiennych, select, insert, delete tip... i trimuje kazda zniemmna winksmiley.jpg chyba powinno stykac co? ;>

no i zaraz poczytam o tych zmiennych private itp
Go to the top of the page
+Quote Post
TomASS
post 6.06.2006, 10:30:44
Post #7





Grupa: Zarejestrowani
Postów: 1 660
Pomógł: 13
Dołączył: 9.06.2004
Skąd: Wrocław i okolice

Ostrzeżenie: (0%)
-----


Bardzo mądrze smile.gif A jak wygląda ta funkcja trim_array?


--------------------
Go to the top of the page
+Quote Post
epud
post 6.06.2006, 11:18:21
Post #8





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 5.06.2006

Ostrzeżenie: (0%)
-----


Cytat(TomASS @ 6.06.2006, 11:30 ) *
Bardzo mądrze smile.gif A jak wygląda ta funkcja trim_array?



tak o:

  1. <?php 
  2. function trim_array($array){
  3. $new = array();
  4. foreach($array as $a => $row){
  5. if(is_array($row)){
  6. $new[$a] = trim_array($row);
  7. }
  8. else{
  9. $new[$a] = trim($row);
  10. $new[$a] = str_replace("SELECT", " ", $row);
  11. $new[$a] = str_replace("INSERT", " ", $row);
  12. $new[$a] = str_replace("DELETE", " ", $row);
  13. $new[$a] = str_replace("UPDATE", " ", $row);
  14. }
  15. }
  16. return $new;
  17. }
  18. ?>


hm.. tylko wlasnie chyba stwierdzilem ze nie zadziala jak ktos poscic w teks SeLeCt a baza i tak to zinterpetuje chyba winksmiley.jpg

ma ktos jakis pomysł jak to porpawic

a powracajac do klasy dodalem TIMEOUTA po ktorym wylogowuje po czasie bezczynnosc:

  1. <?php 
  2. /**
  3.  * Unwersalna autrozacja uzytkownia
  4.  * @author Acid
  5.  * @version 1.0
  6.  * 
  7.  */
  8. class auth{
  9. var $db = NULL;
  10. var $table_name;
  11. var $login_name;
  12. var $pass_name;
  13. var $md5;
  14. var $login;
  15. var $pass;
  16. var $dbpass;
  17. var $sessionTime;
  18. var $errors = array();
  19. /**
  20.  * Konstruktor klasy
  21.  *
  22.  * @param object $db
  23.  * @param string $table_name
  24.  * @param string $login_name
  25.  * @param string $pass_name
  26.  * @param bool $md5
  27.  */
  28. public function __construct($db, $table_name, $login_name, $pass_name, $sessionTime = '1200',$md5 = false){
  29. $this -> db = $db;
  30. $this -> table_name = $table_name;
  31. $this -> login_name = $login_name;
  32. $this -> pass_name = $pass_name;
  33. $this -> sessionTime =$sessionTime;
  34. $this -> md5 = $md5;
  35. }
  36. /**
  37.  * Autoryzacja
  38.  *
  39.  * @param string $login
  40.  * @param string $pass
  41.  * @return bool
  42.  */
  43. public function authorize($login, $pass){
  44. if(empty($login) || empty($pass)){
  45. array_push($this -> errors, 'login i hasło nie mogą być puste');
  46. return false;
  47. }
  48. $this -> login = $login;
  49. if($this -> md5){
  50. $this -> pass = md5($pass);
  51. }
  52. else{
  53. $this -> pass = $pass;
  54. }
  55. if($this -> getPass()){
  56. if($this -> pass == $this -> dbpass){
  57. $_SESSION['isLoggedIn'] = true;
  58. $_SESSION['beginTime'] = time();
  59. $_SESSION['userData'] = $this -> getUserData();
  60. header("Location: index.php");
  61. }
  62. else{
  63. array_push($this -> errors, 'błędny login lub hasło');
  64. }
  65. }
  66. else{
  67. array_push($this -> errors, 'błędny login lub hasło');
  68. }
  69. }
  70. /**
  71.  * pobieranie hasła z bazy
  72.  *
  73.  * @return bool
  74.  */
  75. private function getPass(){
  76. $this -> dbpass = $this -> db -> GetOne("SELECT ". $this -> pass_name ." FROM ". $this -> table_name ." WHERE ". $this -> login_name." = '".$this -> login."'");
  77. if($this -> dbpass){
  78. return true;
  79. }
  80. return false;
  81. }
  82. /**
  83.  * Sprawdzanie czy zalogowany
  84.  *
  85.  * @return bool
  86.  */
  87. public function isLoggedIn(){
  88. if(isset($_SESSION['isLoggedIn']) && $this -> sessionTimeOut()){
  89. return true;
  90. }
  91. return false;
  92. }
  93. /**
  94.  * Pobieranie danych uzytkownia z bazy
  95.  *
  96.  * @return array mixed
  97.  */
  98. private function getUserData(){
  99. return trim_array($this -> db -> GetRow("SELECT * FROM ".$this -> table_name." WHERE ".$this -> login_name." = '".$this -> login."'"));
  100. }
  101. /**
  102.  * Wylogowywanie
  103.  *
  104.  */
  105. public function logOut(){
  106. unset($_SESSION);
  107. header("Location: index.php");
  108. }
  109. private function sessionTimeOut(){
  110. if($_SESSION['beginTime'] + $this -> sessionTime < time()){
  111. unset($_SESSION);
  112. array_push($this ->errors, 'przekroczyłeś czas bezczynnosc');
  113. return false;
  114. }
  115. return true;
  116. }
  117. }
  118. ?>
Go to the top of the page
+Quote Post
Jim
post 6.06.2006, 11:44:06
Post #9





Grupa: Zarejestrowani
Postów: 111
Pomógł: 0
Dołączył: 27.07.2005

Ostrzeżenie: (0%)
-----


co do trim_array to proponuję zastosować po prostu mysql_real_escape_string" title="Zobacz w manualu php" target="_manual.
A jeśli chciałbyś wykrywać "hacking attempts" to najlepiej zastosować wyrażenia reguralne, ale na tym to ja już się nie znam winksmiley.jpg

btw: dobry pomysł, może sam też skorzystam jak już będzie stablina wersja winksmiley.jpg
Go to the top of the page
+Quote Post
epud
post 6.06.2006, 16:09:38
Post #10





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 5.06.2006

Ostrzeżenie: (0%)
-----


Cytat(Jim @ 6.06.2006, 12:44 ) *
co do trim_array to proponuję zastosować po prostu mysql_real_escape_string" title="Zobacz w manualu php" target="_manual.
A jeśli chciałbyś wykrywać "hacking attempts" to najlepiej zastosować wyrażenia reguralne, ale na tym to ja już się nie znam winksmiley.jpg

btw: dobry pomysł, może sam też skorzystam jak już będzie stablina wersja winksmiley.jpg



stabilna to juz jest, wdrorzylem ja juz w skrypcje biggrin.gif powiedzcie co by jeszcze dodac to sie doda aby była lepsza...

drobna zmiana, bo wylogowywalo zawsze po czasie nie zaleznie czy user byl aktywny czy nie smile.gif

  1. <?php
  2. public function isLoggedIn(){
  3. if(isset($_SESSION['isLoggedIn']) && $this -> sessionTimeOut()){
  4. $_SESSION['beginTime'] = time();
  5. return true;
  6. }
  7. return false;
  8. }
  9. ?>
Go to the top of the page
+Quote Post
Jarod
post 6.06.2006, 19:06:48
Post #11





Grupa: Zarejestrowani
Postów: 1 190
Pomógł: 27
Dołączył: 23.04.2005

Ostrzeżenie: (0%)
-----


Cytat(epud @ 6.06.2006, 09:27 ) *
  1. <?php
  2. $_POST = trim_array($_POST);
  3. ?>



Jeśli mam do przefiltrowania kilka zmiennych POST i klika GET to zamiast filtrować je po kolei, np tak:

  1. <?php
  2. $_POST['zmienna1']=intval($_POST['zmienna1']);
  3. $_POST['zmienna2']=strval($_POST['zmienna2']);
  4.  
  5. $_GET['zmienna1']=intval($_GET['zmienna1']);
  6. $_GET['zmienna2']=strval($_GET['zmienna2']);
  7. ?>


Mogę zastąpić tak:
  1. <?php
  2. $_POST = intval($_POST);
  3. $_POST = strval($_POST);
  4. ?>


questionmark.gif?


--------------------
”Godzina nauki w życiu nowoczesnego apostoła jest godziną modlitwy.”
(św. Josemaría Escrivá, Droga, 335)
Go to the top of the page
+Quote Post
epud
post 7.06.2006, 12:55:56
Post #12





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 5.06.2006

Ostrzeżenie: (0%)
-----


nie, trim_array to f-cja przygotowana przezemnie ktora robi trim na kazdym elemencie tej tablicy
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.04.2024 - 18:22