Jump to content
marcopor1021

[SQL] Passagem de Variavel

Recommended Posts

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?

Edited by Rui Carlos

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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.)

Share this post


Link to post
Share on other 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 ;)

Edited by HappyHippyHippo
  • Vote 1

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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other sites
HappyHippyHippo

funciona para 99.9% dos casos

é por isso que o seguinte passo seria o uso dos prepared statements


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

Share this post


Link to post
Share on other 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).

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.