De forma predeterminada, el motor de ejecución busca un archivo de política de socket disponible en el puerto 843. Tal y como sucede con los archivos de política URL, este archivo se denomina
archivo maestro de política
.
Cuando se introdujeron por primera vez los archivos de política en Flash Player 6, no se admitían los archivos de política de socket. Las conexiones a servidores de socket se autorizaban a través de un archivo de política desde la ubicación predeterminada en un servidor HTTP del puerto 80 del mismo host que el servidor de socket. Flash Player 9 todavía admite esta capacidad, pero Flash Player 10 no. En Flash Player 10, solo los archivos de política de socket pueden autorizar las conexiones de socket.
Al igual que los archivos de política URL, los archivos de política de socket admiten una sentencia de metapolítica que especifica los puertos que pueden servir los archivos de política. Sin embargo, en lugar de “master-only”, la metapolítica predeterminada de los archivos de política de socket es “all”. Es decir, a no ser que el archivo maestro de política especifique una configuración más restrictiva, Flash Player asumirá que cualquier socket del host puede servir un archivo de política de socket.
De forma predeterminada, el acceso a conexiones de socket y socket XML está desactivado, incluso si el socket al que se conecta se encuentra en el dominio al que pertenece el archivo SWF. El acceso a nivel de socket es posible si se sirve un archivo de política de socket desde cualquiera de las ubicaciones siguientes:
-
Puerto 843 (la ubicación del archivo maestro de política)
-
El mismo puerto que la conexión de socket principal
-
un puerto diferente a la conexión de socket principal
De forma predeterminada, Flash Player busca un archivo de política de socket en el puerto 843 y en el mismo puerto que utiliza la conexión de socket principal. Para servir un archivo de política de socket desde un puerto diferente, el archivo SWF debe llamar a
Security.loadPolicyFile()
.
Los archivos de política de socket presentan la misma sintaxis que los archivos de política URL, salvo por el hecho de que también deben especificar los puertos a los que concede acceso. Cuando un archivo de política de socket procede de un número de puerto inferior a 1024, dicho archivo puede conceder acceso a cualquier puerto; cuando un archivo de política procede del puerto 1024 o superior, solo puede conceder acceso a otros puertos 1024 y superiores. Los puertos permitidos se especifican en el atributo
to-ports
de la etiqueta
<allow-access-from>
. Se aceptan como valor los números de puerto únicos, los intervalos de puertos y los comodines.
A continuación se muestra un ejemplo de un archivo de política de socket:
<?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 un archivo de política de socket del puerto 843 o del mismo puerto que utiliza la conexión de socket principal, llame al método
Socket.connect()
o
XMLSocket.connect()
. Flash Player comprueba en primer lugar la presencia del archivo maestro de política en el puerto 843. Si encuentra alguno, comprobará si este contiene una sentencia de metapolítica que prohíba los archivos de política de socket en el puerto de destino. Si el acceso no está prohibido, Flash Player buscará en primer lugar la sentencia
allow-access-from
en el archivo maestro de política. Si no encuentra ninguno, entonces buscará un archivo de política de socket en el mismo puerto que utiliza la conexión de socket principal.
Para recuperar un archivo de política de socket de una ubicación diferente, primero llame al método
Security.loadPolicyFile()
con la sintaxis especial
"xmlsocket"
, como en el ejemplo siguiente:
Security.loadPolicyFile("xmlsocket://server.com:2525");
Llame al método
Security.loadPolicyFile()
antes de llamar al método
Socket.connect()
o
XMLSocket.connect()
. Flash Player espera entonces hasta completar la solicitud del archivo de política antes de decidir si permite o no la conexión principal. Sin embargo, si el archivo maestro de política especifica que la ubicación de destino no puede servir archivos de política, la llamada a
loadPolicyFile()
no será efectiva, incluso si hay un archivo de política en dicha ubicación.
Si se implementa un servidor de socket y se necesita proporcionar un archivo de política de socket, se debe decidir entre proporcionar el archivo de política a través del mismo puerto que acepta conexiones principales o utilizar otro puerto. En cualquier caso, para poder enviar una respuesta, el servidor deberá esperar a la primera transmisión de su cliente.
Cuando Flash Player solicita un archivo de política, siempre transmite la siguiente cadena en cuanto se establece una conexión:
<policy-file-request/>
Cuando el servidor recibe esta cadena, puede transmitir el archivo de política. La petición de Flash Player siempre termina con un byte null, y la respuesta del servidor debe terminar con otro byte del mismo tipo.
No cabe esperar que se pueda reutilizar la misma conexión para una solicitud de archivo de política y una conexión principal; cierre la conexión después de transmitir el archivo de política. De lo contrario, Flash Player cierra la conexión del archivo de política antes de volver a conectar para configurar la conexión principal.