Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Primeiramente uso o PHP 5.4;
Função: Estou fazendo uma página de histórico, toda vez que um visitante acessa uma determinada página seu id fica salvo no cookie, que por sua vez quando o usuário acessa a página de histórico esses ids são lidos pelo mysql e exibi todos os resultados.
Minha duvida: e seguro usar o código desta forma, ou e necessário fazer alterações, vale lembrar que o mysql so irá consultar números, cujo são especificados, porem usuários de ma fé podem modificá-los para fazer um sql injection por exemplo, porem so será lido números no mysql. devido ao uso da função is_numeric, alguem poderia analizar e me dizer oque fazer pra deixa-la segura, caso não esteja?
Alguém poderia me informar se é seguro ou se há algo mais para deixar seguro?
Código:
$id = $_COOKIE["id"]; //Nome do cookie
$novoId = "$cont[id]"; // Novo id, value exemplo "1,2,3,4" adiciona novo valor apos virgula
if (!preg_match("/\b{$novoId}\b/", $id)) {
setcookie("id", $id .= "{$novoId},");
}
$historico = explode(",", $id);
$histanime = array_filter($historico, function($value) {
/* Retorna apenas os números inteiros */
return is_numeric($value);
});
if(($quantidade = count($histanime)) > 30){
$histanime = array_slice($histanime, $quantidade - 30, 30);
}
$ids5 = implode(",", $histanime) ;
e a consulta no *mysql* e feita com um *while*:
$cont = mysql_query("SELECT title,titulo2,url,imagen FROM `lista` WHERE aid IN($ids5)");
Não, usar valores de cookies para consultas não é seguro. Entretanto, nenhuma outra forma de inserção de dados é segura (GET, POST, SESSION).
O problema fica na sua implementação. Você está vulnerável a SQL Injection. Tudo que você precisa saber sobre SQL Injections está nesta página.
Nota: o código acima não é vulnerável, pelo fato de você estar apenas valores numéricos. Entretanto, eu imagino que o código acima se repita em outros lugares do seu sistema.
No mais, você deve utilizar MySQLi ou PDO no lugar de funções mysql_*. Também, é importante notar que:
>
Citar
Warning
This extension was deprecated in PHP 5.5.0, and it was removed in PHP 7.0.0. Instead, the MySQLi or PDO_MySQL extension should be used. See also MySQL: choosing an API guide and related FAQ for more information. Alternatives to this function include:
-
mysqli_connect()
-
PDO::__construct()
Outro ponto, é o uso de prepared statements. Apesar de você tratar que os valores sejam apenas numéricos, você pode tratar isso com prepared statements que ira deixar o seu código igualmente seguro.
Para utilizar prepared statements com IN, há um exemplo no link abaixo: