tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

Omlouváme se, provoz fóra byl ukončen

Zjistil jsem moznost SQL injection v Dibi

před 9 lety

tomas.krejci
Člen | 5

Resil nekdo z vas uz tohle?

$var = ‚neco-co-obsahuje-*/-znaky‘;

dibi::fetch(‚
SELECT *
FROM tabulka
WHERE podminka1
%if‘, nesplnenapodminka, ‚AND sloupec = %s‘, $var, ‚%end
AND podminka2
‘);

Vysledek, ktery se posila do SQL, je tento query vcetne komentaru:

SELECT *
FROM tabulka
WHERE podminka1
/* AND … = ‚neco-co-obsahuje-*/-znaky‘ */
AND podminka2

coz se vyhodnoti jako syntax error.
Diky za Vase postrehy.

Editoval tomas.krejci (23. 1. 2011 12:39)

před 9 lety

HosipLan
Moderator | 4693

Jestli si dobře pamatuju, pokud se podmínka nesplní, dibi nepřekládá obsah modifikátorů podmínky, ale místo nich doplní „...“. Řekl bych proto, že spíše vygeneruje něco jako

SELECT * FROM tabulka WHERE podminka1 /* AND sloupec = ... */ AND podminka2

Testoval jsi to vůbec?

PS: Příště používej zvýrazňování kódu, kdo se má v těch uvozovkách vyznat! (je to druhé tlačítko na tom panelu s nástroji na formátování textu příspěvku zprava"

Editoval HosipLan (23. 1. 2011 15:46)

před 9 lety

tomas.krejci
Člen | 5

Samozrejme jsem to testoval, jinak bych sem nepsal. Tri tecky tam dava podle me kdyz je podminka „zbytecne“ dlouha (do zdrojaku jsem nekoukal). Test vypise tohle (a fetch to same):

SELECT *
FROM tabulka
WHERE podminka1
/* AND sloupec = 'neco-co-obsahuje-*/-znaky' */
AND podminka2

před 9 lety

HosipLan
Moderator | 4693

Ok tak jsem to taky vyzkoušel a potvrzují.

Založil jsem issue https://github.com/…ues/issue/30

Editoval HosipLan (24. 1. 2011 8:39)

před 9 lety

Milo
Nette Core | 1119

Také ověřeno. Prozatimně jsem si fixnul jako:

/* DibiTranslator.php:183 */
public function formatValue($value, $modifier)
{
    if ($value instanceof Traversable) {
        $value = iterator_to_array($value);
    }

    /* hotfix begin */
        if( $this->ifLevelStart > 0 )
    {
        return '...';
    }
    /* hotfix end */

    if (is_array($value)) {
        $vx = $kx = array();
        ......

Editoval Milo (24. 1. 2011 10:38)

před 9 lety

HosipLan
Moderator | 4693

poslal jsem pull s podobným fixem https://github.com/dg/dibi/pull/31

před 9 lety

David Grudl
Nette Core | 6806

Díky za fix, komitnuto.