Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP] Poprawione błędy i prośba o sprawdzenie kodu :)
gloweres
post 14.10.2020, 11:57:03
Post #1





Grupa: Zarejestrowani
Postów: 20
Pomógł: 0
Dołączył: 29.08.2020

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


Cześć wszystkim, ostatnio pewna osoba której bardzo dziękuje pokazała mi błąd w moim kodzie PHP. Zajrzałem do dokumentacji i wywnioskowałem następujące wnioski, iż do poprawnego prepare trzeba podstawić wartości za pomocą bind(). Czy Była by dobra duszyczka i sprawdziła czy wszystko dobrze zrobiłem oraz wysłałem przykładowy kod logowania oraz pokazywania jakiś informacji i czy również jest to zrobione w bezpieczny sposób? Czy też mam coś pozmieniać. Z góry dziękuje smile.gif


Kod z błędem:

  1. <?php
  2.  
  3. require '../funkcje/database_connect/dbsoft.php';
  4.  
  5. $sql = "INSERT INTO `database` (nazwisko, imie)
  6. VALUES ('{$_POST['1']}', '{$_POST['2']}')";
  7.  
  8. $statement = $connection->prepare($sql);
  9.  
  10. if (!$statement) {
  11. echo "\nPDO::errorInfo():\n";
  12. print_r($dbh->errorInfo());
  13. }
  14.  
  15. if ($statement->execute()) {
  16.  
  17. echo '<p class="text-success">Pozytywnie dodano osobę</p>';
  18.  
  19. }
  20.  
  21. ?>


Kod poprawiony:

  1. <?php
  2.  
  3. require '../funkcje/database_connect/dbsoft.php';
  4.  
  5. $sql = "INSERT INTO `database` (nazwisko, imie)
  6. VALUES (:surname, :name)";
  7.  
  8. $statement = $connection->prepare($sql);
  9. $statement->bindParam(':name', $_POST['2'], PDO::PARAM_STR);
  10. $statement->bindParam(':surname', $_POST['1'], PDO::PARAM_STR);
  11.  
  12. if (!$statement) {
  13. echo "\nPDO::errorInfo():\n";
  14. print_r($dbh->errorInfo());
  15. }
  16.  
  17. if ($statement->execute()) {
  18.  
  19. echo '<p class="text-success">Pozytywnie dodano osobę</p>';
  20.  
  21. }
  22.  
  23. $statement->execute();
  24.  
  25. ?>


Kod logowania:

  1. <?php
  2.  
  3.  
  4. require '../database_connect/dbsoft.php';
  5.  
  6. $email= $_POST['email'];
  7. $password = $_POST['password'];
  8.  
  9. $email = htmlentities($email, ENT_QUOTES, "UTF-8");
  10.  
  11. $sekret = "XXXXXXXXXXXXXXXXXXXXXXXXX";
  12.  
  13. $sprawdz = file_get_contents('https://www.google.com/recaptcha/api/siteverify?secret='.$sekret.'&response='.$_POST['g-recaptcha-response']);
  14.  
  15. $odpowiedz = json_decode($sprawdz);
  16.  
  17. if ($odpowiedz->success==false)
  18. {
  19. $_SESSION['e_bot']="Potwierdź, że nie jesteś botem!";
  20. header('Location: ../login.php');
  21. exit();
  22. }
  23. $sql = 'SELECT * FROM account WHERE email="'.$email.'"';
  24. $statement = $connection->prepare($sql);
  25. $statement->execute();
  26. $oz = $statement->rowCount();
  27.  
  28. if($oz>0){
  29.  
  30. $row = $statement->fetchAll(PDO::FETCH_OBJ);
  31.  
  32. foreach($row as $rows):
  33. $password_base = $rows->password;
  34. $email = $rows->email;
  35. $id_base = $rows->id;
  36. endforeach;
  37.  
  38. if (password_verify($password, $password_base))
  39. {
  40.  
  41. $_SESSION['verify'] = true;
  42. $_SESSION['id_session'] = $id_base;
  43.  
  44. function random(int $i)
  45. {
  46. return substr(str_shuffle(str_repeat($x='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', ceil($i/strlen($x)) )),1,$i);
  47. }
  48.  
  49. $code = random(35);
  50. $now = time() + 900;
  51. $time = date("Y-m-d H:i:s");
  52.  
  53. $sql = "INSERT INTO verify_code (id_user, code, date, status_code) VALUES ('$id_base', '$code', '$now', 0)";
  54. $connection->prepare($sql)->execute();
  55.  
  56. $message="Kod do weryfikacji:\n\n$code\n\nWiadomosc zostala wygenerowana automatycznie: $time";
  57. $sender="From: domena.pl";
  58. @mail($email, "Kod weryfikacyjny", $message, $sender);
  59.  
  60. unset($_SESSION['error']);
  61.  
  62. $statement = null;
  63. $connection = null;
  64.  
  65. header('Location: verify.php');
  66.  
  67. }
  68. else
  69. {
  70.  
  71. $_SESSION['error'] = '<span style="color:red">Nieprawidłowy login lub hasło!</span>';
  72. $statement = null;
  73. $connection = null;
  74. header('Location: ../login.php');
  75.  
  76. }
  77.  
  78. } else {
  79.  
  80. $_SESSION['error'] = '<span style="color:red">Nieprawidłowy login lub hasło!</span>';
  81. $statement = null;
  82. $connection = null;
  83. header('Location: ../login.php');
  84.  
  85. }
  86.  
  87. $statement = null;
  88. $connection = null;
  89.  
  90. ?>


