Você usa Statement ou PreparedStatement?

Um belo dia fui fazer um teste em uma empresa na qual utilizavão o java com linhuagen de desenvolvimento

depois do teste recebi um e-mail e persebi que ainda falta-me muito para chegar a em considerar programador java ma uma dos quesito me chamou muito a atenção

– Quando for implementar algo utilizando JDBC puro, estude antes a respeito de SQL INJECTION. O JDBC tem tratamento específico para isto. nota do avaliador

a minha conclusão foi essa

Statement

não e seguro e vunerabel a pratica chamada SQL injection.

Vejam um exemplo:


String sql   = "select * from user where username='" 
+ username +"' and password ='" + password + "'";
stmt   = conn.createStatement();
rs     = stmt.executeQuery(sql);
 if (rs.next())
   {
   loggedIn = true ;
  out.println(" Usuário Logado com  sucesso.");
 } else {
    out.println("Usuário Senha não encontrado.");

 }

A principio nada de errado ai, mas se alguém colocar no campo
usuário isso admin’ OR ‘1′=’1 o comando select final ficaria algo
assim:


select * from user where username=’admin’ OR ‘1′=’1′ and password=” 

O resultado desse comando retorna o usuário admin, ou o primeiro
usuário cadastrado no banco que e geralmente o que tem SID root,
imaginem o estrago que isso pode acarretar.
Outro exemplo:

String sql = "select * from user where estado='RS'
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
if (rs.next()) {
    	out.println("Usuário:" + rs.getString(1));
}

Bem simples esse select né, mas se o usuário ao invés de
digitar ‘RS’, digitar ‘or true. Seria a mesma coisa que se o
select fosse ‘Select * from user’ Traz tudo!!! Agora pra
resolver esse tipo de coisa você pode usar
PreparedStatement ao invés de Statement.
Exemplo:


String select = "SELECT * FROM User WHERE username = ? ";
PreparedStatement 
prepStmt = con.prepareStatement(selectStatement);
prepStmt.setString(1, username);
ResultSet rs = prepStmt.executeQuery();

O SQL Injection não tem vez contra o PreparedStatement, que
além de deixa a aplicação mais “segura”,  também melhora a
performance da mesma.

eu so sei isso mais eu me divirto 🙂

Anúncios

Zerar campo Identity no SQL Server

Se você precisa zerar um campo tipo identity no SQL Server, é possivel fazer isso usando o comando DBCC CHECKIDENT. Existem três formas de usar este comando que são:

1. DBCC CHECKIDENT (NomeTabela, NORESEED)
Simplesmente será retornado o valor atual do campo identity

2. DBCC CHECKIDENT (NomeTabela)
Será retornado o valor atual do campo identity e se for necessário fazer algum ajuste nos valores, estes ajustes serão feitos automaticamente. Por exemplo: Se o valor do campo identity estiver menor que o número total do contador de registros da tabela.

3. DBCC CHECKIDENT (NomeTabela, RESEED, 0)
Desta forma o valor atual do campo identity será alterado para o valor informado no tereceiro parametro (neste caso zero). Quando se cria uma tabela e nunca foi inserido nenhum registro nela, o valor inicial que a função retorna é NULL, mas se você quiser zerar o valor terá que passar o valor 0 (zero) como parametro. Assim o próximo registro a ser inserido será o valor 1.

Diferenças em @@IDENTITY, SCOPE_IDENTITY e IDENT_CURRENT

@@IDENTITY, SCOPE_IDENTITY() e IDENT_CURRENT() são funções similares onde retornam o último valor inserido sobre a coluna IDENTITY de uma tabela. Porém, é preciso ficar atento pois dependendo do escopo e da sessão onde são chamadas, podem retornar valores diferentes do esperado.

USE MAQUINA
GO
CREATE TABLE ATABELA1(
TB_id  int IDENTITY(1,1)PRIMARY KEY,
TB_NOME varchar(20) NOT NULL)

INSERT ATABELA1 VALUES (‘PEQUENA’)
INSERT ATABELA1 VALUES (‘MACNAMARA’)
INSERT ATABELA1 VALUES (‘PETRONIO’)

