Pergunta

estou usando php e executando consultas sql em um servidor mysql.para evitar injeções de SQL, estou usando mysql_real_escape_string.

também estou usando (int) para conversão de números, da seguinte maneira:

$desired_age = 12;
$query = "select id from users where (age > ".(int)$desired_age.")";
$result = mysql_query($query);

aquele trabalho.

Mas, quando a variável contém números maiores, sua conversão falha, pois são maiores que int.

$user_id = 5633847511239487;
$query = "select age from users where (id = ".(int)$user_id.")";
$result = mysql_query($query);
// this will not produce the desired result, 
// since the user_id is actually being cast to int

Existe outra maneira de lançar um grande número (como BIGINT), exceto pelo uso de mysql_real_escape_string, quando se trata de prevenção de injeção de sql?

Foi útil?

Solução

Você poderia usar algo como:

preg_replace('/[^0-9]/','',$user_id);

para substituir todos os símbolos não numéricos em sua string.Mas na verdade não há necessidade de fazer isso, basta usar mysql_real_escape_string() pois seu valor inteiro será convertido em uma string de qualquer maneira assim que $query for construído.

Outras dicas

Se você mesmo estiver gerando o ID do usuário, não há necessidade de lançá-lo para o MySQL, pois não há chance de injeção de SQL ou outros problemas de string.

Se for um valor enviado pelo usuário, use filter_var() (ou is_numeric()) para verificar se é um número e não uma string.

Valide a entrada.Não simplesmente escape, valide, se for um número.Existem algumas funções PHP que resolvem o problema, como is_numeric() - descobre se uma variável é um número ou uma string numérica

http://www.php.net/is_numeric

Use instruções parametrizadas preparadas pelo lado do servidor (e, assim, remova a necessidade de xyz_real_escape_string()) e/ou trate o id como uma string.O servidor MySQL possui regras integradas para conversões de string <-> número e se você decidir alterar o tipo/estrutura do campo id, não precisará alterar o código php também.A menos que você tenha necessidades concretas de (micro) otimização, geralmente não há necessidade de permitir que o código faça esse tipo de suposição sobre a estrutura e o intervalo de valores de um campo de identificação no banco de dados.

$pdo = new PDO('mysql:...');
$pdo->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

$stmt = $pdo->prepare('SELECT age FROM users WHERE id=?');
$stmt->execute(array('5633847511239487'));

Depois de alguma pesquisa, cheguei a essa configuração

private function escapeInt($value)
{
    if (is_float($value))
    {
        return number_format($value, 0, '.', ''); // may lose precision on big numbers
    }
    elseif(preg_match('/^-?[0-9]+$/', $value))
    {
        return (string)$value;
    }
    else
    {
        $this->error("Invalid value");
    }
}

Caso separado para os carros alegóricos porque $i = 184467440737095; torna-se flutuante em um sistema de 32 bits e, portanto, desmorona em notação científica quando convertido em string.
E regexp simples para o resto

Você pode até multiplicar a variável por *1, você pode verificar os valores mínimo e máximo que pode aceitar (para age bigint não é uma opção ...então por que permitir mais números do que valores para os quais você está preparado?E também tem o PDO com sua consulta preparada.

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