Qual é a melhor maneira de usar mysql_real_escape_string e htmlspecialchars ao salvar dados no CakePHP?
-
12-09-2019 - |
Pergunta
Eu estou usando FCKEditor com CakePHP e quando eu salvar os dados enviados a partir do editor, eu quero correr os htmlspecialchars () e mysql_real_escape_string () funções nos dados para limpá-lo antes de armazená-lo em meu banco de dados. O problema é que eu não sou realmente certo onde fazer isso dentro do framework CakePHP. Tentei no controlador como este:
function add()
{
if (!empty($this->data))
{
if ($this->Article->save(mysql_real_escape_string(htmlspecialchars($this->data))))
{
$this->Session->setFlash('Your article has been saved.');
$this->redirect(array('action' => 'index'));
}
}
}
No entanto $ this-> dados é uma matriz e essas funções esperam cordas de modo que não vai funcionar. Eu faço isso na matriz de validação do modelo? Eu não faço ideia. Além disso, deixe-me saber se correr htmlspecialchars () dentro de mysql_real_escape_string () não é uma boa prática.
Solução
Não use htmlspecialchars()
quando você Salvar de dados, usá-lo quando você saída dados para HTML. E se você precisa de olhar para os dados em algum contexto diferente do HTML?
Também eu não sou um usuário do bolo, mas eu ficaria surpreso se você precisa aplicar mysql_real_escape_string()
como você salvar dados de qualquer um. A camada de acesso a banco de dados deve protegê-lo contra injeção de SQL, e ao fazê-lo manualmente você vai acabar armazenando cadeias duplamente escaparam.
Outras dicas
A resposta curta e simples é - se o acesso ao banco foi abstraída, não há necessidade de você chamar essas funções em tudo.
O único lugar onde eles são necessários é se você construir SQL real a partir de pedaços de cordas. Que você não deve fazer de qualquer maneira, mas isso é outra história.
A linha inferior é -. A estrutura vai fazer a coisa certa, não interferem
EDIT:. Como Bill Karwin assinala - htmlspecialchars()
é do departamento completamente errado aqui
Se você está construindo suas próprias cordas SQL com CakePHP, então CakePHP fornece a função de escape:
escape(string $string, string $connection)