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

Qual é a maneira mais segura de adicionar html/css/js ao mysql?


Sim, o MySQL pode armazenar qualquer tipo de texto com segurança técnica. O que significa que o MySQL salvará o texto como está e o retornará novamente sem perder nenhum dado.

Mysql não difere entre o conteúdo do texto, então não faz diferença se for HTML, CSS, código JS ou o último e-mail de seus amigos.

No entanto, se você produzir o texto mais tarde, deve tomar cuidado para que não haja injeção de código indesejada depois de extrair os dados do mysql. Mas isso não está relacionado ao MySQL, na verdade.

Para tornar seu sql mais seguro, passe o identificador do banco de dados para mysql_real_escape_string ou ainda melhor, use MySQLi e/ou PDO e declarações preparadas.

Seu código


Seu código parece que você está tentando muito evitar algo, mas no final acaba sendo bastante inútil:
function filter($data) {
$data = trim(htmlentities(strip_tags($data)));

if (get_magic_quotes_gpc())
    $data = stripslashes($data);
    $data= strip_tags($data);

$data = mysql_real_escape_string($data);

return $data;}

Normalize os dados antes de processá-los


Em primeiro lugar, você deve alterar a posição da verificação para get_magic_quotes_gpc para normalizar os dados em que a função está trabalhando. Seria ainda melhor se seu aplicativo não dependesse disso, mas apenas negasse funcionar se essa opção estiver ativada - veja esta informação importante aqui sobre isso se você se preocupa com a segurança.

Mas para a segurança do seu código postado, vamos primeiro normalizar o valor de entrada para a função antes de processá-lo ainda mais. Isso é feito movendo a verificação para o topo da função.
function filter($data)
{
   // normalize $data because of get_magic_quotes_gpc
   $dataNeedsStripSlashes = get_magic_quotes_gpc();
   if ($dataNeedsStripSlashes)
   {
     $data = stripslashes($data);
   }

   // normalize $data because of whitespace on beginning and end
   $data = trim($data);

   // strip tags
   $data = strip_tags($data);

   // replace characters with their HTML entitites
   $data = htmlentities($data);

   // mysql escape string    
   $data = mysql_real_escape_string($data);

   return $data;
 }

Nesta função modificada, as citações mágicas (que você não deve usar) foram movidas para o topo. Isso garante que, independentemente de essa opção estar ativada ou desativada, os dados sempre serão processados ​​da mesma forma. Sua função não fez isso, ela teria criado resultados diferentes para os mesmos dados passados. Então isso foi corrigido.

Mais problemas com sua função


Mesmo a função parece melhor agora, ainda tem muitos problemas. Por exemplo, não está claro o que a função realmente faz. Ele faz muitas coisas ao mesmo tempo e algumas delas são contraditórias:
  • Remove tags HTML que são um sinal de que $data não deve conter HTML
  • Mas então você converte o texto de $data para realmente conter entidades HTML.

Então, quais devem ser os dados? HTML ou não? Não introduz mais segurança se as coisas ficarem obscuras, porque isso beneficiará que os erros entrem em seu programa e, no final, até passem suas precauções de segurança.

Então você deve jogar fora o código e considerar o seguinte:
  • Se a entrada para seu aplicativo for inválida, não a filtre. Em vez disso, evite o uso adicional de entrada inválida. Portanto, você precisa de uma função para validar a entrada antes de usá-la.
  • Não altere dados só porque você acha isso pode tornar algo mais seguro. Em vez disso, altere e codifique os dados onde for necessário e apropriado.
    • Faça seu aplicativo funcionar apenas com aspas mágicas desativadas. Confiar nesse recurso é altamente desencorajado. E não há necessidade de verificar isso em todo o seu código.
    • Para armazenar algo com segurança no banco de dados, escape os dados antes de usá-los apenas na consulta. Não em algum outro local de sua aplicação. Use declarações preparadas para isso.
    • Não há necessidade de disputar os dados antes de colocá-los no banco de dados se forem válidos. Mas você precisa codificá-lo corretamente ao enviá-lo para a página da Web . E só lá um aplicativo sabe em qual codificação isso precisa ser. Você não sabe disso quando coloca os dados no banco de dados.

Portanto, se você deseja tornar seu código mais seguro, não se trata de lançar um monte de funções em alguns dados porque você acha que elas estão relacionadas à segurança. Ao fazer isso, você não torna seu software mais seguro, mas menos seguro.
  1. Nunca confie nos dados do usuário.
  2. Certifique-se de que os dados estejam no formato necessário processamento prévio .
  3. Use a ferramenta certa para o trabalho no lugar certo.
  4. Nunca use ferramentas para adivinhar. Em vez disso, obtenha conhecimento, que não só compensa em termos de segurança.