01 Out, 2012 12:41

Como impedir que o conteúdo vendido via In App Purchase do seu aplicativo seja roubado

O método descoberto é extremamente simples, não requer jailbreak, apenas dois passos: instalação de um certificado e a definição de um DNS diferente no settings do iPhone. Com isso os usuários podem comprar a vontade conteúdo sem medo de serem debitados em seus cartões. Os desenvolvedores, por sua vez, ficam sem a receita de seus aplicativos.

É válido dizer que a Apple fechou essa brecha no iOS 6, mas ainda existem milhões de usuários com o iOS 5 ou em versões anteriores, por isso a Apple enviou um email recentemente orientando todos os desenvolvedores a como contornar esse problema. É isso que vamos explicar nesse post.

In App Purchase

Uma questão importante é que aplicativos que possuem um servidor intermediário que se conecta com a Apple para compras não são afetados, apenas os que se conectam diretamente com os servidores da Apple para realizar as compras. Nesse caso, ela recomenda que os desenvolvedores baixem essa classe.

Depois de importar a classe VerificationController para seu projeto é preciso "linkar" o Security framework. Outra coisa que devemos observar é que o código da Apple está usando ARC (contagem automática de referência), e se o seu projeto não usar ARC você terá que transformar o código da classe VerificationController para não usar ou mudar seu projeto para aceitá-lo.

A Apple também não provê um código para gerar Base64, ele pode ser obtido nesse link.

Agora com a classe da Apple implementada, é preciso obter a constante ITC_CONTENT_PROVIDER_SHARED_SECRET no iTunes Connect. Para isso, acesse o iTunes Connect > Manage Your Apps > (seu app) > Manage In-App Purchases > clique no link "View or generate a shared secret". Pegue essa chave e coloque no .h do VerificationController.

Pronto, agora o próximo passo é chamar a linha abaixo nas suas classes de In App Purchase para verificar se suas compras foram mesmo reais ou tentativas de roubo:

[[VerificationController sharedInstance] verifyPurchase:transaction];

Se o retorno for falso, você pode até mostrar uma telinha criativa para ver se as pessoas se conscientizam e compram seu conteúdo :D. Contudo, a linha acima ainda não é 100% suficiente. Ela verifica apenas se a compra possui dados corretos, mas ainda assim os hackers têm como enviar dados que parecem corretos para o aplicativo. Sendo assim, a Apple recomenda que você só considere o item como realmente comprado depois de implementar o método connection:didReceiveData: no VerificationController e passar em todas as verificações já implementadas pela Apple nele. Essa segunda etapa envia para os servidores da Apple o identificador que você gerou no iTunes Connect e bate com o retornado pela compra. Se a chave bater, a compra foi um sucesso. Nenhum hacker tem como saber a chave dos desenvolvedores com a brecha, por isso as compras retornadas por eles sempre vêm com a chave errada.

OBSERVAÇÃO: para testar no servidor de sandbox é preciso usar a url de conexão ITMS_SANDBOX_VERIFY_RECEIPT_URL senão dará erro. Mas cuidado, lembre-se sempre de usar a URL ITMS_PROD_VERIFY_RECEIPT_URL quando enviar para a App Store.

Ao navegar neste site, você consente o uso de cookies nossos e de terceiros, que coletam informações anônimas e são essenciais para melhorar sua experiência em nosso site.