- Dados locais: Todos os dados permanecem no dispositivo do usuário
- Sem comunicação externa: A aplicação não faz requisições HTTP
- Integridade: XMLs originais protegidos por hash SHA-256
- Permissões mínimas: Apenas os plugins Tauri necessários são habilitados
- Sanitização: Todo conteúdo dinâmico é sanitizado antes de renderização
| Ameaça | Mitigação |
|---|---|
| XML malicioso (XXE, billion laughs) | DOMParser do browser é seguro contra XXE por padrão; validar tamanho máximo de arquivo |
| XSS via conteúdo do XML | Sanitizar dados do XML antes de inserir no DOM; usar textContent em vez de innerHTML |
| SQL Injection | Usar parâmetros em todas as queries SQLite (nunca concatenar strings) |
| Corrupção do banco | Transações atômicas; WAL mode; backup |
| Arquivo modificado pós-importação | Verificação de hash SHA-256 sob demanda |
| Acesso não autorizado ao banco | Arquivo SQLite protegido pelo SO (permissões do usuário) |
// ✅ CORRETO — usa textContent
element.textContent = xmlData.razaoSocial;
// ❌ ERRADO — vulnerável a XSS
element.innerHTML = xmlData.razaoSocial;// ✅ CORRETO — parâmetros
await db.execute(
'INSERT INTO companies (id, cnpj, razao_social) VALUES ($1, $2, $3)',
[id, cnpj, razaoSocial]
);
// ❌ ERRADO — concatenação
await db.execute(
`INSERT INTO companies (id, cnpj, razao_social) VALUES ('${id}', '${cnpj}', '${razaoSocial}')`
);- Validar tamanho máximo de arquivo antes de ler (ex: 50MB para XML, 500MB para SPED)
- Verificar extensão/conteúdo antes de processar
- Não executar conteúdo de arquivos importados
- Não seguir referências externas (DTD, XInclude, etc.)
{
"permissions": [
"core:default",
"sql:default",
"dialog:allow-open",
"dialog:allow-message",
"dialog:allow-ask",
"dialog:allow-confirm",
"fs:allow-read-text-file",
"fs:allow-read-file",
"clipboard-manager:allow-write-text",
"shell:allow-open"
]
}Permissões NÃO incluídas (propositalmente):
fs:allow-write-file— a aplicação não escreve arquivos no filesystem (dados vão para SQLite)http:*— nenhuma comunicação de redenotification:*— desnecessário
Na versão 1.0, o FiscalFlow NÃO manipula certificados digitais (A1/A3).
Ele é um leitor/organizador de documentos fiscais, não um emissor.
Caso no futuro seja necessário suporte a certificados:
- Criar ADR específico
- Seguir SECURITY.md atualizado
- Nunca armazenar senhas em texto puro
- Nunca expor chaves privadas em logs