Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL] Feedback moich skryptów
Forum PHP.pl > Forum > Przedszkole
anatman
Witam uprzejmie wszystkich koderów!

Zacząłem budować pewien serwis, jednak moje umiejętności są niekompletne i dość chaotyczne(samouk). Dlatego prosiłbym o odsłuch z waszej strony. Chciałem w tym temacie publikować moje wypociny i liczę na Wasze konstruktywne wskazówki i rady. Podkreślam, że postawiłbym przede wszystkim na prostotę i bezpieczeństwo. Z tego względu nie chciałbym, zbytnio komplikować kodu, wręcz przeciwnie mam nadzieję, że część rzeczy można napisać prościej - jeśli coś widzicie piszcie. Prace nad skryptami są w toku, więc wiele rzeczy jest jeszcze nienapisanych. Póki co wszystko działa tak jak chce, więc tutaj problemu nie ma. Myślałem, że sam podołam wszystko napisać, jednak nie wiem zupełnie jak zabrać się m.in. za sprawę bezpieczeństwa, która jest dla mnie praktycznie pierwszorzędna. Googlowałem, googlowałem, ale nic sensownego i uporządkowanego nie znalazłem, dlatego zakładam ten temat. Mam nadzieję, że pomożecie mi w budowie, uzupełniając moją wiedzę jednocześnie. Więc zaczynam!

Na początek skrypt rejestracji. Nie potrzebne mi tutaj dużo rzeczy jedynie e-mail, login, password; reszta to pierdoły. Chciałbym abyście ocenili skrypt od strony konstrukcyjnej. Po pierwsze, liczę na wskazówki dotyczące działania i czytelności kodu, po drugie jak zabezpieczyć kod (jakich funkcji użyć):

  1. <?php session_start();
  2.  
  3. $_SESSION['error'] = NULL;
  4.  
  5. if(($_POST['email']==NULL) || ($_POST['login']==NULL) || ($_POST['password']==NULL) || ($_POST['password2']==NULL)) {
  6. $_SESSION['error']="fill in all form fields";
  7. header("Location: ../index.php"); exit;
  8. }
  9. if($_POST['password']!=$_POST['password2']) {
  10. $_SESSION['error']="password and password(x2) mismatch";
  11. header("Location: ../index.php"); exit;
  12. }
  13.  
  14. include("connect.php");
  15.  
  16. $getemail="SELECT * FROM users WHERE email='" . $_POST['email'] . "'";
  17. $_email=mysql_query($getemail, $connect);
  18. $email=mysql_fetch_assoc($_email);
  19. if($email['email'] == $_POST['email']) {
  20. $_SESSION['error']="e-mail is already used";
  21. header("Location: ../index.php"); exit;
  22. }
  23. $getlogin="SELECT * FROM users WHERE login='" . $_POST['login'] . "'";
  24. $_login=mysql_query($getlogin, $connect);
  25. $login=mysql_fetch_assoc($_login);
  26. if($login['login'] == $_POST['login']) {
  27. $_SESSION['error']="login is already used";
  28. header("Location: ../index.php"); exit;
  29. }
  30.  
  31. $register = "INSERT INTO `et`.`users`
  32. (`id`, `email`, `login`, `password`, `credits`, `active`)
  33. VALUES (NULL, '" . $_POST['email'] . "', '" . $_POST['login'] . "', '" . $_POST['password'] . "', '0', '0')";
  34. $register_query=mysql_query($register, $connect);
  35.  
  36. if($register_query == 1) {
  37. //activation mail script here//
  38. $_SESSION['error']="<br/>activation link has been sent to your e-mail address";
  39. header("Location: ../index.php"); exit;
  40. }
  41. else echo mysql_error();
  42. ?>
dżozef
1. nie używaj mysql_, zainteresuj się PDO
2. sprawdzaj zawartość $_POST przed podstawieniem (jak już będziesz używać PDO to poczytaj o bindowaniu)
3. a może obiektowo?
anatman
Hmmm... Sprawa wygląda tak, że uczyłem się php kawał czasu temu, a o istnieniu PDO dowiedziałem się jakieś dwie godziny temu wstydnis.gif Szkielet programu jest już praktycznie gotowy, zostawiłem na koniec bezpieczeństwo, grafikę i dopracowanie całości. Mam napisane ponad 20 skryptów i wszędzie jest mysql_ Przebudowywanie teraz wszystkiego mija się z celem, więc niestety, PDO nie wchodzi w tym projekcie w grę; tymbardziej, że wszystko działa jak należy i nie chcę mącić w kodzie. Czy proces rejestracji ma jakieś widoczne niedopracowania i jakich funkcji mam użyć i gdzie, aby zapewnić bezpieczeństwo? Gubię się w funkcjach typu htmlspecialchars(); real_escape_string(); md5(); sha1(); nie wiem jakich najlepiej użyć. Jestem totalnie zielony w sprawach bezpieczeństwa, a kategoria forum to PRZEDSZKOLE, więc proszę o konkretne, łopatologiczne odpowiedzi od kompetentnych osób, na przykładzie mojego skryptu. Dodam, że moja strona może być celem różnych ataków, więc chciałem ją dobrze zabezpieczyć.
aras785
info o błędach w sesji?

Na szybko napisałem coś takiego:
  1. <?php
  2. if(isset($_POST['register'])) {
  3. if(!empty($_POST['email']) AND !empty($_POST['login']) AND !empty($_POST['password']) AND !empty($_POST['password2'])) {
  4. if($_POST['password']==$_POST['password2']) {
  5. //laczymy sie z baza
  6. $db = new PDO('mysql:host=localhost;dbname=baza', 'user', 'password');
  7. $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
  8. //zapytania
  9. $query = $db->prepare('SELECT id FROM users WHERE login=:login OR email=:email LIMIT 1--');
  10. $query->bindParam(':login',$_POST['login'],PDO::PARAM_STR);
  11. $query->bindParam(':email',$_POST['email'],PDO::PARAM_STR);
  12. $query->execute();
  13. if($query->rowCount()==0) {
  14. $query = $db->prepare('INSET INTO users(id,login,email,password) VALUES(:id,:login,:email,:password)');
  15. $query->bindValue(':id','');
  16. $query->bindParam(':login',$_POST['login'],PDO::PARAM_STR);
  17. $query->bindParam(':email',$_POST['email'],PDO::PARAM_STR);
  18. //password md5
  19. $password = md5(trim($_POST['password']));
  20. $query->bindParam(':password',$password,PDO:PARAM_STR,32);
  21. if($query->execute()) {
  22. $message_ok = 'Zarejestrowany czy coś ;)';
  23. }else $message_error = 'error';
  24. }else $message_error = 'login or password is already';
  25. }else $message_error = 'password and password(x2) mismatch';
  26. }else $message_error = 'fill in all form fields';
  27. }
nie sprawdzałem wink.gif Pozdrawiam
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.