Mysql
 sql >> база данни >  >> RDS >> Mysql

избягване на MySQL инжекции с класа Zend_Db

Написах голяма част от кода за параметрите на базата данни и цитирането в Zend Framework, докато бях ръководител на екипа за проекта (до версия 1.0).

Опитах се да насърчавам най-добрите практики, където е възможно, но трябваше да намеря баланс с лекота на използване.

Имайте предвид, че винаги можете да проверите стойността на низа на Zend_Db_Select възразите, за да видите как е решил да направи цитиране.

print $select; // invokes __toString() method

Също така можете да използвате Zend_Db_Profiler за да проверите SQL, който се изпълнява от ваше име от Zend_Db .

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

Ето някои отговори на вашите конкретни въпроси:

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

    Стойностите са цитирани по подходящ начин. Въпреки че „? " изглежда като заместител на параметър, в този метод аргументът всъщност се цитира по подходящ начин и се интерполира. Така че това не е истински параметър на заявката. Всъщност следните две изрази произвеждат точно същата заявка като горната употреба:

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

    Ако обаче предадете параметър, който е обект от тип Zend_Db_Expr , тогава не се цитира. Вие носите отговорност за рисковете от инжектиране на SQL, тъй като е интерполирано дословно, за да поддържа стойностите на израза:

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

    Всяка друга част от този израз, която трябва да бъде цитирана или разграничена, е ваша отговорност. Например, ако интерполирате PHP променливи в израза, безопасността е ваша отговорност. Ако имате имена на колони, които са ключови думи на SQL, трябва сами да ги разделите с quoteIdentifier() . Пример:

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

    Името на таблицата и имената на колоните са разделени, освен ако не изключите AUTO_QUOTE_IDENTIFIERS .

    Стойностите се параметризират като истински параметри на заявката (не интерполирани). Освен ако стойността не е Zend_Db_Expr обект, в който случай е интерполиран дословно, така че можете да вмъквате изрази или NULL или каквото и да е.

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

    Името на таблицата и имената на колоните са разделени, освен ако не изключите AUTO_QUOTE_IDENTIFIERS .

    Стойностите са параметризирани, освен ако не са Zend_Db_Expr обекти, както в insert() метод.

    $where аргументът изобщо не се филтрира, така че вие ​​носите отговорност за всички рискове от SQL инжектиране в този. Можете да използвате quoteInto() метод, който да ви помогне да направите цитирането по-удобно.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Защо не мога да използвам променлива като име на таблица в съхранена процедура?

  2. Извличане на ТОП 10 реда, без да използвате TOP или LIMIT? – Въпрос за интервю на седмицата #247

  3. MySQL инсталира и зарежда база данни на скрипт Inno Setup

  4. Грешка при стартиране на MySQL сървъра „Сървърът излезе без актуализиране на PID файл“

  5. Преобразувайте двоичен в десетичен с помощта на MySQL