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

Sql Injection Wyrażenia Regularne

+1 głos
585 wizyt
pytanie zadane 3 czerwca 2021 w PHP przez karoloo Użytkownik (530 p.)

Witam. Zastanawiam się czy takie wyrażenia regularne w formularzu rejestracji wystarczą do zabezpieczenia przed sqlinjection, czy należało by coś jeszcze dodać. Z góry dziękuje za odpowiedź :)

<?php
    if(isset($_POST['login']) && isset($_POST['password']) && isset($_POST['repassword']) && isset($_POST['email'])){
        $login = $_POST['login'];
        $haslo = $_POST['password'];
        $haslo2 = $_POST['repassword'];
        $email = $_POST['email'];

        // Walidacja danych
        $errorLogin = false;
        $errorPass1 = false;
        $errorPass2 = false;
        $errorEmail = false;
        $error = false;
        $errorMessageLogin = "Login powinien zawierac od 3 do 15 małych liter, bez znaków specjalnych!";
        $errorMessagePass1 = "Hasło powinno zawierać od 5 do 30 znaków!";
        $errorMessagePass2 = "Hasła nie są identyczne!";
        $errorMessageEmail = "Niepoprawny E-mail!";

        // Login
        $wzorzecLogin = "/^[a-z]{4,16}$/";
        if(preg_match($wzorzecLogin,$login)){

        }else{
            $errorLogin = true;
            $error = true;
        }

        //Hasło
        $dlugoscHasla = strlen($haslo);
        echo $dlugoscHasla;
        if($dlugoscHasla>30 || $dlugoscHasla<5){
            $errorPass1 = true;
            $error = true;
        }
        // Hasło2
        if($haslo!=$haslo2){
            $errorPass2 = true;
            $error = true;
        }
        //E-mail
        $wzorzecEmail = '/^([a-z|A-Z|0-9]{4,20})@([a-z|A-Z|0-9]{2,10})\\.(pl|gr|com)$/';
        if(preg_match($wzorzecEmail,$email)){
            echo 'poprawny';
        }else{
            $errorEmail = true;
            $error = true;
        }


        // Koniec Walidacji
        
    }
?>

 

2 odpowiedzi

+1 głos
odpowiedź 3 czerwca 2021 przez _Pita_ Stary wyjadacz (11,410 p.)
wybrane 12 czerwca 2021 przez karoloo
 
Najlepsza
Twoja ochrona polega na możliwości wpisania wyłącznie tych znaków: "/^[a-z]{4,16}$/" . Z tego co rozumiem ten kod, wpisanie tradycyjnego " abc' OR 1=1 -- " ze względu na duże litery rzeczywiście niewiele da, ale za to nie będzie można używać wielkich liter co jest dość wysoką ceną....

Polecam użyć chociaż funkcji htmlentities() lub bliźniaczej - htmlspecialchars() a następnie mysqli_real_escape_string()

Nie jest to świetna obrona, ale na pewno lepsza...
komentarz 3 czerwca 2021 przez Comandeer Guru (607,060 p.)
Ale wycięcie encji HTML nie za bardzo pomaga na SQL injection (np. podany przez Ciebie string nie ma nic, co zostanie wycięte).

Samo wycięcie dużych liter też nie daje jakiejkolwiek ochrony, bo SQL jest case-insensitive.
komentarz 4 czerwca 2021 przez Comandeer Guru (607,060 p.)

Jak już używasz mysqli_real_escape_string, to nie musisz robić dodatkowej filtracji, bo nijak to nie wpłynie na bezpieczeństwo bazy danych. Zresztą i tak o wiele lepiej użyć prepared statements.

komentarz 4 czerwca 2021 przez _Pita_ Stary wyjadacz (11,410 p.)

A czy gdyby ustawić funkcję htmlentities() na ENT_QUOTES, czy w przypadku przytoczonego stringa, czy nie zostałoby "wykonane" bezużyteczne dla hakera:

" abc &#039 OR 1=1 -- "?

Edit: Fakt, w obliczu mysqli_real_escape_string() nie za dużo to zmieni, ale jak wiesz taki był mój pierwotny zamysł, więc zdecydowałem się zostawić obie te funkcje.

komentarz 5 czerwca 2021 przez Comandeer Guru (607,060 p.)

A czy gdyby ustawić funkcję htmlentities() na ENT_QUOTES, czy w przypadku przytoczonego stringa, czy nie zostałoby "wykonane" bezużyteczne dla hakera:

" abc &#039 OR 1=1 -- "?

 W teorii tak. Tylko że sposobów na zrobienie SQLi jest cała masa. I któryś w końcu zadziała.

+6 głosów
odpowiedź 3 czerwca 2021 przez adrian17 Mentor (354,120 p.)
Nie, podchodzisz do tego od kompletnie złej strony :(

Po pierwsze, Twoja walidacja jest w najlepszym przypadku kontrowersyjna, w najgorszym bezsensowna. Same małe litery w loginie? Max 30 znaków hasła? Walidacja maila jest taka sztywna, że nie przepuści jan.kowalski@gmail.com albo @morele.net . Po co to wszystko, jak są gotowe funkcje do walidowania maila (ale wielu też uważa, że najprostszą walidacją jest tylko sprawdzić czy ma małpę po czym po prostu spróbować wysłać maila na ten adres - jak user aktywuje konto tym mailem, to walidacja z definicji przeszła :) ).

Po drugie, nic co tutaj napisałeś nie ma związku z poprawnym zabezpieczeniem przed SQL injection. Wszystko co musisz zrobić to bindować argumenty zamiast sklejać stringi - i tyle, koniec. Walidacja może się przydać do innych celów, ale nie do tego.
1
komentarz 3 czerwca 2021 przez Comandeer Guru (607,060 p.)

Podobne pytania

0 głosów
1 odpowiedź 223 wizyt
pytanie zadane 3 czerwca 2020 w PHP przez Klaudiaaa Początkujący (390 p.)
0 głosów
1 odpowiedź 304 wizyt
pytanie zadane 24 kwietnia 2018 w PHP przez Browarnik123 Użytkownik (830 p.)
+1 głos
1 odpowiedź 292 wizyt

93,427 zapytań

142,421 odpowiedzi

322,649 komentarzy

62,787 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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...