SQL injection s podmínkou LIKE
- Maxell92
- Člen | 38
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
- Maxell92
- Člen | 38
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
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
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ě..