Statement e SQL injection em Java
Vamos falar um pouco de segurança? Como andam suas aplicações web no quesito segurança?
Você usar Statement ou PreparedStatement? Se a resposta for “Statement” saiba que sua aplicação pode estar correndo grande perigo, por uma 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árioSenha 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.
Abraços
Tiago Silveira
Compare Preços de: MP3, iPod, celulares, notebooks, câmeras no Buscapé.

março 2nd, 2008 at 2:26 am
outubro 7th, 2008 at 1:42 pm
String select = “SELECT * FROM User WHERE username = ? “;
PreparedStatement prepStmt = con.prepareStatement(selectStatement);
prepStmt.setString(1, username);
ResultSet rs = prepStmt.executeQuery();
Nesse código entendo que o “username” será o valor do campo digitado pelo usuário… certo ?
E se o usuario digitar algo como “jose or 1 = 1″ o que acontece ?
Sou leigo no assunto… obrigado.