SQL injection s podmínkou LIKE

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Maxell92
Člen | 38
+
0
-

Ahoj,

objevil jsem divný bug a nevím, co dělám špatně. Mám fulltextové vyhledávání – example.com/search?expression=xx. Pokud dám vyhledat například apostrof, projde mi přímo do SQL dotazu:

search/?expression=aa%25')+AND+1%3D1' (= stringu aa%') AND 1=1'%')
SQL:

SELECT COUNT(`id`)
FROM `page`
WHERE (`page_language`.`title` LIKE '%aa%') AND 1=1'%')

Vyzkoušel jsem postupně toto (SQL se drobně liší, ale vždy projde do DB neescapovaný dotaz):

where(':page_language.title', new SqlLiteral("LIKE '%$expression%'"));
where(':page_language.title', new SqlLiteral("LIKE '%?%'", array($expression)));
where(":page_language.title LIKE '%?%'", $expression);
where(":page_language.title LIKE '%$expression%'");

Jak to napíšu správně? Dost mě to zaskočilo, vůbec mě nenapadlo, že mi toto Nette neohlídá.
Používám aktuálně Nette 2.1.0

norbe
Backer | 405
+
+4
-

Nette bohužel těžko ohlídá to, aby jsi to zapsal dobře..

Správně by mělo být:

where(':page_language.title LIKE ?', "%$expression%");
Jack06
Člen | 168
+
0
-

Pokud vím, tak toto právě z nějakého důvodu nefungovalo (špatně to escapovalo právě ty procenta tuším), nevím jestli jen ve starší verzi, ale vím, že mi toto někde nešlo.

norbe
Backer | 405
+
0
-

Používal jsem to ještě dřív než byla final verze 2.1 a neměl jsem problém. Spíš si myslím, že jsi použil nějakou podobnou zkomoleninu jako v tom prvním příspěvku…

Maxell92
Člen | 38
+
0
-

Díky, tohle funguje. Asi by bylo vhodné to sepsat do https://doc.nette.org/cs/database. Nebo je nějaká stránka, kde podobné věci už jsou? Třeba používám ještě něco špatně..

Mysteria
Člen | 797
+
0
-

Jack06 napsal(a):

Pokud vím, tak toto právě z nějakého důvodu nefungovalo (špatně to escapovalo právě ty procenta tuším), nevím jestli jen ve starší verzi, ale vím, že mi toto někde nešlo.

Špatné oescapování vzniká tímto nesprávným použitím:

->where('column LIKE %?%', 'whatever');

Editoval Mysteria (17. 7. 2014 0:05)

vvoody
Člen | 910
+
0
-

Maxell92 napsal(a):

Díky, tohle funguje. Asi by bylo vhodné to sepsat do https://doc.nette.org/cs/database. Nebo je nějaká stránka, kde podobné věci už jsou? Třeba používám ještě něco špatně..

https://doc.nette.org/…ase/explorer#…