SELECT * FROM ATABELA1

— Registros em ATABELA1
TB_id   TB_NOME
——————————-
1      PEQUENA
2      MACNAMARA
3      PETRONIO

CREATE TABLE  ATABELA2(
TB2_id  int IDENTITY(100,5)PRIMARY KEY,  TB2_NOME varchar(20) NULL)

INSERT ATABELA2 (TB2_NOME) VALUES (‘PUNK ROCK’)
INSERT ATABELA2  (TB2_NOME) VALUES (‘ROCK N´ROLL’)
INSERT ATABELA2 (TB2_NOME) VALUES (‘HEAVY METAL’)

SELECT * FROM ATABELA2

— Registros em ATABELA2
TB2_id  TB2_NOM
—————
100   PUNK ROCK
105   ROCK N´ROLL
110  HEAVY METAL

/* Cria uma trigger que insere um registro em ATABELA2 quando um registro é inserido em ATABELA1 */
CREATE TRIGGER T1_trig ON ATABELA1  FOR INSERT AS
BEGIN
INSERT ATABELA2 VALUES (”)
END

@@IDENTITY

Apesar de @@IDENTITY ser conhecido como uma variável global, ele é isolado por sessão, ou seja, retorna o último valor identity inserido em qualquer tabela desde que seja na sessão corrente. Entenda sessão como sendo uma conexão.

Exemplo:

/* Dispara a trigger e retorna o valor obtido para @@IDENTITY */
INSERT ATABELA1 VALUES (‘ROSELI KHOL’)
SELECT @@IDENTITY AS [@@IDENTITY]
— Retorna 115 – valor identity inserido sobre a tabela ATABELA2
GO

O problema aqui é que a tabela ATABELA1 possui um trigger que também gera insert em outra tabela com identity (ATABELA2). O valor de @@IDENTITY é alterado devido ao insert realizado pelo trigger, desta forma o valor que será retornado não é o identity para ATABELA1, mas sim o identity para ATABELA2.

IDENT_CURRENT()

IDENT_CURRENT não é limitado por escopo ou sessão, mas sim por uma tabela em específico. IDENT_CURRENT retorna o último valor identity inserido em uma determinada tabela em qualquer sessão ou escopo.

Exemplo:

/* Dispara a trigger e retorna o valor obtido para IDENT_CURRENT */
INSERTATABELA1 VALUES (‘ROSELI KHOL‘)
SELECT IDENT_CURRENT(‘ATABELA1’) AS [IDENT_CURRENT
] — Retorna 4 – valor identity inserido sobre a tabela ATABELA1
GO

Se estiver testando isso, irá parecer que funcionou, devolverá o valor identity para a tabela ATABELA1. O problema é que o IDENT_CURRENT não está preso a uma sessão, então se estiver ocorrendo inserções simultâneas sobre a tabela ATABELA1, o valor que ele poderá estar retornando pode não ser o da sua inserção.

SCOPE_IDENTITY()

Assim como @@IDENTITY, SCOPE_IDENTITY() retornará o último valor identity inserido em qualquer tabela na sessão corrente.

Exemplo:

/* Dispara a trigger e retorna o valor obtido para SCOPE_IDENTITY */
INSERT ATABELA1 VALUES (‘ROSELI KHOL’)
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]
— Retorna 4 – valor identity inserido sobre a tabela ATABELA1
GO

Entretando, SCOPE_IDENTITY é limitado a um escopo e com isso retornará o último valor identity inserido dentro do escopo de um determinado batch. Como o trigger é considerado um outro escopo, o valor de identity da tabela ATABELA1  será devolvido corretamente

Referências:  http://www.mcdbabrasil.com.br/modules.php?name=News&file=article&sid=59


O uso de stored procedures em Mysql

