Por padrão, o tempo de execução procura um arquivo de política de soquete servido na porta 843. Assim como os arquivos de política de URL, esse arquivo é chamado de
arquivo de política mestre
.
Quando arquivos de política foram introduzidos no Flash Player 6 pela primeira vez, não havia suporte para arquivos de política de soquete. Conexões a servidores de soquete eram autorizadas por um arquivo de política no local padrão em um servidor HTTP na porta 80 do mesmo host que o servidor de soquete. O Flash Player 9 ainda oferece suporte a essa capacidade, mas o Flash Player 10 não oferece. No Flash Player 10, apenas arquivos de política de soquete podem autorizar conexões de soquete.
Como os arquivos de política de URL, os arquivos de política de soquete oferecem suporte a uma instrução de metapolítica que especifica quais portas podem servir arquivos de política. No entanto, em vez de “master-only”, a metapolítica padrão para arquivos de política de soquete é “all”. Isto é, a menos que o arquivo de política mestre especifique uma configuração mais restritiva, o Flash Player assumirá que qualquer soquete no host pode servir um arquivo de política de soquete.
O acesso a conexões de soquete XML e a soquete está desativado por padrão, mesmo que o soquete que você está conectando esteja no mesmo domínio que o arquivo SWF. É possível permitir acesso em nível de soquete servindo um arquivo de política de segurança de qualquer um dos seguintes locais:
-
Porta 843 (o local do arquivo de política mestre)
-
A mesma porta que a conexão de soquete principal
-
Uma porta diferente da conexão de soquete principal
Por padrão, o Flash Player procura um arquivo de política de soquete na porta 843 e na mesma porta que a conexão de soquete principal. Se desejar servir um arquivo de política de soquete em uma porta diferente, o arquivo SWF deverá chamar
Security.loadPolicyFile()
.
Um arquivo de política de soquete tem a mesma sintaxe que um arquivo de política de URL, exceto que ele também deve especificar as portas às quais ele concede acesso. Quando um arquivo de política de soquete é servido em uma porta com número inferior a 1024, ele pode conceder acesso a qualquer porta. Quando um arquivo de política é proveniente da porta 1024 ou superior ele só pode conceder acesso a portas 1024 e superiores. As portas permitidas são especificadas em um atributo
to-ports
na tag
<allow-access-from>
. Os valores de números de portas únicos, intervalos de portas e curingas são aceitos.
Este é um exemplo de arquivo de política de soquete:
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<!-- Policy file for xmlsocket://socks.mysite.com -->
<cross-domain-policy>
<allow-access-from domain="*" to-ports="507" />
<allow-access-from domain="*.example.com" to-ports="507,516" />
<allow-access-from domain="*.example.org" to-ports="516-523" />
<allow-access-from domain="adobe.com" to-ports="507,516-523" />
<allow-access-from domain="192.0.34.166" to-ports="*" />
</cross-domain-policy>
Para recuperar um arquivo de política de soquete da porta 843 ou da mesma porta como uma conexão de soquete principal, chame o método
Socket.connect()
ou
XMLSocket.connect()
. O Flash Player primeiro verifica se há um arquivo de política mestre na porta 843. Se um arquivo de política mestre for localizado, ele verificará se o arquivo contém uma instrução de metapolítica que proíbe arquivos de política de soquete na porta de destino. Se o acesso não for proibido, o Flash Player primeiro procurará a instrução
allow-access-from
apropriada no arquivo de política mestre. Se uma instrução não for localizada, ele procurará um arquivo de política de soquete na mesma porta que a conexão de soquete principal.
Para recuperar um arquivo de política de soquete de um local diferente, primeiro chame o método
Security.loadPolicyFile()
com a sintaxe especial
"xmlsocket"
, como no seguinte:
Security.loadPolicyFile("xmlsocket://server.com:2525");
Chame o método
Security.loadPolicyFile()
antes de chamar o método
Socket.connect()
ou
XMLSocket.connect()
. O Flash Player então aguarda até que tenha atendido sua solicitação de arquivo de política antes de decidir se permite sua conexão principal. No entanto, se o arquivo de política mestre especificar que o local de destino não pode servir arquivos de política, a chamada para
loadPolicyFile()
não terá nenhum efeito, mesmo que haja um arquivo de política naquele local.
Se estiver implementando um servidor de soquetes e precisar fornecer um arquivo de política de soquete, decida se o arquivo de política deve ser fornecido usando a mesma porta que aceita conexões principais ou usando uma porta diferente. Em qualquer dos casos, o servidor deve aguardar a primeira transmissão de seu cliente antes de enviar uma resposta.
Quando o Flash Player solicita um arquivo de política, ele sempre transmite a string a seguir assim que a conexão é estabelecida:
<policy-file-request/>
Quando o servidor recebe essa string, ele pode transmitir o arquivo de política. A solicitação do Flash Player sempre é terminada por um byte nulo e a resposta do servidor também deve ser terminada por um byte nulo.
Não espere reutilizar a mesma conexão para uma solicitação de arquivo de política e para uma conexão principal. Feche a conexão depois de transmitir o arquivo de política. Se isso não for feito, o Flash Player fechará a conexão do arquivo de política antes de reconectar-se para configurar a conexão principal.