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

999ANDRE999

String com apostrofe

Mensagens Recomendadas

999ANDRE999

Boas malta,

Tenho desenvolvido uma pagina web em asp.net C# com ligação a uma BD postgres.
Mas tenho um problema que sempre que na string que vai ser gravada na BD colocarem um apostrofe ( ' ), como é um comando de sql, vai dar erro ao gravar.

Tenho a solução de não deixar escrever apostrofes em nenhuma textbox, mas tenho centenas delas em várias páginas do código e isso iria dar uma trabalheira desgraçada.

Algém conhece alguma maneira fácil de, ou bloquear a escrita do apostrofe tipo no ficheiro web.config, ou de o postgres aceitar a escrita de apostofes?

 

Muito obrigado a quem ajudar!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
M6

Isso é um caso comum de falta de "escape" ao caratere. É inclusive uma forma básica de fazer sql injection.

Tens de fazer "escape" ao caratere, neste caso substituir o ' por '' ou por \' antes de meteres na base de dados.


10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ribeiro55

Olá!

Para resolveres o teu problema, no imediato, basta que faças um replace do valor que concatenas na query, de forma a que todos os apóstrofes passem a ser dois, por exemplo:

"Johnny''s horse"

Um simples

.Replace("'","''")

Terás é outro tipo de problemas mais graves, do que apenas esse, nomeadamente injecção de SQL. Não conheço Postgres, mas terá concerteza suporte para algo semelhante a prepared statements.


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
999ANDRE999
Em 01/03/2019 às 15:59, M6 disse:

Isso é um caso comum de falta de "escape" ao caratere. É inclusive uma forma básica de fazer sql injection.

Tens de fazer "escape" ao caratere, neste caso substituir o ' por '' ou por \' antes de meteres na base de dados.

Muito obrigado pela ajuda.

Vai resolver, mas vai implicar muito trabalho. tenho centenas de textboxes que gravam em BD e teria de fazer um replace caso a caso.

 

Haverá maneira de fazer isso na globalidade?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ribeiro55

Como é que estás a fazer os INSERT? Dá um exemplo de um sítio desses onde terias de aplicar o Replace.


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
999ANDRE999
19 horas atrás, ribeiro55 disse:

Como é que estás a fazer os INSERT? Dá um exemplo de um sítio desses onde terias de aplicar o Replace.

Aqui vai um exemplo

if (conn.State != ConnectionState.Open) { conn.Open(); }
                    Npgsql.NpgsqlCommand comm = new Npgsql.NpgsqlCommand();
                    comm.Connection = conn;

                    for (int i = 0; i < CheckBoxList1.Items.Count; i++)
                    {
                        if (CheckBoxList1.Items[i].Selected == true)
                        {
                            if (CheckBoxList1.Items[i].Value == "Não")
                            {
                                comm.CommandText = "Insert into prod_plano_acoes (linha, nome, data,  turno, comentario, item, status, area, nivel) " +
                                "Values ('" + TextBox_linha.Text + "', '" + TextBox_auditor.Text + "' , '" + TextBox_data.Text + "', " +
                                "'" + DropDownList2.SelectedValue + "', '" + TextBox1.Text + "', '1', 'NOK', '" + DropDownList1.SelectedValue + "', '2')";
                                comm.ExecuteNonQuery();

                                comm.CommandText = "Insert into prod_check_list_nivel2 (p1, linha, nome, data, turno, comentario, item, area) " +
                                    "Values ('" + CheckBoxList1.Items[i].Value + "', '" + TextBox_linha.Text + "', '" + TextBox_auditor.Text + "' , '" + TextBox_data.Text + "', " +
                                    "'" + DropDownList2.SelectedValue + "', '" + TextBox1.Text + "', '1', '" + DropDownList1.SelectedValue + "')";
                                comm.ExecuteNonQuery();
                            }
                            else
                            {
                                comm.CommandText = "Insert into prod_check_list_nivel2 (p1, linha, nome, data, turno, comentario, item, area) " +
                                    "Values ('" + CheckBoxList1.Items[i].Value + "', '" + TextBox_linha.Text + "', '" + TextBox_auditor.Text + "' , '" + TextBox_data.Text + "', " +
                                    "'" + DropDownList2.SelectedValue + "', '" + TextBox1.Text + "', '1', '" + DropDownList1.SelectedValue + "')";
                                comm.ExecuteNonQuery();
                            }
                        }
                    }

 

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
M6
On 3/6/2019 at 1:12 PM, 999ANDRE999 said:

Muito obrigado pela ajuda.

Vai resolver, mas vai implicar muito trabalho. tenho centenas de textboxes que gravam em BD e teria de fazer um replace caso a caso.

 

Haverá maneira de fazer isso na globalidade?

Só se for mais simples criar triggers em cada tabela para fazer isso.


10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
999ANDRE999
22 minutos atrás, M6 disse:

Só se for mais simples criar triggers em cada tabela para fazer isso.

Acho que seria mais fácil. não sei é fazer isso 😌

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
M6
17 hours ago, 999ANDRE999 said:

Acho que seria mais fácil. não sei é fazer isso 😌

Tens de criar um trigger before insert e fazer escape aos campos de texto: https://www.devmedia.com.br/mysql-basico-triggers/37462


10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

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.