Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

marcopor1021

[SQL] Passagem de Variavel

Mensagens Recomendadas

marcopor1021

Boas...tenho aqui um pequeno problema na passagem do valor da variavel user. Já tentei de várias maneiras mas acaba por dar erro ao compilar.Agradecia a vossa ajuda. Obrigado.

#include <stdio.h>
#include </usr/include/mysql/mysql.h>
...
scanf("%c",&user);
....
if(mysql_query(conn,"SELECT password From user WHERE username='admin'"))
...

Onde vcs vêm 'admin' devia ser o valor da variável user. Como posso resolver?

Editado por Rui Carlos

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo
#define BUFFER_SIZE 64
#define ESCAPE_SIZE 128

char buffer[bUFFER_SIZE], escaped[ESCAPE_SIZE], user[32];
MYSQL_RES * res = NULL;

if ((scanf("%32s",                                         /* ler uma string com o tamanho máximo de 32 bytes */
          user) == 1) {                                   /* guardar a string lida na variável "user", e verificar se foi correctamente lida */
 snprintf(buffer,                                         /* escrever a query na variável buffer */
          BUFFER_SIZE,                                    /* no máximo BUFFER_SIZE caracteres */
          "select password from user where username='%s'",/* o formato da string a ser escrita */
          user);                                          /* o valor lido a ser inserido no formato */
 mysql_real_escape_string(conn,                           /* prevenir problemas */
                          escaped,                        /* gravar o resultado na variável escaped */
                          buffer,                         /* processar a query que se encontra na variável buffer */
                          strlen(buffer));                /* número de bytes a serem processados */
 res = mysql_query(conn,                                  /* executar a query na ligação conn */
                   escaped);                              /* a query processada */
}


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Rui Carlos

#define BUFFER_SIZE 64
#define ESCAPE_SIZE 128

char buffer[bUFFER_SIZE], escaped[ESCAPE_SIZE], user[32];
MYSQL_RES * res = NULL;

if ((scanf("%32s",                                         /* ler uma string com o tamanho máximo de 32 bytes */
          user) == 1) {                                   /* guardar a string lida na variável "user", e verificar se foi correctamente lida */
 snprintf(buffer,                                         /* escrever a query na variável buffer */
          BUFFER_SIZE,                                    /* no máximo BUFFER_SIZE caracteres */
          "select password from user where username='%s'",/* o formato da string a ser escrita */
          user);                                          /* o valor lido a ser inserido no formato */
 mysql_real_escape_string(conn,                           /* prevenir problemas */
                          escaped,                        /* gravar o resultado na variável escaped */
                          buffer,                         /* processar a query que se encontra na variável buffer */
                          strlen(buffer));                /* número de bytes a serem processados */
 res = mysql_query(conn,                                  /* executar a query na ligação conn */
                   escaped);                              /* a query processada */
}

HappyHippyHippo, a função mysql_real_escape_string não deveria ser chamada com o valor user, em vez de ser com a query (buffer)?

(Usar prepared statments seria o ideal.)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

HappyHippyHippo, a função mysql_real_escape_string não deveria ser chamada com o valor user, em vez de ser com a query (buffer)?

funciona na mesma e simplifica o código

imagina o que seria estar a fazer:

char var1[32], var1_esc[32],
    var2[32], var2_esc[32],
    // ...
    varn[32], varn_esc[32],
    query[1024];

mysql_real_escape_string(conn, var1_esc, var1, strlen(var1));
mysql_real_escape_string(conn, var2_esc, var2, strlen(var2));
// ...
mysql_real_escape_string(conn, varn_esc, varn, strlen(varn));

snprintf(query, 1024, "insert into my_table('%s', '%s', " /* ... */ "'%s'", var1_esc, var2_esc, /* ... */, varn_esc);

(Usar prepared statments seria o ideal.)

small steps ;)

Editado por HappyHippyHippo
  • Voto 1

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Rui Carlos
funciona na mesma e simplifica o código

Discordo quanto à parte de funcionar. Para o nome de utilizador test''user, este é o resultado de imprimir a query com o teu código:

select password from user where username=\'test\'\'user\'

E este é o resultado de imprimir a query fazendo escape apenas ao user:

select password from user where username='test\'\'user'

Parece-me simplesmente impossível para a função saber distinguir quando é que tem que fazer escape a um ' se lhe passares a query completa. Como é que a função iria distinguir o caracteres a que teria que fazer escape? Na query select * from table where x = 'a' and y ='b', como é que saberias se o que utilizador pretende é efectivamente x = 'a' and y ='b' ou x = 'a\' and y =\'b'? A função simplesmente faz escape a todos, o que numa query não é aquilo que se pretende.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Rui Carlos

Acho que isso falha em qualquer query que contenha o carácter ' a definir uma string, pois a função vai sempre fazer escape desse carácter, quando não devia. E isto não me parece que seja 0.1%. No caso em discussão no tópico, não vai funcionar.

Já agora, a documentação da função mostra uma estratégia para se evitar a declaração de variáveis auxiliares. Ainda assim a solução continua a não ser muito prática, mas isso nem os prepared statements são (de um modo geral, a segurança não é prática).

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.