A maior vantagem do uso de stored procedures é a redução de tráfico na rede. Já que as stored procedures são executadas pelo SGDB na máquina servidora de banco de dados,Stored procedures aumentam a performance de outra forma também. Você pode utilizar querys para fazer muitas das coisas que podem ser feitas com stored procedures mas uma query tem uma grande desvantagem. Cada vez que a aplicação cliente envia um comando SQL para o servidor o comando tem que ser “parsed”, ou seja, analisado gramaticalmente, submetido ao optimizador para formulação de um plano de execução. Stored procedures são analisadas , optimizadas e armazenadas em uma forma executável no momento em que são adicionadas ao banco de dados.
Exemplo:

— DELETA A PROCEDURE SE EXISTIR
DROP PROCEDURE IF EXISTS `axelalexander`.`sp_insere_artcategoria` $$
— CRIA A PROCEDURE
CREATE PROCEDURE `axelalexander`.`sp_insere_artcategoria` ( categoria VARCHAR(20)
)
BEGIN
— SE A VARIAVEL NÃO FOI IGUAL NULO FAZ O INSERT
IF categoria IS NOT NULL THEN
INSERT INTO artcategoria (Categoria ) VALUES (categoria);
END IF;
END $$
DELIMITER ;
— FIM DA PROCEDURE

JavaScript – Controladores de eventos

onAbort
Executa um código JavaScript quando o usuário interrompe o carregamento de uma imagem, por exemplo, com um clique no botão Parar. Deve ser usado com o objeto imagem (IMG) de HTML.
Exemplo:
<IMG NAME=”foto” SRC=”minha_foto.gif” onAbort=”alert(‘Você não viu minha foto’)”>

onBlur
Executa um código JavaScript quando um elemento, janela ou quadro, perde o foco. Usado para Button, Checkbox, FileUpload, Layer, Password, Radio, Reset, Select, Submit, Text, Textarea, window, na forma onBlur=”algumaCoisa”, onde “algumaCoisa” é uma função ou código de JavaScript.

Exemplo:
<INPUT TYPE=”text” VALUE=”” NAME=”nome” onBlur=”verificarNome(this.value)”>

Onde “verificarNome(n)” é uma função (a ser desenvolvida) para verificar se o usuário inseriu um nome válido.

onChange
Executa um código JavaScript quando um campo perde o foco e tem seu valor modificado. Usado para FileUpload, Select, Text, Textarea, na forma onChange=”algumaCoisa”, onde “algumaCoisa” é uma função ou código de JavaScript.
Exemplo:
<INPUT TYPE=”text” VALUE=”” NAME=”nome” onChange=”verificarNome(this.value)”>

Onde “verificarNome(n)” é uma função (a ser desenvolvida) para verificar se o usuário inseriu um nome válido.

onClick
Executa um código JavaScript quando um objeto é clicado. Usado para Button, document, Checkbox, Link, Radio, Reset, Submit, na forma onClick=”algumaCoisa”, onde “algumaCoisa” é uma função ou código de JavaScript.
Exemplo 1:
<A HREF=”http://www.abc.com.br/&#8221; onClick=”return confirm(‘Abre ABC?’)”>Empresa AB</A>
Se o usuário clica no link, abre a caixa de confirmação. Se, nessa caixa, o botão Cancelar é clicado, o link não é aberto.
Exemplo 2:
<INPUT TYPE=”button” VALUE=”Resultado” onClick=”calcular(this.form)”>
Ao clicar no botão, é chamada a função “calcular(a)” (a ser desenvolvida).

onDblClick
Executa um código JavaScript quando um duplo clique é dado no objeto. Usado para document, Link, na forma onDblClick=”algumaCoisa”, onde “algumaCoisa” é uma função ou código de JavaScript.
Exemplo:
<form>
<INPUT Type=”button” Value=”Teste” onDblClick=”alert(‘Foi dado um duplo clique’)”>
</form>

onDragDrop
Executa um código JavaScript quando um objeto é arrastado para a janela do navegador. Usado para window, na forma onDragDrop=”algumaCoisa”, onde “algumaCoisa” é uma função ou código de JavaScript.

