Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

evitando injeções de MySQL com a classe Zend_Db


Eu escrevi muito do código para os parâmetros do banco de dados e citei no Zend Framework enquanto eu era o líder da equipe do projeto (até a versão 1.0).

Tentei incentivar as melhores práticas sempre que possível, mas tive que encontrar um equilíbrio com a facilidade de uso.

Observe que você sempre pode examinar o valor da string de um Zend_Db_Select objeto, para ver como decidiu fazer cotações.
print $select; // invokes __toString() method

Você também pode usar o Zend_Db_Profiler para inspecionar o SQL que é executado em seu nome por Zend_Db .
$db->getProfiler()->setEnabled(true);
$db->update( ... );
print $db->getProfiler()->getLastQueryProfile()->getQuery(); 
print_r $db->getProfiler()->getLastQueryProfile()->getQueryParams(); 
$db->getProfiler()->setEnabled(false);

Aqui estão algumas respostas para suas perguntas específicas:

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

    Os valores são cotados adequadamente. Embora o "? " se parece com um espaço reservado de parâmetro, neste método o argumento é realmente citado apropriadamente e interpolado. Portanto, não é um parâmetro de consulta verdadeiro. Na verdade, as duas instruções a seguir produzem exatamente a mesma consulta que o uso acima:
    $select->where( $db->quoteInto('last_name=?', $lname) );
    $select->where( 'last_name=' . $db->quote($lname) );
    

    No entanto, se você passar um parâmetro que é um objeto do tipo Zend_Db_Expr , então não é citado. Você é responsável pelos riscos de injeção de SQL, porque é interpolado literalmente, para dar suporte a valores de expressão:
    $select->where('last_modified < ?', new Zend_Db_Expr('NOW()'))
    

    Qualquer outra parte dessa expressão que precise ser citada ou delimitada é de sua responsabilidade. Por exemplo, se você interpolar qualquer variável PHP na expressão, a segurança é sua responsabilidade. Se você tem nomes de colunas que são palavras-chave SQL, você precisa delimitá-los com quoteIdentifier() . Exemplo:
    $select->where($db->quoteIdentifier('order').'=?', $myVariable)
    

  • Zend_Db_Adapter_Abstract::insert( array('colname' => 'value') )

    O nome da tabela e os nomes das colunas são delimitados, a menos que você desative AUTO_QUOTE_IDENTIFIERS .

    Os valores são parametrizados como parâmetros de consulta verdadeiros (não interpolados). A menos que o valor seja um Zend_Db_Expr objeto, nesse caso é interpolado literalmente, para que você possa inserir expressões ou NULL como queiras.

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

    O nome da tabela e os nomes das colunas são delimitados, a menos que você desative AUTO_QUOTE_IDENTIFIERS .

    Os valores são parametrizados, a menos que sejam Zend_Db_Expr objetos, como em insert() método.

    O $where argumento não é filtrado, então você é responsável por quaisquer riscos de injeção de SQL nesse. Você pode usar o quoteInto() para ajudar a tornar a cotação mais conveniente.