• 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

Object Storage Arubacloud
0 głosów
97 wizyt
pytanie zadane 22 stycznia w PHP przez whiteman808 Obywatel (1,820 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 przez Wiciorny Ekspert (270,230 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 przez Velta Maniak (52,370 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 przez Ehlert Ekspert (212,710 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 przez adrian17 Ekspert (344,860 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,195 wizyt
pytanie zadane 2 stycznia 2020 w PHP przez Bartek12 Mądrala (5,510 p.)
0 głosów
1 odpowiedź 243 wizyt
pytanie zadane 20 maja 2019 w PHP przez manager96 Bywalec (2,050 p.)
0 głosów
1 odpowiedź 181 wizyt
pytanie zadane 11 marca 2021 w SQL, bazy danych przez Poczatkujaca s z.o.o Obywatel (1,860 p.)

92,583 zapytań

141,434 odpowiedzi

319,668 komentarzy

61,966 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...