Pergunta

Existe uma maneira mais fácil de extrair com segurança variáveis ​​enviadas além das seguintes?

if(isset($_REQUEST['kkld'])) $kkld=mysql_real_escape_string($_REQUEST['kkld']);
if(isset($_REQUEST['info'])) $info=mysql_real_escape_string($_REQUEST['info']);
if(isset($_REQUEST['freq'])) $freq=mysql_real_escape_string($_REQUEST['freq']);

(E:você usaria isset() nesse contexto?)

Foi útil?

Solução

Para escapar de todas as variáveis ​​de uma só vez:

$escapedGet = array_map('mysql_real_escape_string', $_GET);

Para extrair todas as variáveis ​​no namespace atual (ou seja, $foo = $_GET['foo']):

extract($escapedGet);

Por favor, não faça esta última etapa.Não há necessidade, basta deixar os valores em um array.A extração de variáveis ​​pode levar a conflitos de nomes e à substituição de variáveis ​​existentes, o que não é apenas um incômodo e uma fonte de bugs, mas também um risco à segurança.Além disso, como diz @BoltClock, siga $_GET ou $_POST.Além disso2, como aponta @zerkms, não faz sentido mysql_real_escaping variáveis ​​que não deveriam ser usadas em uma consulta ao banco de dados, isso pode até levar a mais problemas.


Observe que realmente nenhum disso é uma ideia particularmente boa, você está apenas reencarnando magic_quotes e global_vars, que eram práticas horríveis de PHP de tempos passados.Use instruções preparadas com parâmetros vinculados via mysqli ou PDO e use valores através $_GET ou filter_input.Ver http://www.phptherightway.com.

Outras dicas

Você também pode usar uma função recursiva como esta para fazer isso

function sanitate($array) {
   foreach($array as $key=>$value) {
      if(is_array($value)) { sanitate($value); }
      else { $array[$key] = mysql_real_escape_string($value); }
   }
   return $array;
}
sanitate($_POST);

No que me diz respeito, a resposta de Starx e Ryan de 19 de novembro de 2010 é a melhor solução aqui, pois eu também precisava disso.

Quando você tem vários campos de entrada com um nome (por exemplo,nomes[]), o que significa que eles serão salvos em um array dentro do array $_POST, você deve usar uma função recursiva, pois mysql_real_escape_string não funciona para arrays.

Portanto, esta é a única solução para escapar dessa variável $_POST.

function sanitate($array) {
    foreach($array as $key=>$value) {
        if(is_array($value)) { sanitate($value); }
            else { $array[$key] = mysql_real_escape_string($value); }
   }
   return $array;
}
sanitate($_POST);

Para higienizar ou validar qualquer INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER, ou INPUT_ENV, você pode usar

A filtragem pode ser feita com um retorno de chamada, para que você possa fornecer mysql_real_escape_string.

Este método não permite filtrar por $_REQUEST, porque você não deve trabalhar com $_REQUEST quando os dados estão disponíveis em qualquer uma das outras superglobais.É potencialmente inseguro.

O método também exige que você nomeie as chaves de entrada, portanto, não é uma filtragem genérica em lote.Se você quiser uma filtragem genérica em lote, use array_map ou array_walk ou array_filter conforme mostrado em outro lugar nesta página.

Além disso, por que você está usando a antiga extensão mysql em vez da mysqli (i para melhorado) extensão.A extensão mysqli lhe dará suporte para transações, multiconsultas e declarações preparadas (o que elimina a necessidade de escape) Todos os recursos que podem tornar seu código de banco de dados muito mais confiável e seguro.

Se você usar mysqli extensão e você gosta de escapar de todas as variáveis ​​GET:

$escaped_get = array_map(array($mysqli, 'real_escape_string'), $_GET);

Como alternativa, posso aconselhá-lo a usar Filtros de entrada PHP7, que fornece um atalho para o escape do sql.Eu não recomendaria isso por si só, mas poupa a criação de variáveis ​​localizadas:

 $_REQUEST->sql['kkld']

Que pode ser usado in-line em strings de consulta SQL e fornecer um aviso extra caso você esqueça:

 mysql_query("SELECT x FROM y WHERE z = '{$_REQUEST->sql['kkld']}'");

É sintaticamente questionável, mas permite escapar apenas das variáveis ​​que realmente precisam.Ou para emular o que você pediu, use $_REQUEST->sql->always();

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top