Re: [pgbr-geral] Tratamento de Contrabarra
2012/8/6 Anselmo Silva anselmo@gmail.com Matheus, obrigado. A Linguagem: Delphi. Como eu disse anteriormente o usuário é quem digita a contrabarra. Como Alguns usuários já acabaram se acostumando em usar a barra como coringa, estou momentaneamente contornando com uma função do Dephi *ReplaceStr(where,'\', '%').* Não estou tratando contra SQL injection, preciso ler mais sobre. Para essa gambiarra temporária haveria riscos de SQL injection? Nossa, agora que eu entendi que a barra é o coringa. Particularmente já vi usar como coringa interrogação e asterisco, barra é a primeira vez... =P Mas então, o risco de SQL Injection não está na barra, está se o cara digitar um apóstrofo (aspa simples). Imagine só, se o cara digita isso aqui numa tela de login: login: admin' or 1 = 1; -- senha: qualquer coisa Daí você faz a consulta +/- assim: sql = SELECT * FROM login WHERE login = ' + login + ' AND senha = ' + senha '; O SQL final ficaria: SELECT * FROM login WHERE login = 'admin' or 1 = 1; --' AND senha = 'qualquer coisa'; Ou seja, o cara estaria logado como admin (veja que depois do -- é comentário). Se você tratar pelo menos a aspa simples, por exemplo trocando por duas aspas, você estará livre de SQL Injection. Uma dica boa é usar PREPARED STATEMENTS que já faz tudo isso pra você. Atenciosamente, -- Matheus de Oliveira ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Tratamento de Contrabarra
Por isso deve-se evitar conferir a senha no SQL O melhor é assim Select * From Login Where (login = ‘”+var_login+”’) // Confere se pegou o login if (Result 0) Depois de Trazer o login faz um IF if (SuaQuery.SeuCampoSenha = VariavelSenha) Prossegue... Assim ele pode colocar a injeção que quiser no SELECT pois quem verifica a senha é o IF Ou seja, verifique o login e senha separadamente * Por que o uso de “( )” ? Isso evita injeção sem formatação, por exemplo a=b and From: Matheus de Oliveira Sent: Tuesday, August 07, 2012 8:32 AM To: Comunidade PostgreSQL Brasileira Subject: Re: [pgbr-geral] Tratamento de Contrabarra 2012/8/6 Anselmo Silva anselmo@gmail.com Matheus, obrigado. A Linguagem: Delphi. Como eu disse anteriormente o usuário é quem digita a contrabarra. Como Alguns usuários já acabaram se acostumando em usar a barra como coringa, estou momentaneamente contornando com uma função do Dephi ReplaceStr(where,'\', '%'). Não estou tratando contra SQL injection, preciso ler mais sobre. Para essa gambiarra temporária haveria riscos de SQL injection? Nossa, agora que eu entendi que a barra é o coringa. Particularmente já vi usar como coringa interrogação e asterisco, barra é a primeira vez... =P Mas então, o risco de SQL Injection não está na barra, está se o cara digitar um apóstrofo (aspa simples). Imagine só, se o cara digita isso aqui numa tela de login: login: admin' or 1 = 1; -- senha: qualquer coisa Daí você faz a consulta +/- assim: sql = SELECT * FROM login WHERE login = ' + login + ' AND senha = ' + senha '; O SQL final ficaria: SELECT * FROM login WHERE login = 'admin' or 1 = 1; --' AND senha = 'qualquer coisa'; Ou seja, o cara estaria logado como admin (veja que depois do -- é comentário). Se você tratar pelo menos a aspa simples, por exemplo trocando por duas aspas, você estará livre de SQL Injection. Uma dica boa é usar PREPARED STATEMENTS que já faz tudo isso pra você. Atenciosamente, -- Matheus de Oliveira ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Tratamento de Contrabarra
Por isso deve-se evitar conferir a senha no SQL O melhor é assim Select * From Login Where (login = ‘”+var_login+”’) // Confere se pegou o login if (Result 0) Depois de Trazer o login faz um IF if (SuaQuery.SeuCampoSenha = VariavelSenha) Prossegue... Assim ele pode colocar a injeção que quiser no SELECT pois quem verifica a senha é o IF Ou seja, verifique o login e senha separadamente * Por que o uso de “( )” ? Isso evita injeção sem formatação, por exemplo a=b and c=d Se vc tiver um separador ele vai ter que formatar tamebm na injeção (a=b)and(c=d) Se ele colocar uma injeção em b ou d vai ficar (a=admin or 1=1; -- ')... Veja que vai falta fechar o ) gerando um erro Claro que o cara vai tentar de tudo, mas vamos dificultar o máximo :) Marcelo Silva -- From: Matheus de Oliveira Sent: Tuesday, August 07, 2012 8:32 AM To: Comunidade PostgreSQL Brasileira Subject: Re: [pgbr-geral] Tratamento de Contrabarra 2012/8/6 Anselmo Silva anselmo@gmail.com Matheus, obrigado. A Linguagem: Delphi. Como eu disse anteriormente o usuário é quem digita a contrabarra. Como Alguns usuários já acabaram se acostumando em usar a barra como coringa, estou momentaneamente contornando com uma função do Dephi ReplaceStr(where,'\', '%'). Não estou tratando contra SQL injection, preciso ler mais sobre. Para essa gambiarra temporária haveria riscos de SQL injection? Nossa, agora que eu entendi que a barra é o coringa. Particularmente já vi usar como coringa interrogação e asterisco, barra é a primeira vez... =P Mas então, o risco de SQL Injection não está na barra, está se o cara digitar um apóstrofo (aspa simples). Imagine só, se o cara digita isso aqui numa tela de login: login: admin' or 1 = 1; -- senha: qualquer coisa Daí você faz a consulta +/- assim: sql = SELECT * FROM login WHERE login = ' + login + ' AND senha = ' + senha '; O SQL final ficaria: SELECT * FROM login WHERE login = 'admin' or 1 = 1; --' AND senha = 'qualquer coisa'; Ou seja, o cara estaria logado como admin (veja que depois do -- é comentário). Se você tratar pelo menos a aspa simples, por exemplo trocando por duas aspas, você estará livre de SQL Injection. Uma dica boa é usar PREPARED STATEMENTS que já faz tudo isso pra você. Atenciosamente, -- Matheus de Oliveira ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Tratamento de Contrabarra
Obrigado pelas dicas sobre SQL injection. Minha senha está criptografada na base e no SGDB. Não é permitido o uso do apóstrofo no login. Somente letras e números. Mas, em conclusão sobre o tema do tópico. Só tem jeito se tratar a aplicação nesse caso, né? Em 7 de agosto de 2012 08:54, Marcelo Silva marc...@ig.com.br escreveu: Por isso deve-se evitar conferir a senha no SQL O melhor é assim Select * From Login Where (login = ‘”+var_login+”’) // Confere se pegou o login if (Result 0) Depois de Trazer o login faz um IF if (SuaQuery.SeuCampoSenha = VariavelSenha) Prossegue... Assim ele pode colocar a injeção que quiser no SELECT pois quem verifica a senha é o IF Ou seja, verifique o login e senha separadamente * Por que o uso de “( )” ? Isso evita injeção sem formatação, por exemplo a=b and c=d Se vc tiver um separador ele vai ter que formatar tamebm na injeção (a=b)and(c=d) Se ele colocar uma injeção em b ou d vai ficar (a=admin or 1=1; -- ')... Veja que vai falta fechar o ) gerando um erro Claro que o cara vai tentar de tudo, mas vamos dificultar o máximo :) Marcelo Silva -- From: Matheus de Oliveira Sent: Tuesday, August 07, 2012 8:32 AM To: Comunidade PostgreSQL Brasileira Subject: Re: [pgbr-geral] Tratamento de Contrabarra 2012/8/6 Anselmo Silva anselmo@gmail.com Matheus, obrigado. A Linguagem: Delphi. Como eu disse anteriormente o usuário é quem digita a contrabarra. Como Alguns usuários já acabaram se acostumando em usar a barra como coringa, estou momentaneamente contornando com uma função do Dephi ReplaceStr(where,'\', '%'). Não estou tratando contra SQL injection, preciso ler mais sobre. Para essa gambiarra temporária haveria riscos de SQL injection? Nossa, agora que eu entendi que a barra é o coringa. Particularmente já vi usar como coringa interrogação e asterisco, barra é a primeira vez... =P Mas então, o risco de SQL Injection não está na barra, está se o cara digitar um apóstrofo (aspa simples). Imagine só, se o cara digita isso aqui numa tela de login: login: admin' or 1 = 1; -- senha: qualquer coisa Daí você faz a consulta +/- assim: sql = SELECT * FROM login WHERE login = ' + login + ' AND senha = ' + senha '; O SQL final ficaria: SELECT * FROM login WHERE login = 'admin' or 1 = 1; --' AND senha = 'qualquer coisa'; Ou seja, o cara estaria logado como admin (veja que depois do -- é comentário). Se você tratar pelo menos a aspa simples, por exemplo trocando por duas aspas, você estará livre de SQL Injection. Uma dica boa é usar PREPARED STATEMENTS que já faz tudo isso pra você. Atenciosamente, -- Matheus de Oliveira ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral -- Anselmo M. Silva ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Tratamento de Contrabarra
2012/8/7 Marcelo Silva marc...@ig.com.br Por isso deve-se evitar conferir a senha no SQL O melhor é assim Select * From Login Where (login = ‘”+var_login+”’) // Confere se pegou o login if (Result 0) Depois de Trazer o login faz um IF if (SuaQuery.SeuCampoSenha = VariavelSenha) Prossegue... Assim ele pode colocar a injeção que quiser no SELECT pois quem verifica a senha é o IF Ou seja, verifique o login e senha separadamente * Por que o uso de “( )” ? Isso evita injeção sem formatação, por exemplo a=b and c=d Se vc tiver um separador ele vai ter que formatar tamebm na injeção (a=b)and(c=d) Se ele colocar uma injeção em b ou d vai ficar (a=admin or 1=1; -- ')... Veja que vai falta fechar o ) gerando um erro Claro que o cara vai tentar de tudo, mas vamos dificultar o máximo :) Não é a questão de testar a senha ou não via SQL, o que eu também não gosto, mas mesmo da forma que você passou um erro será gerado, e, se esse erro não for tratado corretamente o cara poderá ver esse erro e identificar a correção, daí é só o cara adicionar o parentese também. O ideal é tratar a string e evitar o erro. -- Matheus de Oliveira ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Tratamento de Contrabarra
Na verdade não se deve deixar o servidor exibir erros padrão para o usuário final, como você disse deve-se tratar o erro e exibir uma mensagem amigável ao usuário. Acho que o uso do Try nesse caso poderia ser uma solução imediata. no caso do delphi try Verifica Deu erro para pro except except Erro no login end Quanto a limitar o uso de caracteres no login e senha, eu já não gosto de colocar limitações para o usuário, mas aí é questão de gosto (ou necessidade da empresa talvez), nesses casos o que pesa pra mim é que o usuário leigo (que é o foco) vai ficar tentando digitar justamente aquele caractere que não pode, e vai vir correndo dizer que o sistema não funciona, rsrsrs Tratar esse detalhes na aplicação é o que demanda tempo... Marcelo Silva - From: Matheus de Oliveira Sent: Tuesday, August 07, 2012 9:21 AM To: Comunidade PostgreSQL Brasileira Subject: Re: [pgbr-geral] Tratamento de Contrabarra 2012/8/7 Marcelo Silva marc...@ig.com.br Por isso deve-se evitar conferir a senha no SQL O melhor é assim Select * From Login Where (login = ‘”+var_login+”’) // Confere se pegou o login if (Result 0) Depois de Trazer o login faz um IF if (SuaQuery.SeuCampoSenha = VariavelSenha) Prossegue... Assim ele pode colocar a injeção que quiser no SELECT pois quem verifica a senha é o IF Ou seja, verifique o login e senha separadamente * Por que o uso de “( )” ? Isso evita injeção sem formatação, por exemplo a=b and c=d Se vc tiver um separador ele vai ter que formatar tamebm na injeção (a=b)and(c=d) Se ele colocar uma injeção em b ou d vai ficar (a=admin or 1=1; -- ')... Veja que vai falta fechar o ) gerando um erro Claro que o cara vai tentar de tudo, mas vamos dificultar o máximo :) Não é a questão de testar a senha ou não via SQL, o que eu também não gosto, mas mesmo da forma que você passou um erro será gerado, e, se esse erro não for tratado corretamente o cara poderá ver esse erro e identificar a correção, daí é só o cara adicionar o parentese também. O ideal é tratar a string e evitar o erro. -- Matheus de Oliveira ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Tratamento de Contrabarra
Ou então grave um md5(senha||pitada_de_sal) no banco e compare o digest ao invés da senha. Em 7 de agosto de 2012 09:20, Anselmo Silva anselmo@gmail.comescreveu: Obrigado pelas dicas sobre SQL injection. Minha senha está criptografada na base e no SGDB. Não é permitido o uso do apóstrofo no login. Somente letras e números. Mas, em conclusão sobre o tema do tópico. Só tem jeito se tratar a aplicação nesse caso, né? -- Atenciosamente, Alexsander da Rosa ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
[pgbr-geral] Tratamento de Contrabarra
Olá pessoal, estou tendo um problema, que sei que é simples para vós, experientes com o elefante. Tenho vários campos de busca por texto em tempo real onde é possível o usuário buscar algo como o nome do produto. Isso é comum, porém se o usuário digita somente uma contrabarra '\' aí o bicho pega, pois internamente meu select ficaria mais ou menos assim: SELECT NOME FROM PROD WHERE NOME LIKE '\'; Resultado: AVISO: uso de \' fora do padrão em cadeia de caracteres ... HINT: Utilize '' para escrever cadeias de carateres entre apóstofros, ou utilize a sintaxe de escape de cadeia de caracteres (E'...'). Andei lendo sobre a cláusula LIKE[1], especialmente sobre o ESCAPE, mas, não entendi 100%. Alguém podeia me dizer como contornar essa questão de newbie? http://pgdocptbr.sourceforge.net/pg80/functions-matching.html -- Anselmo M. Silva ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Tratamento de Contrabarra
Tente SELECT NOME FROM PROD WHERE NOME LIKE E'\'; Abraço. Em 6 de agosto de 2012 11:44, Anselmo Silva anselmo@gmail.comescreveu: Olá pessoal, estou tendo um problema, que sei que é simples para vós, experientes com o elefante. Tenho vários campos de busca por texto em tempo real onde é possível o usuário buscar algo como o nome do produto. Isso é comum, porém se o usuário digita somente uma contrabarra '\' aí o bicho pega, pois internamente meu select ficaria mais ou menos assim: SELECT NOME FROM PROD WHERE NOME LIKE '\'; Resultado: AVISO: uso de \' fora do padrão em cadeia de caracteres ... HINT: Utilize '' para escrever cadeias de carateres entre apóstofros, ou utilize a sintaxe de escape de cadeia de caracteres (E'...'). Andei lendo sobre a cláusula LIKE[1], especialmente sobre o ESCAPE, mas, não entendi 100%. Alguém podeia me dizer como contornar essa questão de newbie? http://pgdocptbr.sourceforge.net/pg80/functions-matching.html -- Anselmo M. Silva ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Tratamento de Contrabarra
2012/8/6 Hallan Serafim Pagani hallan.mar...@gmail.com Tente SELECT NOME FROM PROD WHERE NOME LIKE E'\'; Não seria duas barras? SELECT NOME FROM PROD WHERE NOME LIKE E'\\'; -- Matheus de Oliveira ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Tratamento de Contrabarra
Ola Se não me engano seria duas barra no modo antigo []s Luiz Em 6 de agosto de 2012 13:37, Matheus de Oliveira matioli.math...@gmail.com escreveu: 2012/8/6 Hallan Serafim Pagani hallan.mar...@gmail.com Tente SELECT NOME FROM PROD WHERE NOME LIKE E'\'; Não seria duas barras? SELECT NOME FROM PROD WHERE NOME LIKE E'\\'; -- Matheus de Oliveira ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Tratamento de Contrabarra
Detalhe : Postgres 8.0.8 Em 6 de agosto de 2012 13:56, Luiz Rafael Culik l...@xharbour.com.brescreveu: Ola Se não me engano seria duas barra no modo antigo []s Luiz Em 6 de agosto de 2012 13:37, Matheus de Oliveira matioli.math...@gmail.com escreveu: 2012/8/6 Hallan Serafim Pagani hallan.mar...@gmail.com Tente SELECT NOME FROM PROD WHERE NOME LIKE E'\'; Não seria duas barras? SELECT NOME FROM PROD WHERE NOME LIKE E'\\'; -- Matheus de Oliveira ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral -- Anselmo M. Silva ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Tratamento de Contrabarra
Ops! Postgres 9.0.8 2012/8/6 Anselmo Silva anselmo@gmail.com Detalhe : Postgres 8.0.8 Em 6 de agosto de 2012 13:56, Luiz Rafael Culik l...@xharbour.com.brescreveu: Ola Se não me engano seria duas barra no modo antigo []s Luiz Em 6 de agosto de 2012 13:37, Matheus de Oliveira matioli.math...@gmail.com escreveu: 2012/8/6 Hallan Serafim Pagani hallan.mar...@gmail.com Tente SELECT NOME FROM PROD WHERE NOME LIKE E'\'; Não seria duas barras? SELECT NOME FROM PROD WHERE NOME LIKE E'\\'; -- Matheus de Oliveira ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral -- Anselmo M. Silva -- Anselmo M. Silva ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Tratamento de Contrabarra
Em 06-08-2012 14:17, Anselmo Silva escreveu: Detalhe : Postgres 8.0.8 Por que tanta gente aqui nesta lista gosta de viver na fronteira entre a vida e a morte? 8.0.8 não é suportada já faz 4 anos!!! Sem contar que a última versão estável dela foi 8.0.26!!! Ou seja, a versão que você está usando tinha bug *conhecidos* há uns 7 ou 8 anos atrás! Risco, risco, risco, risco, risco desnecessário. []s Flavio Henrique A. Gurgel Consultor e Instrutor 4Linux Tel: +55-11-2125-4747 www.4linux.com.br ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Tratamento de Contrabarra
Em 06-08-2012 14:24, Anselmo Silva escreveu: Ops! Postgres 9.0.8 Ooops, então ignore meu e-mail anterior. Nossa, que susto. Flavio Henrique A. Gurgel Consultor e Instrutor 4Linux Tel: +55-11-2125-4747 www.4linux.com.br ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Tratamento de Contrabarra
On 06-08-2012 14:17, Anselmo Silva wrote: Detalhe : Postgres 8.0.8 [evite top-posting...] Considere atualizar pois esta versão já foi descontinuada a quase dois anos. Quanto a sua dúvida, contrabarra (\) é o caracter de escape do LIKE então para utilizá-lo você deve fazer escape nele: euler=# select * from prod where a LIKE '%\\%'; a -- tes \\ teste tes \ teste (2 registros) ou utilizar um caracter de escape diferente utilizando a cláusula ESCAPE: euler=# select * from prod where a LIKE '%\%' ESCAPE ''; a -- tes \\ teste tes \ teste (2 registros) -- Euler Taveira de Oliveira - Timbira http://www.timbira.com.br/ PostgreSQL: Consultoria, Desenvolvimento, Suporte 24x7 e Treinamento ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Tratamento de Contrabarra
Euler, desculpe-me pelo top-posting, não tive a intenção. Já está nos planos a atualização, mas, por hora, tem um problema ao aplicar sua sugestão. talvez por inexperiência minha. Na aplicação o campo de busca oferece ao usuário uma opção de buscar: (1)*Pelo Início do termo* - Assim faço: (SELECT NOME FROM PROD WHERE NOME LIKE '\%'); (2)*Em qualquer parte do termo* - Assim faço: (SELECT NOME FROM PROD WHERE NOME LIKE '%\%'); (3)*Pelo Fim do termo* - Assim faço: (SELECT NOME FROM PROD WHERE NOME LIKE '%\'); AVISO: uso de \' fora do padrão em cadeia de caracteres (4)S*omente o Termo* - Assim faço: (SELECT NOME FROM PROD WHERE NOME LIKE '\');AVISO: uso de \' fora do padrão em cadeia de caracteres Em 6 de agosto de 2012 14:35, Euler Taveira eu...@timbira.com escreveu: On 06-08-2012 14:17, Anselmo Silva wrote: Detalhe : Postgres 8.0.8 [evite top-posting...] Considere atualizar pois esta versão já foi descontinuada a quase dois anos. Quanto a sua dúvida, contrabarra (\) é o caracter de escape do LIKE então para utilizá-lo você deve fazer escape nele: euler=# select * from prod where a LIKE '%\\%'; a -- tes \\ teste tes \ teste (2 registros) ou utilizar um caracter de escape diferente utilizando a cláusula ESCAPE: euler=# select * from prod where a LIKE '%\%' ESCAPE ''; a -- tes \\ teste tes \ teste (2 registros) -- Euler Taveira de Oliveira - Timbira http://www.timbira.com.br/ PostgreSQL: Consultoria, Desenvolvimento, Suporte 24x7 e Treinamento ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral -- Anselmo M. Silva ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Tratamento de Contrabarra
2012/8/6 Anselmo Silva anselmo@gmail.com Euler, desculpe-me pelo top-posting, não tive a intenção. Já está nos planos a atualização, mas, por hora, tem um problema ao aplicar sua sugestão. talvez por inexperiência minha. Na aplicação o campo de busca oferece ao usuário uma opção de buscar: (1)*Pelo Início do termo* - Assim faço: (SELECT NOME FROM PROD WHERE NOME LIKE '\%'); (2)*Em qualquer parte do termo* - Assim faço: (SELECT NOME FROM PROD WHERE NOME LIKE '%\%'); (3)*Pelo Fim do termo* - Assim faço: (SELECT NOME FROM PROD WHERE NOME LIKE '%\'); AVISO: uso de \' fora do padrão em cadeia de caracteres (4)S*omente o Termo* - Assim faço: (SELECT NOME FROM PROD WHERE NOME LIKE '\');AVISO: uso de \' fora do padrão em cadeia de caracteres Use duas barras ao invés de uma, como já foi dito. Qual linguagem você usa? Algumas têm funções próprias pra dar um escape na string automaticamente (ou você pode usar um replace básico, tipo str = replace(str, \, \\)). Se você não está tratando isso, então está sujeito à SQL Injection. Atenciosamente, -- Matheus de Oliveira ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral