sql >> Databáze >  >> RDS >> Mysql

vyhnout se injekcím MySQL pomocí třídy Zend_Db

Napsal jsem hodně kódu pro parametry databáze a citace v Zend Frameworku, když jsem byl vedoucím týmu projektu (až do verze 1.0).

Snažil jsem se podporovat osvědčené postupy, kde to bylo možné, ale musel jsem najít rovnováhu se snadným používáním.

Všimněte si, že vždy můžete prozkoumat hodnotu řetězce Zend_Db_Select objekt, abyste viděli, jak se rozhodlo citovat.

print $select; // invokes __toString() method

Můžete také použít Zend_Db_Profiler ke kontrole SQL, který je spuštěn vaším jménem pomocí Zend_Db .

$db->getProfiler()->setEnabled(true);
$db->update( ... );
print $db->getProfiler()->getLastQueryProfile()->getQuery(); 
print_r $db->getProfiler()->getLastQueryProfile()->getQueryParams(); 
$db->getProfiler()->setEnabled(false);

Zde je několik odpovědí na vaše konkrétní otázky:

  • Zend_Db_Select::where('last_name=?', $lname)

    Hodnoty jsou uvedeny správně. Ačkoli „? “ vypadá jako zástupný symbol parametru, v této metodě je argument ve skutečnosti vhodně citován a interpolován. Nejde tedy o skutečný parametr dotazu. Následující dva příkazy ve skutečnosti vytvářejí přesně stejný dotaz jako výše uvedené použití:

    $select->where( $db->quoteInto('last_name=?', $lname) );
    $select->where( 'last_name=' . $db->quote($lname) );
    

    Pokud však předáte parametr, který je objektem typu Zend_Db_Expr , pak to není citováno. Jste zodpovědní za rizika vložení SQL, protože je doslovně interpolován, aby podporoval hodnoty výrazu:

    $select->where('last_modified < ?', new Zend_Db_Expr('NOW()'))
    

    Jakákoli jiná část tohoto výrazu, kterou je třeba citovat nebo oddělit, je vaší odpovědností. Pokud například do výrazu interpolujete jakékoli proměnné PHP, za bezpečnost odpovídáte vy. Pokud máte názvy sloupců, které jsou klíčovými slovy SQL, musíte je sami oddělit pomocí quoteIdentifier() . Příklad:

    $select->where($db->quoteIdentifier('order').'=?', $myVariable)
    
  • Zend_Db_Adapter_Abstract::insert( array('colname' => 'value') )

    Pokud nevypnete AUTO_QUOTE_IDENTIFIERS, jsou názvy tabulek a názvy sloupců odděleny .

    Hodnoty jsou parametrizovány jako skutečné parametry dotazu (neinterpolované). Pokud hodnota není Zend_Db_Expr objekt, v takovém případě je interpolován doslovně, takže můžete vkládat výrazy nebo NULL nebo cokoli jiného.

  • Zend_Db_Adapter_Abstract::update( array('colname' => 'value'), $where )

    Pokud nevypnete AUTO_QUOTE_IDENTIFIERS, jsou názvy tabulek a názvy sloupců odděleny .

    Hodnoty jsou parametrizované, pokud to nejsou Zend_Db_Expr objektů, jako v insert() metoda.

    $where argument není vůbec filtrován, takže jste odpovědní za všechna rizika vložení SQL v tomto případě. Můžete použít quoteInto() metoda, která vám pomůže učinit citování pohodlnějším.



  1. jak pracovat s rekurzivním dotazem v MySql?

  2. Sloučit dva sloupce ze dvou tabulek do jedné

  3. Jak se připojit k databázi MySQL z aplikace pro Android?

  4. Jak UTC_DATE() funguje v MariaDB