Olá pessoal,
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
Compartilhe!