Segurança com Flash Remoting

Estive me aventurando a brincar com o Flash, mais especificamente com o Flash Remoting e claro, CFCs.

Sem grandes problemas, não foi nada complicado (mentira). Os componentes do Flash (que pelo que sei não são dos melhores. São grandes e pesados.) ajudam um bocado para quem não entende muito de Flash. Jogar os dados de uma query num datagrid é fácil como datagrid.dataProvider = recordSet.

Mas o que me intrigou e onde eu gastei um bom tempo foi pensando na segurança dos CFCs que o Flash, através do Remoting, irá contactar. Ora bolas, o que pode haver de tão complicado na segurança desses CFCs?


Para os métodos do componente se tornarem disponíveis para o Flash Remoting acessar, eles devem estar com o access=”remote”, isto é, transforma-lo num webservice, de modo que, assim como ele poderá ser acessado pelo Flash Remoting, também poderá ser acessado como um webservice qualquer:

http://www.servidor.com.br/cfcs/componente.cfc?wsdl&method=listarProdutos

Ok. Vamos começar do começo. Vamos proteger por login e senha (usando por exemplo conexao.setCredentials(“user”, “senha”). Bééé.. O arquivo final do Flash (.swf) é passível de sofrer engenharia reversa isto é, eu consigo ver o código fonte, onde estaria meu login e senha. E mais, eu consigo ver qual o endereço do componente e seus métodos (entre outros códigos como geração de tokens de acesso, etc, o que invalida certas idéias de proteção). Esta é a verdadeira preocupação! Qualquer um poderá descobrir onde está meu componente e utiliza-lo a vontade. Imaginem um método de deleção de dados que legal.

O que é necessário limitar é que somente um arquivo .swf que esteja rodando sob determinado domínio possa acessar aquele CFC; de forma que não possível acessar o CFC diretamente, nem por intermédio de outro .swf, a não ser que esteja nos domínios permitidos.

Pensando nisso que eu cheguei até aqui. Ponto para a Macromedia. É citado a arquivo crossdomain.xml que limita de quais domínios o Flash Player pode acessar os CFCs. Mas isso só é válido caso a pessoa acesse o CFC via Flash Remoting, permitindo ainda que outra pessoa “descompile” o swf, descubra o endereço do CFC, métodos, usuário e senha e brinque a vontade, acessando como WSDL. Uma parte do problema foi resolvido.

Umas pesquisas no Google e acabei chegando em outro lugar. Ahhhh. Muito bem!

“Sam Neff posted some code on a list this morning that will make sure that the remote call is coming from a Flash movie, and not from some other service.”

<cfcomponent>
<cffunction name="isFlashCall" returnType="boolean" access="remote" output="true">
<cfset var fs = getPageContext().SymTab_findBuiltinScope("Flash")>
<cfreturn isDefined("fs")>
</cffunction>
</cfcomponent>

(Mais informações na página de origem)

Não resolve todos os problemas, mas ajuda um bocado! Vale lembrar, assim como está escrito no endereço original, que são usados recursos não documentados do ColdFusion e que tal código pode não mais funcionar em futuras versões.

Não sei se há outras maneiras mais fáceis e inteligentes de se proteger, mas essa é a experiência de alguém que não pode ser considerada a fonte mais segura de informações sobre o Flash :), embora eu tenha consultado programadores em Flash bem experientes que concordaram com o que afirmei.

Sugestões claro, são bem vindas.