SQL Injection védése keresés esetén
Sziasztok!
Fórum üzenet írásakor az adatbázisba feltöltendő kódot a htmlentities($keresettKifejezes,ENT_QUOTES,"UTF-8") és a mysqli_real_escape_string() függvényekkel kódoltam. Ez eddig oké. Jól működik.
De keresés esetén (SELECT * FROM filmek WHERE filmCimek LIKE '%$keresettKifejezes%') olyan gondot okoz, hogy az escape-elt írásjelek miatt nem kapok megfelelő találatot.
Pl. ha egy film címben szerepel az aposztróf (valami'filmcím) akkor ugyanez a keresett kifejezés ez lesz "valami\'filmcím" ugye és ezért nem kapok megfelelő találatot.
Nem tudom mi lenne a megoldás. Hogyan kell ilyenkor eljárni? Köszi!
■ Fórum üzenet írásakor az adatbázisba feltöltendő kódot a htmlentities($keresettKifejezes,ENT_QUOTES,"UTF-8") és a mysqli_real_escape_string() függvényekkel kódoltam. Ez eddig oké. Jól működik.
De keresés esetén (SELECT * FROM filmek WHERE filmCimek LIKE '%$keresettKifejezes%') olyan gondot okoz, hogy az escape-elt írásjelek miatt nem kapok megfelelő találatot.
Pl. ha egy film címben szerepel az aposztróf (valami'filmcím) akkor ugyanez a keresett kifejezés ez lesz "valami\'filmcím" ugye és ezért nem kapok megfelelő találatot.
Nem tudom mi lenne a megoldás. Hogyan kell ilyenkor eljárni? Köszi!
Hogyan kell ilyenkor
Ami a htmlentities() használatát illeti, azt csak megjelenítés előtt kellene alkalmazni, nem adatbázisba írás előtt.
Nem igazán értem, hogy mi a
Egy ilyenért meg eltörik a kezed jobb helyeken...
Az SQL injection védéséről tényleg tanulnod kell még, mert a htmlentities az XSS-re lenne jó, de a htmlspecialchars-t kellene használnod arra is helyette, mert az működik, ez meg nem.
Mire gondoltál
Ez nem megfogalmazás volt,
Arra, hogy nincs SQL escape $keresettKifejezes-en, így lazán injektálható. Használj PDO templateket.
Bind
Ha ilyet használsz, akkor nincs szükség a bemenő adatok escape-elésére amennyire tudom.
Érdemes htmlspecialchars-t
input?
Engem igen, bár igazatok van
wysiwyg
Akkor maradt a
strip_tags
és nemkevés ügyeskedés a js ellen...Hát ha html-t kapnék, akkor
Viszonylag kevés értelme van
Ebben biztos vagy?
IE7-re van, de vannak hasonló
http://ha.ckers.org/xss.html
http://html5sec.org/
Pontosítok
De ha már így terítékre került, megnézek párat. Legjobb lenne vmi olyan (egyszerű) wysiwyg eszközt gyártani, ami nem HTML-t, hanem pl. valami bbcode-félét ad vissza a szervernek, akkor a maradékra mehetne a jó öreg htmlspecialchars, oszt jónapot.
Ezt vitatnám. Miért lenne
Ez kivételesen olyan helyzet, ahol a nyílt forrású kód nagyon előnyös. Ha valaki talál benne egy kiskaput, akkor tud szólni azonnal. Az ilyen kódok egy rakat know how-t gyűjtenek össze, amit neked meg kell szerezni egy egyedi szűrőnél, hogy hasonló szintűt tudj alkotni. Hacsak nem hobbiból csinálod, ennek nem sok értelme van, mert egy csomó feleslegesen ráfordított idő és energia...
A strip tags nem utf-8as fgv, úgyhogy felejtős.
OK, köszi.
Nem éppen:
5.0.0 strip_tags() is now binary safe
Nem kell feltétlenül mb_... fv-nek lennie ahhoz, hogy helyesen adja vissza az ékezetes, stb. maradékot. Eddig nem volt vele problémám, pedig számtalan helyen használtam, ahol még a
default_charset
is utf-8 volt (és minden más is persze).Hmm, én csak abból gondoltam,
Hát ha jól átgondolod, hogy pontosan mire van szükséged, akkor legtöbbször találsz hozzá eszközt. Én meg szoktam nézni, hogy ennek az eszköznek milyen a kódja, aztán a kód minőségéből levonom a következtetést, hogy akarom e használni. (Mondjuk ez általában nálam is nem. :-) ) A purifier-rel az a helyzet, hogy elég jól meghatározott célja van, és sokan ajánlják, tehát nagyon nagy valószínűséggel jól látja el a feladatát. Egy keretrendszert pl sokkal nehezebb lenne így megítélni...
Ad 1. ha úgy állsz hozzá,
Ad 2. ha csak azzal foglalkozol, hogy milyen tagek lehetnek, máris vesztettél. Bármilyen tag alkalmas XSS-re - pl. az onmouseover vagy a style attribútumból tudsz javascriptet futtatni (és akkor a HTML5 felturbózott eseménykezeléséről még nem is beszéltünk).
Ad 3. az a különbség a biztonságtechnika és a legtöbb egyéb terület között, hogy elsőre kell jól csinálni. (Ugye ha elszúrod az SQL optimalizációt, azt onnan veszed észre, hogy lassú a rendszer; ha elszúrod az SQL escape-elést, azt onnan veszed észre, hogy elkezdik az ügyfeleid bankkártyaszámait árulni Ukrajnában. Mire kiderül, hogy egy biztonsági szűrő nem működik, már régen késő.) Tehát jó szűrő az, amit mások már megírtak, és hosszú ideje használnak, és még nem törték fel. (És ugye itt is igaz az, ami a kriptopgráfiában, hogy bárki tud olyan szűrőt írni, amit ő maga nem tud feltörni...)
Ad 4. a komoly szűrők úgy működnek, hogy beparsolják a HTML forrást, felépítenek belőle egy DOM fát, eldobnak mindent, ami nincs fehérlistán, standardizálják a kódolást, aztán a DOM fából új HTML forrást generálnak (ami garantáltan valid, és ezért pontosan tudható, hogy kezelik a böngészők, szemben azzal, ha megengedsz invalid kódot, és azzal is trükközhet a támadó). Egy ilyet megírni nem gyerekjáték; még ha sikerül is (amit kétlek) és biztonságos is lesz (amit még jobban kétlek), rengeteg időd megy el rá, teljesen feleslegesen. Használd a létező eszközöket, azért vanak.
+1
Köszönöm a sok infót,
1.: Nem, én csak megengedett tag-eket engednék, tehát fehérlista, és pont ezért "barátom" a strip_tags.
2.: Igen, emiatt gondoltam valami bbcode-félére, de wysiwyg, mert a felhasználóbarátság... Nyilván ez nem egyszerű feladat, legalábbis még nem láttam ilyen szerkesztőt.
3.: Pont ezt írtam fentebb, hogy ezért nemigazán bízok a mások fejlesztésében - és abban, amit sokan használnak -, mert ha egyszer feltörik, akkor későn fogok tudni róla. Nyilván az, hogy "hosszú ideje használnak, és még nem törték fel" már jóval többet jelent. (A zárójel nagyon tetszik :))
4: Épp most csináltam egy nagyon egyszerű DOM-parsert, mert nem akartam egy, többnyire évente egyszer változó lap kedvéért külön adattáblát csinálni, az egész tartalom egy cím és egy nem-tudjuk-hány-elemű definíciós lista. Jól meg is szi****am vele magam, hogy lehessen még benne
<em>, <q>
és még mindig nem az igazi. És ennél még nem is kell XSS filter sem...Tehát igencsak megfontolom amiket írtál, amint időm engedi, Purifier-tanuló leszek. Remélem, ez kevesebb idő.
Legjobb lenne vmi olyan
Ha lehetőséged van rá (nem kell pl. a biztonságos HTML attribútomok használatát engedni), akkor messze ez a legjobb megoldás (a bbcode nem túl felhasználóbarát, de pl. markdownnal szép is lesz, könnyen kezelhető is lesz, meg jó wysiwyg eszközök is vannak rá.) A HTML szűrők olyan esetekre kellenek, amikor pl. engedni akarod, hogy a user CSS szabályokat használjon (és jól szétbarmolja az oldal designját).
Én bbcode helyett inkább
Egyre tudatlanabbnak érzem magam!
A bbcode-ot nem hagyományos értelemben gondoltam, hanem azt is vmi kliensoldali wysiwyg-el.
Eddig én nem láttam - igaz, nem is nagyon kerestem - markdown-wysiwyg eszközt, van ami tényleg jó? (Nálam a jó kicsi, könnyen kezelhető/beállítható, böngészőfüggetlen, nem kell sokat tudjon, úgyis kikapcsolok rajta sokmindent.)
Egyelőre - hála Istennek - semmi CSS-t nem kell engedjek (nem is szeretnék soha), viszont az jó lehet, ha pl. osztályattribútummal ellátott bekezdések/címek/stb közül is választhat a Júzer. De ennél fontosabb a kis erőforrásigény, láttam már nemíromidemelyik wysiwyg-től behalt FF-t és IE-t is. Persze a vas(ak) is "könnyű" volt.
Bocs, a wysiwyg-en
A wmd már nem létezik,
Én sem tudtam
Ez még friss, de nagyon
IE8 hallo :)
Magyarul?
bip-bip bocsika!
- a demóoldalon IE8 alatt nem működött;
- maga a szerkesztő 70 kB, de viszonylag új jquery-ket igényel (az én igényeimet eddig kielégítette az 1.4 is);
- bár a kódot nem nyálaztam át, de a demóoldalon sok egyéb js is van.
Korábban írtam ezzel kapcsolatban, hogy nekem a kis méret is szempont. A sok (darab) járulékos js-ből, és az újabb jqueryből arra következtetek, hogy összességében "nem elég kicsi". És nálam nagyon-nagyon nagy hátrány az IE8 hiánya is (adott esetben kizáró ok).
Én leginkább olyan eszköznek örülnék, ami "tényleg wysiwyg" (= nem markdown kódokkal formázol, hanem gombokkal), de a szerver felé markdown-t küld; elég neki jquery 1.4 (még jobb, ha nem kell hozzá); és max 70 kB. Lehet, hogy ilyen nincs is, túl álmodozó vagyok. De ha találnék, akkor ezt az egyet használnám.
Ha a gyökerénél fogod meg a
lol
hamar leirtad hadd idezzelek teged :)
Megértettem!
Tehát htmlspecialchars-t használtam ott ahol meg akarom jeleníteni az eredményt (pl. komment üzenetek),
és mysqli_real_escape_string-el ott kódoltam csak ahol az adattal az adatbázisműveletet végzek.
És hát ez is volt a baj tényleg amit mondtatok, hogy a htmlentities-t egyáltalán használtam adatbázis művelethez. Most már a keresőm is jól megy.
Ez a könyv
Már majdnem megvan
Már rá is tettem egy példányra a kezem a neten. Minden bizonnyal napokon belül el is fogom olvasni.