Para que usar WHERE 1 = 1 numa query?

03/05/2017

22

SQL

Pessoal, vi uma coisa nuns projetos aqui que me deixou encucado.

Numas queries que tive que mexer aqui vi que existia essa condição que ao meu ver não faz NADA. Mas posso estar errado, sei lá rs.

Umas das queries foi a seguinte:

SELECT id_funcionario, nome, status FROM tbl_funcionario WHERE 1 = 1


Sinceramente, não consigo entender o porquê dessa condição. Mas como a vida é uma caixinha de surpresas, gostaria de saber com alguém se essa condição tem algum motivo para ser usada.

Obrigado!
Responder

Post mais votado

03/05/2017

Bom dia Robson Cavalcante,

o uso do 1 = 1 na clausula where, se dá pelo fato do programa que faz o select no banco de dados ter filtros para buscar os dados.

E quando esses filtros não são utilizados, o programa insere 1 = 1, pois é uma sentença verdadeira que não compromete a execução da consulta.

Exemplo:

Relatórios de Relação de Clientes;

Filtros --> Código, Nome e CNPJ

Consulta -->

SELECT CODIGO, NOME, CNPJ
FROM CLIENTES
WHERE |CODIGO| AND |NOME| AND |CNPJ|

Caso o usuário só insira o código no filtro para gerar esse relatório, a consulta ficará assim:

SELECT CODIGO, NOME, CNPJ
FROM CLIENTES
WHERE CODIGO = 'DIGITO DO USUARIO AND 1 = 1 AND 1 = 1

Com isso não teriamos, problemas na execução da consulta.

Se o programa não fizer essa substituição, no momento de passar a consulta SQL, o código ficaria assim:

SELECT CODIGO, NOME, CNPJ
FROM CLIENTES
WHERE CODIGO = 'DIGITO DO USUARIO AND |NOME| AND |CNPJ|

E geraria erro de execução, pois não é uma instrução válida.

Essa é uma forma de se utilizar o 1=1.

Espero ter ajudado e desejo boa sorte em sua jornada.
Responder

Mais Posts

03/05/2017

Gabriel Rocha

Esta condição em princípio não aparenta ter razão de ser, pois removê-la dá no mesmo.

No entanto, quando as condições do where são geradas dinamicamente, e o programador vai acrescentando-as com AND dentro de ifs, por estas dependerem de outros fatores do programa que gera o SQL, fica clara sua intenção:

Se nao houver condição adicional, a query permanece assim ...

SELECT * FROM Destinatario where 1 = 1

... mas no caso, se for verdadeira a condição logo em seguida do seu exemplo, ela pode ficar:

SELECT * FROM Destinatario where 1 = 1 AND Nome = "Roberto"

Note que se não houvesse o WHERE 1=1, ela ficaria desta forma, e não funcionaria:

SELECT * FROM Destinatario AND Nome = "Roberto"
-- temos um erro aqui --^

Para uma condição AND só, o autor poderia ter posto o WHERE dentro da condição, mas se forem varias condiçoes, o WHERE 1=1 permitiria várias condições separadas, montadas por ifs diferentes:

SELECT * FROM Destinatario where 1 = 1
SELECT * FROM Destinatario where 1 = 1 AND Nome = "Roberto"
SELECT * FROM Destinatario where 1 = 1 AND Cidade = "Santos"
SELECT * FROM Destinatario where 1 = 1 AND Nome = "Roberto" AND Cidade = "Santos"

Assim, o AND Nome poderia estar em um if e o AND Cidade em outro, e todos funcionariam independente de ter que saber se já há um if anterior no código que gera o SQL.
Responder
Hum, entendi...

Quando eu por exemplo estou construindo minhas queires, faço por meio da programação, verificando como a query está sendo construída. Por isso não tinha visto a necessidade de se usar essa condição que sempre dá true.

Enfim, espero não usar isso. Muito obrigado Rafael e Gabriel!
Responder

10/05/2017

Fabio Parreira

Está função é muito utilizada por crackers ou hackers para testar SQL Injection em uma aplicação, sendo que 1 = 1 vai retornar um valor booleano. No caso, a pessoa que está fazendo o ataque não sabe o nome das colunas do banco de dados, neste caso utiliza-se esta condição apenas para confirmar se a aplicação vai retornar algum valor ou não, caso verdadeira, sabe-se que aquele sistema é vulnerável a SQL Injection.
Responder

12/05/2017

Carlos Arantes

Está função é muito utilizada por crackers ou hackers para testar SQL Injection em uma aplicação, sendo que 1 = 1 vai retornar um valor booleano. No caso, a pessoa que está fazendo o ataque não sabe o nome das colunas do banco de dados, neste caso utiliza-se esta condição apenas para confirmar se a aplicação vai retornar algum valor ou não, caso verdadeira, sabe-se que aquele sistema é vulnerável a SQL Injection.


Caramba, pode crer! É só colocar essa condição no login e colocar o comentário do banco de dados que ele vai aceitar. Fiz um teste aqui e aconteceu exatamente isso! Como posso evitar isso?
Responder

12/05/2017

Fabio Parreira

Segue um artigo da DevMedia.
SQL Injection - PHP

Embora seja em PHP o conceito é mesmo.
Responder

12/05/2017

Fabio Parreira

Se quiser ir a fundo em segurança para website e quiser testar se seu site é seguro, sugiro usar um programa que se chama "Acunetix".
Esse programa é mesmo o capeta, ele vai varrer seu site inteiro, testar vários tipos de ataque, inclusive SQL Injection. Ele é pago mas você encontra versões "pipipithu" por ai. rs(Muito cuidade ao usar esse programa em sites, pois ele faz muitas requisições no server e deixa um grande rastro).
Agora para SQL Injection mesmo tem o Havij, que é bem voltado a invasão de sistemas através de SQL Injection, e vai por mim, você consegue invadir uns 7 sites de 10 em PHP. Teste comprovado por quem vos escreve.
Responder
Se quiser ir a fundo em segurança para website e quiser testar se seu site é seguro, sugiro usar um programa que se chama "Acunetix".
Esse programa é mesmo o capeta, ele vai varrer seu site inteiro, testar vários tipos de ataque, inclusive SQL Injection. Ele é pago mas você encontra versões "pipipithu" por ai. rs(Muito cuidade ao usar esse programa em sites, pois ele faz muitas requisições no server e deixa um grande rastro).
Agora para SQL Injection mesmo tem o Havij, que é bem voltado a invasão de sistemas através de SQL Injection, e vai por mim, você consegue invadir uns 7 sites de 10 em PHP. Teste comprovado por quem vos escreve.



Obrigado pela sugestão Parreirafabio. Você trabalha com banco de dados? Parece conhecer bastante sobre a área?
Responder

18/05/2017

Fabio Parreira

Sim. Trabalho. Tenho certificações Microsoft SQL Server na área.
Responder