onError
Executa um código JavaScript quando um erro ocorre no carregamento de uma janela ou imagem. Usado para Image, window, na forma onError=”algumaCoisa”, onde “algumaCoisa” é uma função ou código de JavaScript.
O evento só ocorre em caso de erro de sintaxe no código ou erro em tempo de execução do mesmo. Não reporta erros do navegador.
Se é forçado para nulo, suprime mensagens de erro.

Exemplo 1:
<IMG NAME=”foto” SRC=”foto.gif” ALIGN=”left” BORDER=”2″ onError=”null”>
Exemplo 2:
<SCRIPT language=”javascript”_>
window.onerror=null
</SCRIPT>
<IMG NAME=”foto” SRC=”foto.gif” ALIGN=”left” BORDER=”2″>

O primeiro exemplo suprime mensagens de erro apenas no carregamento da imagem foto.gif. O segundo exemplo suprime para toda a janela.

onFocus
Executa um código JavaScript quando o objeto recebe o foco. Usado para Button, Checkbox, FileUpload, Layer, Password, Radio, Reset, Select, Submit, Text, Textarea, window, na forma onFocus=”algumaCoisa”, onde “algumaCoisa” é uma função ou código de JavaScript.
Exemplo:
<INPUT TYPE=”text” VALUE=”” NAME=”nome” onFocus=”verificarNome(this.value)”>
Onde “verificarNome(n)” é uma função (a ser desenvolvida) para verificar se um nome válido existe no campo toda vez que esse campo recebe o foco.

onKeyDown
Executa um código JavaScript quando uma tecla é pressionada. Usado para document, Image, Link, Text, Textarea, na forma onKeyDown=”algumaCoisa”, onde “algumaCoisa” é uma função ou código de JavaScript.
Exemplo:

<script language=”javascript”>
function semArroba(e){
var carac = String.fromCharCode(e.which);
if (carac == ‘@’)
return false;
}
document.form1.nome.onkeydown = semArroba;
</script>

<form NAME=”form1″>
<INPUT TYPE=”text” VALUE=”” NAME=”nome”>
</form>

O código dado evita que o usuário insira o caractere “@” no campo “nome”.

onKeyPress
Executa um código JavaScript quando o usuário pressiona ou mantém pressionada uma tecla. Usado para document, Image, Link, Text, Textarea, na forma onKeyPress=”algumaCoisa”, onde “algumaCoisa” é uma função ou código de JavaScript.
Exemplo:
<script language=”javascript”>
function rolar(e){
var carac = String.fromCharCode(e.which);
if (carac == ‘c’)
self.scrollBy(0,10);
else if(carac == ‘b’)
self.scrollBy(0,-10);
else
return false;
}
document.captureEvents(Event.KEYPRESS);
document.onkeypress = rolar;
</script>

O código dado rola a tela 10 pixels acima se o caractere “c” for pressionado e abaixo se “b” for pressionado (o evento KeyPress é repetido continuamente enquanto o usuário mantém a tecla pressionada).

onKeyUp
Executa um código JavaScript quando o usuário libera uma tecla que foi pressionada. Usado para document, Image, Link, Text, Textarea, na forma onKeyUp=”algumaCoisa”, onde “algumaCoisa” é uma função ou código de JavaScript.
Exemplo:
<script language=”javascript”>

function teclaLiberada(e){
var carac = String.fromCharCode(e.which);
alert(“Você liberou a tecla ” + carac);
}
document.onkeyup=teclaLiberada;
document.captureEvents(Event.KEYUP);

</script>

O código dado exibe uma mensagem com o caractere da tecla liberada.

onLoad
Executa um código JavaScript quando o navegador termina o carregamento de uma janela, de todos os quadros dentro de um FRAMESET, de uma imagem. Usado para Image, Layer, window, na forma onLoad=”algumaCoisa”, onde “algumaCoisa” é uma função ou código de JavaScript.
Se é usado para uma imagem gif animada, é executado para cada parte da animação.
Exemplo 1:

<script language=”javascript”>

function nomeImagem(img){
alert(‘Carregada imagem ‘ + img.name);
}

