Prevenção de injeções de SQL e XSS em APIs RESTful
======================================================
Introdução
APIs RESTful são essenciais para a integração de aplicações e serviços em nuvem, mas também são vulneráveis a ataques de injeção de código malicioso, como SQL e XSS. Neste artigo, exploraremos as melhores práticas e técnicas para evitar injeções de SQL e XSS em APIs RESTful.
injeções SQL
As injeções de SQL ocorrem quando um invasor injeta código SQL malicioso em um aplicativo para acessar dados confidenciais ou modificar o banco de dados. Abaixo estão as práticas recomendadas para evitar injeções de SQL:
1. Usando consultas preparadas
Consultas preparadas são uma forma de evitar injeções de SQL. As consultas preparadas são criadas com parâmetros separados do código SQL, o que evita a injeção de código.
Exemplo de código em Java (Spring Boot)
java
@Query("SELECT * FROM usuários WHERE nome = :nome")
List<Usuário> findUserByName(@Param("nome") String nome);
2. Uso de declarações preparadas
As instruções preparadas são semelhantes às consultas preparadas, mas são usadas para instruções não SELECT.
Exemplo de código em Java (Spring Boot)
java
@Modificável
@Query(value = "ATUALIZAR usuários SET nome = :nome WHERE id = :id", nativeQuery = true)
void updateUser(@Param("nome") String nome, @Param("id") ID longo);
3. Uso de ORM (Mapeamento Objeto-Relacional)
ORMs como o Hibernate podem ajudar a evitar injeções de SQL usando consultas e instruções preparadas.
Exemplo de código em Java (Hibernate)
java
@Entidade
classe pública Usuário {
@Coluna(nome = "nome")
nome da string privada;
}
classe pública DAOUser {
@PersistenceContext
EntityManager privado em;
public List<Usuário> findUsersByName(String nome) {
Consulta consulta = em.createQuery("SELECT u FROM User u WHERE u.name = :name");
query.setParameter("nome", nome);
retornar query.getResultList();
}
}
4. Validação de entrada do usuário
A validação da entrada do usuário é crucial para evitar injeções de SQL. Os dados de entrada devem ser validados para garantir que não contenham código SQL malicioso.
Exemplo de código em Java (Spring Boot)
java
@PostMapping("/usuários")
public ResponseEntity<User> createUser(@RequestBody @Valid User user) {
// Validação de entrada do usuário
if (user.getName() == null || user.getName().isEmpty()) {
retornar ResponseEntity.badRequest().build();
}
//Cria usuário
}
injeções de XSS
As injeções de Cross-Site Scripting (XSS) ocorrem quando um invasor injeta código malicioso em um aplicativo da web para acessar dados confidenciais ou executar ações maliciosas. Abaixo estão as práticas recomendadas para evitar injeções de XSS:
1. Uso de escape de caracteres
O escape de caracteres é uma forma de evitar injeções de XSS. Os caracteres especiais são substituídos pelos seus equivalentes HTML.
Exemplo de código JavaScript
javascript
const nome = "<script>alert('XSS')</script>";
const escapedName = escape(nome);
console.log(escapedName); // Saída: <script>alert('XSS')</script>
2. Uso de bibliotecas de escape
O escape de bibliotecas como DOMPurify pode ajudar a evitar injeções de XSS ao escapar de caracteres especiais.
Exemplo de código JavaScript
javascript
const nome = "<script>alert('XSS')</script>";
const escapedName = DOMPurify.sanitize(nome);
console.log(escapedName); // Saída: <script>alert('XSS')</script>
3. Uso da Política de Segurança de Conteúdo (CSP)
O CSP é uma diretiva que permite aos desenvolvedores especificar quais fontes de código podem ser executadas em uma página web.
Exemplo de código HTML
html
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' https://cdn.example.com;">
4. Uso de HTTPS
Usar HTTPS é crucial para evitar injeções de XSS. Os ataques XSS podem ser evitados usando HTTPS, que criptografa a comunicação entre o cliente e o servidor.
Exemplo de código no Apache
bash
<HostVirtual *:443>
ServerName exemplo.com
DocumentRoot /var/www/exemplo
Motor SSL ativado
SSLCertificateFile /etc/ssl/certs/example.crt
SSLCertificateKeyFile /etc/ssl/private/example.key
</VirtualHost>
Arquitetura de API RESTful
A arquitetura de API RESTful é crucial para evitar injeções de SQL e XSS. Aqui está uma arquitetura de API RESTful segura:
Arquitetura de API RESTful
Configurações de segurança
As configurações de segurança são cruciais para evitar injeções de SQL e XSS. Abaixo estão algumas configurações de segurança recomendadas:
Configuração de segurança no Spring Boot
propriedades
spring.datasource.url=jdbc:mysql://localhost:3306/example
spring.datasource.username=root
spring.datasource.password=senha
spring.jpa.hibernate.ddl-auto=atualização
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect
Configuração de segurança no Apache
bash
<Diretório /var/www/exemplo>
Índices de opções FollowSymLinks MultiViews
Permitir substituir tudo
Ordem permitir, negar
permitir de todos
</Diretório>
<FilesMatch "\.(cgi|shtml|phtml|php)$">
Opções SSL +StdEnvVars
</FilesMatch>
<IfModule mod_security2.c>
SecFilterEngine ativado
SecFilterScanPOST ativado
SecFilterScanGET ativado
</IfModule>
Configuração de segurança no Nginx
bash
servidor {
ouça 80;
nome_servidor exemplo.com;
raiz /var/www/exemplo;
índice index.html index.htm index.nginx-debian.html;
localização / {
try_files $uri $uri/ =404;
}
ssl_certificate /etc/ssl/certs/example.crt;
ssl_certificate_key /etc/ssl/private/example.key;
}
Conclusão
Prevenir injeções de SQL e XSS é crucial para a segurança das APIs RESTful. Neste artigo, foram apresentadas as melhores práticas e técnicas para evitar injeções de SQL e XSS, incluindo o uso de consultas preparadas, instruções preparadas, ORMs, validação de entrada do usuário, escape de caracteres, bibliotecas de escape, Política de Segurança de Conteúdo e HTTPS. Além disso, foram introduzidas uma arquitetura de API RESTful segura e configurações de segurança recomendadas para Spring Boot, Apache e Nginx.