Skip to content

MASTG-TEST-0037: Testando a Limpeza de WebViews

Visão Geral

Para testar a limpeza de WebViews)), você deve inspecionar todas as APIs relacionadas à exclusão de dados do WebView e tentar rastrear completamente o processo de exclusão de dados.

Análise Estática

Comece identificando o uso das seguintes APIs de WebView e valide cuidadosamente as melhores práticas mencionadas.

  • Inicialização: um aplicativo pode estar inicializando o WebView de forma a evitar o armazenamento de determinadas informações usando setDomStorageEnabled, setAppCacheEnabled ou setDatabaseEnabled de android.webkit.WebSettings. O DOM Storage (para usar o armazenamento local HTML5), os Application Caches e as APIs de Database Storage são desabilitados por padrão, mas os aplicativos podem definir essas configurações explicitamente como "true".

  • Cache: a classe WebView do Android oferece o método clearCache, que pode ser usado para limpar o cache de todos os WebViews utilizados pelo aplicativo. Ele recebe um parâmetro booleano de entrada (includeDiskFiles) que apagará todos os recursos armazenados, incluindo o cache da RAM. No entanto, se for definido como false, limpará apenas o cache da RAM. Verifique no aplicativo o uso do método clearCache e confirme seu parâmetro de entrada. Além disso, você também pode verificar se o aplicativo está substituindo onRenderProcessUnresponsive para o caso em que o WebView pode ficar sem resposta, pois o método clearCache também pode ser chamado a partir desse ponto.

  • APIs de WebStorage: WebStorage.deleteAllData também pode ser usado para limpar todo o armazenamento atualmente utilizado pelas APIs de armazenamento JavaScript, incluindo o Web SQL Database e as APIs de HTML5 Web Storage.

    Alguns aplicativos precisarão habilitar o DOM storage para exibir alguns sites HTML5 que usam armazenamento local. Isso deve ser investigado cuidadosamente, pois pode conter dados sensíveis.

  • Cookies: quaisquer cookies existentes podem ser excluídos usando CookieManager.removeAllCookies.

  • APIs de arquivo: a exclusão adequada de dados em determinados diretórios pode não ser tão direta; alguns aplicativos usam uma solução pragmática, que é excluir manualmente diretórios selecionados conhecidos por conter dados do usuário. Isso pode ser feito usando a API java.io.File, como java.io.File.deleteRecursively.

Exemplo:

Este exemplo em Kotlin do aplicativo open source Firefox Focus mostra diferentes etapas de limpeza:

override fun cleanup() {
    clearFormData() // Remove o popup de preenchimento automático do campo de formulário atualmente focado, se presente. Observe que isso afeta apenas a exibição do popup de preenchimento automático, não remove nenhum dado de formulário salvo do armazenamento deste WebView. Para fazer isso, use WebViewDatabase#clearFormData.
    clearHistory()
    clearMatches()
    clearSslPreferences()
    clearCache(true)

    CookieManager.getInstance().removeAllCookies(null)

    WebStorage.getInstance().deleteAllData() // Limpa todo o armazenamento atualmente utilizado pelas APIs de armazenamento JavaScript. Isso inclui o Application Cache, o Web SQL Database e as APIs de HTML5 Web Storage.

    val webViewDatabase = WebViewDatabase.getInstance(context)
    // Não está totalmente claro como isso difere de WebView.clearFormData()
    @Suppress("DEPRECATION")
    webViewDatabase.clearFormData() // Limpa quaisquer dados salvos para formulários web.
    webViewDatabase.clearHttpAuthUsernamePassword()

    deleteContentFromKnownLocations(context) // chama FileUtils.deleteWebViewDirectory(context), que exclui todo o conteúdo em "app_webview".
}

A função termina com algumas exclusões manuais extras de arquivos em deleteContentFromKnownLocations, que chama funções de FileUtils. Essas funções usam o método java.io.File.deleteRecursively para excluir recursivamente arquivos dos diretórios especificados.

private fun deleteContent(directory: File, doNotEraseWhitelist: Set<String> = emptySet()): Boolean {
    val filesToDelete = directory.listFiles()?.filter { !doNotEraseWhitelist.contains(it.name) } ?: return false
    return filesToDelete.all { it.deleteRecursively() }
}

Análise Dinâmica

Abra um WebView acessando dados sensíveis e, em seguida, faça logout do aplicativo. Acesse o contêiner de armazenamento do aplicativo e certifique-se de que todos os arquivos relacionados ao WebView sejam excluídos. Os seguintes arquivos e pastas estão normalmente relacionados a WebViews:

  • app_webview
  • Cookies
  • pref_store
  • blob_storage
  • Session Storage
  • Web Data
  • Service Worker