</sript>
<IMG NAME=”foto” SRC=”foto.gif” ALIGN=”left” BORDER=”2″ onLoad=”nomeImagem(this)”>
O código exibe o nome da imagem exibida.

Exemplo 2:

<BODY onLoad=”window.alert(“Este é o nosso site!”)>

O código exibe uma mensagem sempre que um usuário abre a página.

onMouseDown

Executa um código JavaScript quando o usuário pressiona um botão do mouse. Usado para Button, document, Link, na forma onMouseDown=”algumaCoisa”, onde “algumaCoisa” é uma função ou código de JavaScript.

onMouseMove
Executa um código JavaScript quando o usuário move o cursor com o mouse. Usado na forma onMouseMove=”algumaCoisa”, onde “algumaCoisa” é uma função ou código de JavaScript.
Notar que não é associado a nenhum evento em particular por ser bastante freqüente.

onMouseOut
Executa um código JavaScript quando o usuário move o cursor de dentro para fora de uma determinada área (mapa de imagem ou link). Usado para Layer, Link, na forma onMouseOut=”algumaCoisa”, onde “algumaCoisa” é uma função ou código de JavaScript.

onMouseOver
Executa um código JavaScript quando o usuário move o cursor de fora para dentro de uma determinada área (mapa de imagem ou link). Usado para Layer, Link, na forma onMouseOver=”algumaCoisa”, onde “algumaCoisa” é uma função ou código de JavaScript.
Exemplo:
<A HREF=”http://www.abc.com.br/&#8221; onMouseOver=”window.status=’Loja ABC – Tudo para seu micro’; return true”>Empresa ABC</A>

O código dado exibe a mensagem na barra de status do navegador sempre que o usuário passa o cursor sobre o link.

onMouseUp
Executa um código JavaScript quando o usuário libera um botão do mouse. Usado para Button, document, Link, na forma onMouseUp=”algumaCoisa”, onde “algumaCoisa” é uma função ou código de JavaScript.

onMove
Executa um código JavaScript quando o usuário move uma janela. Usado para window, na forma onMove=”algumaCoisa”, onde “algumaCoisa” é uma função ou código de JavaScript.

onReset
Executa um código JavaScript quando o usuário clica o botão Reset de um formulário. Usado para Form, na forma onReset=”algumaCoisa”, onde “algumaCoisa” é uma função ou código de JavaScript.

Exemplo:

<FORM NAME=”form1″ onReset=”alert(‘Considerado meio padrão de envio’)”>
Meio de envio:
<INPUT TYPE=”text” NAME=”forma” VALUE=”Via aérea” SIZE=”2″_>
<INPUT TYPE=”reset” NAME=”padrao” VALUE=”Limpar”>
</FORM>

O código dado avisa que o meio padrão será considerado se o usuário clicar no botão “Limpar” do formulário.

onResize
Executa um código JavaScript quando o usuário redimensiona uma janela ou um frame. Usado para window, na forma onResize=”algumaCoisa”, onde “algumaCoisa” é uma função ou código de JavaScript.

Exemplo:
<script language=”javascript”>
function abrirJanela(){
var janela;
janela=window.open(“janela.htm”,null,”width=200, height=200, resizable=yes,  menubar=no, location=no”);
janela.captureEvents(Event.RESIZE);
janela.onresize=informar;
}

function informar(){
alert(“Janela redimensionada para largura: ” + this.outerWidth + “e altura: ” +this.outerHeight);
this.focus();
}
</script>

O código dado informa a nova largura e a nova altura sempre que a janela é redimensionada.

onSelect
Executa um código JavaScript quando o usuário seleciona um texto em uma caixa. Usado para Text, Textarea, na forma onSelect=”algumaCoisa”, onde “algumaCoisa” é uma função ou código de JavaScript.

onSubmit
Executa um código JavaScript quando o usuário clica o botão Submeter de um formulário. Usado para Form, na forma onSubmit=”algumaCoisa”, onde “algumaCoisa” é uma função ou código de JavaScript.
Exemplo:
<FORM NAME=”form1″ onSubmit=”return verificarDados(this)”>
</FORM>