Wiadomo, do tego mam jeszcze sprawdzanie kodu do logowania 2-etapowego ale czy wszystko jest poprawnie zrobione i co najważniejsze BEZPIECZNIE?

Przykładowe połączenie do wypisania tabeli na stronie z bazy:

  1. <?php
  2.  
  3. // NOTA INFORMACYJNA
  4. // W zapytaniu do bazy (AND ZNACZY I) a (OR ZNACZY LUB)
  5.  
  6. // System warunkowy
  7.  
  8. // Przypisanie wartości inputa do zmiennej
  9. $id_if = $_POST['idif'];
  10.  
  11. // Zmienne konfiguracyjne
  12. $baza = "database"; // Nazwa tabeli bazy danych
  13.  
  14. // Sprawdzanie wartości z formów (to omińmy bo zrobiłem zależność wczytywaną z innej strony- zostawmy 1 == 1 dla ułatwienia.
  15. if(1 == 1){
  16.  
  17. // Konfiguracja 1
  18. $warunek_pierwszy = "imie";
  19. $wartosc_dla_warunku_pierwszego = "jan";
  20. $warunek_drugi = "nazwisko";
  21. $wartosc_dla_warunku_drugiego = "kowalski";
  22.  
  23.  
  24.  
  25. // Tworzenie zapytania
  26. $sql = "SELECT * FROM `$baza` WHERE $warunek_pierwszy='$wartosc_dla_warunku_pierwszego' AND $warunek_drugi='$wartosc_dla_warunku_drugiego''";
  27. // Działanie skryptu
  28.  
  29. // Połączenie z bazą
  30. require '../funkcje/database_connect/dbsoft.php';
  31.  
  32. // Sprawdzanie czy istnieje w bazie użytkownik pasujący do konfiguracji 1
  33. $qq = $connection->prepare($sql);
  34. $qq->execute();
  35. $baza = $qq->rowCount();
  36.  
  37. if($baza == 0){
  38. echo '<font class="text-danger">Nie znaleziono.</font>';
  39. }else{
  40.  
  41.  
  42. // Wypisanie danych z bazy
  43. $data = $qq->fetchAll(PDO::FETCH_OBJ);
  44.  
  45. if (!$qq) {
  46. echo "\nPDO::errorInfo():\n";
  47. print_r($dbh->errorInfo());
  48. }
  49.  
  50.  
  51. ?>


Z góry dziękuję za wszelką pomoc smile.gif

Ten post edytował gloweres 14.10.2020, 12:00:59
Go to the top of the page
+Quote Post
SmokAnalog
post 14.10.2020, 12:13:07
Post #2





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

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


Ale nie wszędzie masz prepared statements. Tam, gdzie użyłeś bindParam, ładnie podstawiłeś, chociaż przyczepię się trzech rzeczy:

1. Dlaczego nazywasz pola formularza "1" i "2"?
2. Nie wiem dlaczego ludzie nadużywają bindParam(). Interesuje Cię raczej bindValue(), bo to pierwsze wiąże wartość z referencją, a nie wartością na dany moment. Poczytaj o tym.
3. PDO::PARAM_STR to domyślna wartość, możesz to pominąć, bo wiadomo, że domyślnie jest string.
Go to the top of the page
+Quote Post
viking
post 14.10.2020, 12:16:32
Post #3





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

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


Cytat
'SELECT * FROM account WHERE email="'.$email.'"';

Dlaczego tu już nie ma bindowania? Czemu nie zastosujesz wyjątków zamiast ifów? Dalczego zezwalasz na wiele takich samych maili? W logowaniu iterujesz po wszystkich a i tak korzystasz z ostatniego. Czemu id_user jest w zapytaniu traktowany jako string? Naucz się że zawsze bindujesz parametry nawet jak sam je generujesz, będziesz bezpieczniejszy. Co jeśli mail nie dojdzie?


--------------------
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: 28.03.2024 - 22:51