Van Pytel
23.10.2010, 11:19:50
Jak mozna stworzyc wyszukiwarke w ktorej mozna wpisywac jakies wyrazenie regularne, a potem wyszukac w bazie?
Przyklad:
Mam strone a na niej wyszukiwarke, ktora szuka userow. Wpisuje w wyszukiwarce .arek
W mysql wyszuka i dostane rekordy:
Marek Darek itp.
Jak to mozna wykonac? Tak aby bylo zabezpieczone przed jakimis atakami np SQL injection. I mozna bylo korzystac z normalnych slow i regex?
Niestety slabo znam sie na regex i nie mam pojecia jak to wykonac.
Dzieki za odpowiedz.
konrados
23.10.2010, 12:46:46
A czemu nie użyć sql keyword : "LIKE" ?
http://www.htmlite.com/mysql011.phpa w ogóle to masz też słowo REGEXP, np:
SELECT name FROM tableName WHERE name REGEXP '^A'
A przed sql injection się zabezpieczysz tak jak zwykle - escapując cydzysłowia
Van Pytel
23.10.2010, 19:07:14
No tak, tylko regex tez bym musial jakos zabezpieczyc. Bo mozna stworzyc regex tak aby obejsc i zaatakowac.
konrados
23.10.2010, 20:37:26
Jeśli użyjesz go do funk. select i zamienisz wszelkie ' na \' a " na \" to nie wiem jakby można to było zaatakować.
Ale może ktoś mądrzejszy się wypowie?
Crozin
23.10.2010, 20:43:14
Można by napisać takie wyrażenie, które zabije bazę danych.
konrados
23.10.2010, 21:21:39
@Crozin
Chodzi Ci o to, że byłoby strasznie czasochłonne czy coś poważniejszego?
Crozin
23.10.2010, 21:28:15
A to nie jest wystarczająco poważne?
konrados
23.10.2010, 21:30:33
No nie aż tak jak jakiś sql injection

A dałoby się zapisać taki killer-expression w np. 10 znakach? Bo jak nie, to zabezpieczeniem mogłoby być ograniczenie stringa do 10. No chyba, że się da...
Pewnie się da. Ale gdyby tak już nie zastanawiając się jakie znaki tak na prawdę musimy ograniczyć zrobić:
$search = preg_replace('/\\\/', '', $search); // usuwamy backslashe $search = preg_replace('/[^a-zA-Z\s]/', '\\\${0}', $search); backslashujemy wszystko co nie jest literami ani spacjami
?
Van Pytel
24.10.2010, 11:07:45
@bmL ale tez trzeba pamietac o polskich literach (ż ć ś itd). A tez sa czasem w nickach spacje lub podkreslenia.
W sumie racja ale tak na prawdę: RAGEXP 'Wózek napędowy' == RAGEXP '(.*)W\ózek nap\ędowy(.*)' == RAGEXP '(.*)\W\ó\z\e\k \n\a\p\ę\d\o\w\y(.*)'. No i np. jak napisze sobie $search = '(.*)' to wyszukane będzie RAGEXP '(.*)\(\.\*\)(.*)\'.
Popraw mnie jeżeli się mylę, ale tak powinno być jakoś nie mam ochoty sprawdzać
Van Pytel
24.10.2010, 15:36:39
Ja slabo sie znam na regex wiec malo w tej kwestii moge sie wypowiedziec, dlatego zrobilem ten temat, jak to ugryzc. Najgorzej zaczac, a potem jakos leci.
tehaha
24.10.2010, 15:48:13
ale czy na pewno takie coś byłoby przydatne, no bo ilu użytkowników zna wyrażenia regularne? wydaje mi się, że lepiej stworzyć jakiś uproszczony system np.
#Darek zostanie zamienione na WHERE user_name LIKE %Darek
#Darek# -> WHERE user_name LIKE %Darek%
(Darek|Arek) -> WHERE user_name = 'Darek' OR user_name = 'Arek'
itp.
znając życie to nawet z takim czymś połowa użytkowników już by sobie nie radziła
Van Pytel
24.10.2010, 16:09:00
Trzeba byc innowacyjny
A zawsze czegos czlowiek nauczyc sie.
Poradnik mozna userom napisac.
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.