No código dado, a função a ser desenvolvida, “verificarDados(a)”, deve retornar True se os dados são válidos e False caso contrário.

onUnload
Executa um código JavaScript quando o usuário sai da janela. Usado para window, na forma onUnload=”algumaCoisa”, onde “algumaCoisa” é uma função ou código de JavaScript.
Exemplo:
<BODY onUnload=”terminar()”>

No código dado, a função a ser desenvolvida, “terminar()”, deve fazer alguma ação que for necessária quando o usuário sair da janela.

O PostgreSQL

O PostgreSQL é um poderoso sistema gerenciador de banco de dados objeto-relacional de código aberto.  Tem mais de 15 anos de desenvolvimento ativo e uma arquitetura que comprovadamente ganhou forte reputação de confiabilidade, integridade de dados e conformidade a padrões.  Roda em todos os grandes sistemas operacionais, incluindo GNU/Linux, Unix (AIX, BSD, HP-UX, SGI IRIX, Mac OS X, Solaris, Tru64), e MS Windows. É totalmente compatível com ACID, tem suporte completo a chaves estrangeiras, junções (JOINs), visões, gatilhos e procedimentos armazenados (em múltiplas linguagens).  Inclui a maior parte dos tipos de dados do ISO SQL:1999, incluindo INTEGER, NUMERIC, BOOLEAN, CHAR, VARCHAR, DATE, INTERVAL, e TIMESTAMP.  Suporta também o armazenamento de objetos binários, incluindo figuras, sons ou vídeos.  Possui interfaces nativas de programação para C/C++, Java, .Net, Perl, Python, Ruby, Tcl, ODBC, entre outros,

http://www.softwarepublico.gov.br/i-encontro-spb

coneça neste link Portal do Software Público Brasileiro os projetos desenvolvido utilizando o postgreSQL

postgres

http://www.postgresql.org.br

Java & Postgres

Antes de começar e necessário entender que “Programar é a arte de dominar e organizar a complexidade” sempre devemos nos perguntar o que queremos programar, logico acompanhado de uma boa analise  eclaro.

Bom devido as pesquisa e inumeras tentativa frustrantes  resolvi posta este post e demostra uma maneira mais facil de cria uma clase coneção com Java e Postgres, no decorrer do tempo postarei como efetuar a manutenção do sitema com os metodos insert, update, delete,

Salve salve Programadores das Noites mal dormidas

esta e uma classe conexao que fiz e aparentemente esta funcionado perfeitamente

Classe conexao

Classe conexao

package Utilitarios;

/**
*
* @author FENIX
*/
import java.sql.*;
import javax.swing.*;

public class conexao {

final private String driver = “org.postgresql.Driver”;
final private String Url = “jdbc:postgresql://localhost:5432/PAX”;
final private String usuario = “postgres”;
final private String senha = “pequena”;
private Connection conexao;
public Statement statement;
public ResultSet resultset;

public boolean conecta() {
boolean result = true;
try {

Class.forName(driver);
conexao = DriverManager.getConnection(Url, usuario, senha);
JOptionPane.showMessageDialog(null, “Conectou”);
} catch (ClassNotFoundException Driver) {
JOptionPane.showMessageDialog(null, “Diver não localizado” + Driver);
result = false;
} catch (SQLException Fonte) {
JOptionPane.showMessageDialog(null, “Deu erro na conexao” +
“com a fonte” + Fonte);
result = false;

}
return result;

}

public void desconecta() {
boolean result = true;
try {
conexao.close();
JOptionPane.showMessageDialog(null, “Banco Fechado”);
} catch (SQLException erroSQL) {
JOptionPane.showMessageDialog(null, “Não foi Possivel” + “Fechar o Banco” + erroSQL.getMessage());
result = false;
}

}

public void executeSQL(String sql) {
try {
statement = conexao.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
//(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
resultset = statement.executeQuery(sql);

} catch (SQLException sqlex) {
JOptionPane.showMessageDialog(null, “Não foi posivel executar o comando SQL” + sqlex + “o comando SQL passado foi” + sql);
}
}
}