Proste zapytania do wykrycia prób ataków sql injection

0

Cześć

Mam problem dostałam na studiach program do napisania który będzie wykrywał próby dostania się na stronę za pomocą ataków sql injection.
Udało mi się zrobić podstawowe logowanie z bazą danych ale nie wiem jak powinny wyglądać zapytania w kodzie.
Chciałabym to zrobić np
if (login or haslo posiada spacje) => wypisz komunikat
if(login or haslo posiada %) => wypisz komunikat
if(login or haslo posiada więcej niż X znaków) => wypisz komunikat

Czy pomoże mi ktoś jakoś te warunki napisać czy trzeba umieścić jakieś funkcje sprawdzające?
Będę wdzięczna za wskazówki.

2

Kardynalny błąd! Powinno się pisać odporny kod, a nie tworzyć dziury i zabezpieczać je asercjami. Do połączenia się z bazą danych możesz użyć np. popularnej w PHP biblioteki PDO, od dawna jest w standardzie. Zapytanie wygląda wtedy tak:

$query = $pdo->prepare('INSERT INTO uzytkownicy SET login = :login, haslo = :haslo, costam = :costam');
$query->bindValue(':login', $_POST['login']);
$query->bindValue(':haslo', $_POST['haslo']);
$query->bindValue(':costam', $_POST['costam']);
$query->execute();

Używając takiego cuda nie ma opcji, że ktoś ucieknie z zapytania i zrobi coś złego. Przynajmniej nie ma w aż tak prostym przypadku.
Istnieją też ORMy, które idą jeszcze o parę kroków dalej i są znacznie bardziej idiotoodporne niż wszystko inne. Pozbywamy się wtedy problemu sql injection mimochodem - biblioteka sama zadba o to, żeby wszystko odbyło się bezpiecznie jeśli tylko odpowiednio jej użyjemy, nie ma sensu wynajdywać koła na nowo.

0

Autor nie chce zabezieczac strony przed injection, on chce je wykrywac. Wiec Twoj post jest niejako nie na temat.

0

Rozumiem intencje tylko właśnie nie mam do zrobienia strony dobrze zabezpieczonej a stronę która wykazuje próby wstrzykiwania kodu.
zrobiłam dziś coś takiego:

$abc="SELECT id FROM uzytkownicy WHERE login LIKE '$login' AND haslo LIKE '$haslo'";

$test = strpos($abc, '%');

if ($test === false) {
echo "wszystko ok";
} else {
echo "możliwa próba ataku";
}

nie wiem tylko na ile te odpowiedzi pozwolą a ile innych szczelin zostanie "bez pokrycia".

0

To zależy od tego co nazwiesz próbą wstrzyknięcia kodu. Generalnie powinnaś porównywać zmienne, nie gotowe zapytanie. Skoro wrzucasz login i hasło w apostrofy, to postaraj się, by nie dało się uciec z tych apostrofów. Sprawdź tylko zawartość podstawianych zmiennych.

Powinnaś wykrywać przede wszystkim:

  • znaki ' oraz \
  • prefiksy unicode
0
Demonical Monk napisał(a):

Powinnaś wykrywać przede wszystkim:

  • znaki ' oraz \
  • prefiksy unicode

Właśnie a przy tych znakach trzeba użyć innego zapytania/funkcji ? Ponieważ w moim kodzie znaki typu % czy litery wykrywa i sygnalizuje a w przypadku który opisałeś wyżej wyrzuca komunikat o błędzie.

PS.Dzięki za formatkę kodu wyżej

0

O właśnie! Nie używaj LIKE tam gdzie nie trzeba! Jeśli użyjesz operatora przypisania, czyli że tak:

$abc="SELECT id FROM uzytkownicy WHERE login = '$login' AND haslo = '$haslo'";

To będzie można olać znak %, jako, że przy użyciu operatora przypisania nie działają wildcardy. Zrób analogicznie tak jak robiłaś:

if (strpos($login, '\'') === false || strpos($login, '\\') === false) {
   exit('wtf próba włamania');
}

I tak samo z hasłem. Przed prostymi atakami ochroni.

0

Dzięki za uproszczenie zapytania tylko kiedy daję '\' czy '` to albo nie łapie albo w przypadku '` nawet kiedy brak ' wyrzuca atak co jest pewnie związane z samym zapytaniem można to jakoś ominąć (może tylko sprawdzać login i hasło bez całego zapytania tylko jak).

0

No tak jak wkleiłem? Sprawdzaj zmienne $login i $haslo, nie zmienną $abc.

0

Aa mój błąd już działa :)

0

Dodatkowo co będzie, jak użytkownik używa programu do generowania haseł? Przykładowo Password Safe ma domyślny zestaw znaków specjalnych złożony z +-=_@#$%^&;:,.<>/~\[](){}?!|. Czy jak taka funkcja zobaczy niedozwolony znak, to znaczy, że użytkownik chce się włamać? Choć i tak strona, która przechowuje hasło w plaintekscie pewnie nie jest warta rejestracji.

0

w grę wchodzą znaki \ ' " poza tym reszta nie wywoła błędu, poza tym już n00bki używają htmlspecialchars_decode i htmlspecialchars co praktycznie eliminuje zagrożenie injection ;]

0

Mam prośbę jak powinny wyglądać funkcje/wyrażenia regularne do wykrycia np select*from lub spacji ?(chodzi o to aby w echo pokazalo tekst o probie ataku)

1 użytkowników online, w tym zalogowanych: 0, gości: 1