Jump to content
999ANDRE999

String com apostrofe

Recommended Posts

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!

Share this post


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

 

Share this post


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

Share this post


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

Share this post


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

Share this post


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

 

Share this post


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

 

Share this post


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

Share this post


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

 

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.