Algumas práticas essenciais de segurança para desenvolvimento web com Java
A segurança não é uma opção quando falamos de aplicações web modernas - é um requisito fundamental. Em um cenário onde ataques cibernéticos crescem de forma assustadora, nós como desenvolvedores Java precisamos incorporar práticas de segurança desde o primeiro dia de desenvolvimento.
Neste artigo, você descobrirá algumas das estratégias de proteção para suas aplicações Java.
Por que a segurança em Java é um diferencial competitivo?
Java se mantém como uma das linguagens mais seguras para desenvolvimento web, o java oferece mecanismos robustos de proteção, mas cabe a nós utiliza-los corretamente.
Grande parte das violações de dados começam com falhas que poderiam ser evitadas com práticas básicas de segurança. Portanto, domina-las é um ativo valioso.
Algumas práticas essenciais de segurança para desenvolvimento web com Java
Proteção contra SQL Injection
SQL Injection é uma das vulnerabilidades mais exploradas em aplicações web. No Java, você pode prevenir estes ataques usando o Prepared Statements:
// Prática insegura (NUNCA FAÇA ISSO)
String query = "SELECT * FROM users WHERE username = '" + username + "'";
// Prática segura com PreparedStatement
String query = "SELECT * FROM users WHERE username = ?";
PreparedStatement pstmt = connection.prepareStatement(query);
pstmt.setString(1, username);
ResultSet rs = pstmt.executeQuery();
Frameworks como Hibernate e JPA podem auxiliar, eliminando a necessidade de consultas SQL diratamente no codigo.
Implementação adequada de autenticação e autorização
Spring Security é uma das bibliotecas mais utilizadas para implementar autenticação e autorização em aplicações Java. Veja como implementar autenticação básica:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/public/**").permitAll()
.antMatchers("/admin/**").hasRole("ADMIN")
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("user").password(passwordEncoder().encode("password")).roles("USER")
.and()
.withUser("admin").password(passwordEncoder().encode("admin")).roles("ADMIN");
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
Implementação de HTTPS
HTTPS é obrigatório para qualquer aplicação web moderna. Em aplicações Spring Boot, você pode configurar HTTPS de forma simples, por exemplo:
# application.properties
server.port=8443
server.ssl.key-store=classpath:keystore.p12
server.ssl.key-store-password=your-password
server.ssl.key-store-type=PKCS12
server.ssl.key-alias=tomcat
Criando um config para o redirecionamento de HTTP para HTTPS:
@Configuration
public class HttpsConfig {
@Bean
public ServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
@Override
protected void postProcessContext(Context context) {
SecurityConstraint securityConstraint = new SecurityConstraint();
securityConstraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection collection = new SecurityCollection();
collection.addPattern("/*");
securityConstraint.addCollection(collection);
context.addConstraint(securityConstraint);
}
};
tomcat.addAdditionalTomcatConnectors(redirectConnector());
return tomcat;
}
private Connector redirectConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
connector.setPort(8080);
connector.setSecure(false);
connector.setRedirectPort(8443);
return connector;
}
}
Ferramentas de análise de segurança para Java
Além de implementar práticas seguras, é importante verificar regularmente sua aplicação contra vulnerabilidades conhecidas. Deixo aqui algumas ferramentas que podem auxiliar nesse trabalho:
- OWASP Dependency-Check: verifica dependências contra vulnerabilidades conhecidas
- SonarQube: identifica problemas de segurança no código (Pode instalar o plugin em seu IDE que já ajuda bastante)
A segurança em aplicações devem ser consideradas no desenvolvimento desde o primeiro dia.