Devo mysql_real_escape_string todos os cookies que recebo do usuário para evitar a injeção mysql em php?

StackOverflow https://stackoverflow.com/questions/90517

  •  01-07-2019
  •  | 
  •  

Pergunta

Quando um usuário vai para o meu site, meus cheques de script para 2 cookies que armazenam o ID do usuário + parte da senha, para conectar automaticamente-los.

É possível editar o conteúdo dos cookies através de um editor biscoito, então eu acho que é possível adicionar algum conteúdo malicioso para um cookie escrito?

Devo adicionar mysql_real_escape_string (ou outra coisa) para todas as minhas chamadas de cookie ou se há algum tipo de construído em procedimento que não vai permitir que isso aconteça?

Foi útil?

Solução

O que você realmente necessidade de fazer é não enviar esses valores de cookies que são hackable em primeiro lugar. Em vez disso, por que não botar o nome de usuário e senha e um sal (secreta) e defina-o como o valor do cookie? ou seja:.

define('COOKIE_SALT', 'secretblahblahlkdsfklj');
$cookie_value = sha1($username.$password.COOKIE_SALT);

Então você sabe o valor do cookie é sempre vai ser uma string hexadecimal de 40 caracteres, e pode comparar o valor que o usuário envia de volta com tudo o que está no banco de dados para decidir se eles são válidos ou não:

if ($user_cookie_value == sha1($username_from_db.$password_drom_db.COOKIE_SALT)) {
  # valid
} else {
  #not valid
}

mysql_real_escape_string torna um hit adicional ao banco de dados, BTW (um monte de pessoas não percebem isso requer uma conexão de banco de dados e consultas MySQL).

A melhor maneira de fazer o que quiser, se você não pode mudar seu aplicativo e insistir em usar valores de cookies hackable é usar declarações preparadas com parâmetros vinculados .

Outras dicas

O ponto de mysql_real_escape_string não é para proteger contra ataques de injeção, é para garantir que seus dados são armazenados com precisão no banco de dados. Assim, ele deve ser chamado em qualquer cadeia de ir para o banco de dados, independentemente da sua fonte.

Você deve, no entanto, também estar usando consultas parametrizadas (via mysqli ou DOP) para se proteger de injeção de SQL. Caso contrário, você corre o risco de acabar como pouco Bobby Tabelas escola.

Eu só uso mysql_real_escape_string antes de inserir variáveis ??em uma instrução SQL. Você só vai obter-se confuso se algumas de suas variáveis ??são escapou, e então você escapar-los novamente. É um erro clássico que você vê em webapps de blog novatos:

Quando alguém escreve um apóstrofo ele continua a adição de barras arruinar o blog \\\\\\\ 's páginas.

O valor de uma variável não é perigoso por si só: é somente quando você colocá-lo em uma corda ou algo semelhante que você começa a se afastar em águas perigosas

.

É claro, porém, nunca mais confiar em nada que vem do lado do cliente.

declarações preparadas e parâmetros de ligação é sempre um bom caminho a percorrer.

suportes PEAR :: MDB2 elaborou demonstrações, por exemplo:

$db = MDB2::factory( $dsn );

$types = array( 'integer', 'text' );
$sth = $db->prepare( "INSERT INTO table (ID,Text) (?,?)", $types );
if( PEAR::isError( $sth ) ) die( $sth->getMessage() );

$data = array( 5, 'some text' );
$result = $sth->execute( $data );
$sth->free();
if( PEAR::isError( $result ) ) die( $result->getMessage() );

Isso só vai permitir que os dados adequados e quantidade pré-conjunto de variáveis ??para entrar em banco de dados.

Você naturalmente deve validar os dados antes de chegar tão longe, mas a elaboração das demonstrações é a validação final que deve ser feito.

Você deve mysql_real_escape_string qualquer que poderia ser potencialmente prejudicial. Nunca confie qualquer tipo de entrada que pode ser alterado pelo usuário.

Eu concordo com você. É possível modificar os biscoitos e enviar dados maliciosos.

Eu acredito que é uma boa prática para filtrar os valores que você começa a partir dos cookies antes de usá-los. Como uma regra de ouro que eu faço filtro de qualquer outra entrada que pode ser adulterado.

Yegor, você pode armazenar o hash quando uma conta de usuário é criado / atualizado, então sempre que um login é iniciado, você botar os dados enviados para o servidor e comparar com o que foi armazenado no banco de dados para que um nome de usuário.

(Em cima da minha cabeça em php solta - deleite como código pseudo):

$usernameFromPostDbsafe = LimitToAlphaNumUnderscore($usernameFromPost);
$result = Query("SELECT hash FROM userTable WHERE username='$usernameFromPostDbsafe' LIMIT 1;");
$hashFromDb = $result['hash'];
if( (sha1($usernameFromPost.$passwordFromPost.SALT)) == $hashFromDb ){
    //Auth Success
}else{
   //Auth Failure
}

Depois de uma autenticação bem-sucedida, você pode armazenar o hash em $ _SESSION ou em uma tabela de banco de dados de cache autenticado usuário / hashes. Em seguida, enviar a parte de trás de hash para o navegador (em um cookie, por exemplo) para posterior carregamento da página enviar a volta de hash para o servidor a ser comparado com o hash realizada em seu armazenamento de sessão escolhida.

mysql_real_escape_string é tão passé ... Estes dias você realmente deve usar ligação de parâmetro em vez disso.

Eu vou elaborar por mentionning que eu estava referindo-se a declarações preparadas e fornecer um link para um artigo que demonstra que às vezes mysl_real_escape_string não é suficiente suficiente: http://www.webappsec.org/projects/ artigos / 091007.txt

Eu recomendaria usar htmlentities ($ entrada, ENT_QUOTES) em vez de mysql_real_escape_string pois isso também irá evitar qualquer outputting acidental de código HTML. Claro, você poderia usar mysql_real_escape_string e htmlentities, mas por que você?

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