Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: zabezpieczenie injection zbyt dokładne?
Forum PHP.pl > Forum > Bazy danych > MySQL
Dopler
Mam bazę nazwisk z informacjami. Rekordy wywołuję przez zmienną nazwisko=xxxxx

Jednak żeby się zabezpieczyć przed zhakowaniem całej bazy przez wpisanie nazwisko=a% lub nazwisko=a_
stworzyłem ifa

if(!preg_match("/%/", $nazwisko)&&!preg_match("/_/", $nazwisko))

i działa super - tylko że jest zbyt dokładny - bo są nazwiska takie jak d'Haute (z apostrofem)
i to nazwisko jest wyłapywane jako zhakowanie

jest jakiś sposób żeby zostawić zabezpieczenie ale żeby apostrof nie był brany pod uwagę? I skąd ten apostrof skoro skryptu nie uczulałem na niego?

a może to zabezpieczenie robi się inaczej ?

podgląd bazy jest tu: http://powstanie.okiem.pl
trafas
może powinieneś pokombinować z funkcją addslashes questionmark.gif
Dopler
kurcze ... muszę chyba jeszcze raz opisać problem dokładniej - bo przedtem zrobił skrót i widzę że chyba problem leży gdzie indziej

wyszukiwanie mam 2 stopniowe - najpierw wg litery szuka zestawów pierwszych trzech liter
a potem wg tego zestawu szuka nazwisk

nazwisko=d'Haute - działa
ale nie działa wcześniejszy stopień

w tym wcześniejszym stopniu mam jeszcze liczenie znaków
if - wygląda więc tak

if(strlen($lettertwo)==3&&!preg_match("/%/", $lettertwo)&&!preg_match("/_/", $lettertwo)

gdy wywalam strlen - to funkcja działa - a więc to w niej jest coś co chyba nie zlicza apostrofu (a także spacji)
próbowałem z mb_strlen oraz iconv_strlen - i bez rezultatu


melkorm
po prostu wywal wszystkie _ i % - bo jak rozumiem korzystasz z LIKE smile.gif
Dopler
tak korzystam z LIKE - ale nie mogę wywalić _ i % bo wtedy można łatwo wyświetlić wszystkie pozycje bazy - zresztą to działa
problem leży w liczeniu strlen

apostrof liczy jak 2 znaki a spację omija
melkorm
1. Wywalasz % i _, robisz strlen, dodajesz swoje % i _ (w zależności co używasz)
2. Jak źle liczy? może złe kodowanie? może spróbuj mb_strlen ? nigdy nie spotkałem się by strlen mi źle liczył znaki wink.gif (chyba że chodzi o UTF-8)
Dopler
sorry- ale ja po prostu nie rozumiem co znaczy "wywalasz _%" bo przecież to są trzy osobne warunki w bramce logicznej - warunek długości i nie występowania tych znaków


Rozwiązałem problem

  1. if(preg_match("/'/", $lettertwo))
  2. {$sprawdz=4;}
  3. else
  4. {$sprawdz=3;}
  5. if(strlen($lettertwo)==$sprawdz&&!preg_match("/%/", $lettertwo)&&!preg_match("/_/", $lettertwo))


działa - ale czuję że to jest strasznie dookoła - jak siekierą. To chyba powinno być zrobione jakimś kodowaniem ...
Nie jestem pewien czy to wyczerpuje wszystkie możliwości, poza tym nie wiem czy tego i tak nie można jakoś obejść

może jest lepszy sposób?

baza jest w UTF8
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.