Mysql
 sql >> Baza danych >  >> RDS >> Mysql

unikanie wstrzyknięć MySQL z klasą Zend_Db

Napisałem dużo kodu do parametrów bazy danych i cytowania w Zend Framework, gdy byłem kierownikiem zespołu nad projektem (do wersji 1.0).

Tam, gdzie to możliwe, starałem się zachęcać do najlepszych praktyk, ale musiałem zachować równowagę z łatwością użytkowania.

Pamiętaj, że zawsze możesz sprawdzić wartość ciągu Zend_Db_Select obiekt, aby zobaczyć, jak zdecydowała się na cytowanie.

print $select; // invokes __toString() method

Możesz także użyć Zend_Db_Profiler aby sprawdzić SQL, który jest uruchamiany w Twoim imieniu przez Zend_Db .

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

Oto kilka odpowiedzi na Twoje konkretne pytania:

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

    Wartości podane są odpowiednio. Chociaż „? " wygląda jak symbol zastępczy parametru, w tej metodzie argument jest właściwie cytowany i interpolowany. Więc nie jest to prawdziwy parametr zapytania. W rzeczywistości następujące dwie instrukcje tworzą dokładnie to samo zapytanie, co powyższe użycie:

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

    Jeśli jednak podasz parametr, który jest obiektem typu Zend_Db_Expr , to nie jest cytowane. Odpowiadasz za ryzyko związane z wstrzyknięciem SQL, ponieważ jest ono interpolowane dosłownie w celu obsługi wartości wyrażeń:

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

    Każda inna część tego wyrażenia, którą należy zacytować lub odgraniczyć, jest Twoją odpowiedzialnością. Np. jeśli interpolujesz jakieś zmienne PHP do wyrażenia, bezpieczeństwo jest Twoim obowiązkiem. Jeśli masz nazwy kolumn, które są słowami kluczowymi SQL, musisz je rozgraniczyć za pomocą quoteIdentifier() . Przykład:

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

    Nazwa tabeli i nazwy kolumn są rozdzielone, chyba że wyłączysz AUTO_QUOTE_IDENTIFIERS .

    Wartości są sparametryzowane jako prawdziwe parametry zapytania (nie interpolowane). Chyba że wartością jest Zend_Db_Expr obiekt, w którym to przypadku jest interpolowany dosłownie, więc możesz wstawić wyrażenia lub NULL czy cokolwiek.

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

    Nazwa tabeli i nazwy kolumn są rozdzielone, chyba że wyłączysz AUTO_QUOTE_IDENTIFIERS .

    Wartości są sparametryzowane, chyba że są to Zend_Db_Expr obiekty, jak w insert() metoda.

    $where Argument nie jest w ogóle filtrowany, więc odpowiadasz za wszelkie ryzyko związane z wstrzyknięciem SQL. Możesz skorzystać z quoteInto() metoda, dzięki której wycena jest wygodniejsza.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Problem MYSQL INSERT SELECT

  2. Jak uzyskać listę miesięcy między dwiema datami w mysql

  3. PDF utworzony za pomocą FPDF oraz jak zapisać i pobrać plik pdf

  4. Najłatwiejszy sposób na przekonwertowanie obiektu Blob na tablicę bajtów

  5. ZAŁADUJ INFILE DANYCH na zdalnym komputerze