mysql_real_escape_string() para todo o array $_REQUEST ou precisa fazer um loop por ele?
-
26-09-2019 - |
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?)
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
filter_input_array
— Obtém variáveis externas e opcionalmente as filtra
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();