999ANDRE999 3 Posted March 1, 2019 Report Share Posted March 1, 2019 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! Link to post Share on other sites
M6 150 Posted March 1, 2019 Report Share Posted March 1, 2019 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." Link to post Share on other sites
ribeiro55 47 Posted March 1, 2019 Report Share Posted March 1, 2019 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" Link to post Share on other sites
999ANDRE999 3 Posted March 6, 2019 Author Report Share Posted March 6, 2019 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? Link to post Share on other sites
ribeiro55 47 Posted March 6, 2019 Report Share Posted March 6, 2019 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" Link to post Share on other sites
999ANDRE999 3 Posted March 7, 2019 Author Report Share Posted March 7, 2019 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(); } } } Link to post Share on other sites
M6 150 Posted March 8, 2019 Report Share Posted March 8, 2019 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." Link to post Share on other sites
999ANDRE999 3 Posted March 8, 2019 Author Report Share Posted March 8, 2019 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 😌 Link to post Share on other sites
M6 150 Posted March 9, 2019 Report Share Posted March 9, 2019 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." Link to post Share on other sites
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now