• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Upewnianie się co do poprawności rekordów zwróconych przez mysqli, PDO

Aruba Cloud - Virtual Private Server VPS
0 głosów
203 wizyt
pytanie zadane 22 stycznia 2024 w PHP przez whiteman808 Gaduła (3,430 p.)

Hej, robię funkcję auth_user i zastanawiam się czy rzucać wyjątkiem jak gdzieś przypadkiem funkcja ta znajdzie w bazie danych dwóch użytkowników o takim samym loginie i haśle czy nie przejmować się takimi detalami jak będę robił metody, funkcje itd.?

<?php
require_once 'config/db.php';

function auth_user($username, $password)
{
    try {
        $db_conn = new PDO(PDO_DSN, DB_USER, DB_PASS);
        $stmt = 'SELECT username, passwd ' .
            'FROM author ' .
            "WHERE username = '?' " .
            "AND passwd = '?'";
        $query = $db_conn->prepare($stmt);
        /** @var PDOStatement $user */
        $user = $query->execute([$username, $password]);
        return $user->rowCount() > 0;
    } catch (PDOException $ex) {
        die('An error occurred at auth_user function: ' . $ex->getMessage());
    }
}

 

3 odpowiedzi

+2 głosów
odpowiedź 22 stycznia 2024 przez Wiciorny Ekspert (280,450 p.)
Jesli chodzi o autoryzacje, czy uwierzytelnienie - to już odbywa się na istniejącym użytkowniku, nie ma w takim razie możliwości, biorąc pod uwagę poprawną implementacje, że znajdzie się w bazie taki sam użytkownik, walidacja jest zbędna i nie powinno jej być.

Bo już samo wystąpienie 2 rekordów oznacza błąd i to na poziomie implementacji tworzenia użytkowników, czy też zapisu w bazie.
+1 głos
odpowiedź 22 stycznia 2024 przez Velta Maniak (52,830 p.)

Przypadek znalezienia w bazie danych dwóch użytkowników o tym samym loginie to problem w projekcie bazy danych, nie występujący w procesie jej oprogramowywania.

Aplikacja powinna rzucać wyjątek w momencie próby zarejestrowania się na ten sam login, dlatego pole username powinno posiadać obostrzenie UNIQUE.

jak gdzieś przypadkiem funkcja ta znajdzie w bazie danych dwóch użytkowników o takim samym [...] i haśle

To też brzmi dziwnie dla zaprojektowanej bazy danych.

Istnieje niezerowa szansa, że hasło użytkowników się powtórzy (ponadto ujawnienie takiej informacji sprawi, że użytkownik ze złymi zamiarami może je próbować na znanych loginach użytkowników), a samo sprawdzenie przez algorytmy hashowania dedykowanych hasłom jest zwyczajnie niemożliwe, ponieważ dla tego samego ciągu znaków wygenerowana wartość funkcji skrótu będzie różna.

0 głosów
odpowiedź 22 stycznia 2024 przez Ehlert Ekspert (214,940 p.)
  • Zwykła funkcja która robi coś, szczególnie tak konkretną rzecz, nie powinna wywoływać die.
  • Proponuję użyć jakiejś libki z query builderem, bo sklejanie query w ten sposób jest niebezpieczne i bardzo nieczytelne.
  • Dodaj do bazy UNIQUE na kolumnie z mailem/loginem.
  • Możesz przed insertem nowego usera sprawdzić czy podany email/login w bazie istnieje. Jeśli tak, zwróć odpowiednią informację.
  • Tam gdzie rzucasz exception, rzucaj, nie łap - zakładamy pozytywny scenariusz, więc wszystko powinno być ok. We frameworkach zazwyczaj inna warstwa abstrakcji odpowiada za error handling.
  • W bazie mamy UNIQUE, więc duplikat userów nie powinien się zdarzyć - mimo wszystko ja rzucałbym Exception. Prawdopodobnie nigdy nie poleci, ale jednak wink
komentarz 22 stycznia 2024 przez adrian17 Mentor (352,580 p.)

Proponuję użyć jakiejś libki z query builderem, bo sklejanie query w ten sposób jest niebezpieczne i bardzo nieczytelne.

A ja wiem, widzieć oryginalnego SQLa to jedna z najczytelniejszych rzeczy ;) No i ma ładne placeholdery do argumentów, więc ryzyka też zbytnio nie ma. Tylko to mógłby być multiline string, a nie ciąg konkatenacji per linia.

Jak najbardziej można by długoterminowo użyć buildera lub ORMa, ale to jest często zadanie na skalę przeprojektowania aplikacji, więc trochę duża ta uwaga.

We frameworkach zazwyczaj inna warstwa abstrakcji odpowiada za error handling.

Ale ewidentnie to nie jest framework i tu prawdopodobnie w ogóle nie ma tych warstw, więc nie ma miedzy czym przenosić. Uwaga jest OK, ale to wygląda na razie bardziej jak mikro-skrypt :)

Podobne pytania

0 głosów
3 odpowiedzi 1,938 wizyt
pytanie zadane 2 stycznia 2020 w PHP przez Bartek12 Mądrala (5,510 p.)
0 głosów
1 odpowiedź 299 wizyt
pytanie zadane 20 maja 2019 w PHP przez manager96 Bywalec (2,050 p.)
0 głosów
1 odpowiedź 318 wizyt
pytanie zadane 11 marca 2021 w SQL, bazy danych przez Poczatkujaca s z.o.o Obywatel (1,860 p.)

93,327 zapytań

142,323 odpowiedzi

322,395 komentarzy

62,656 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...