Mientras que las secuencias de comandos entre sitios se consideran generalmente negativas, me he encontrado con varias situaciones en las que es necesario.Mejor práctica: Secuencias de comandos cruzadas legítimas
Hace poco estuve trabajando dentro de los límites de un sistema de gestión de contenido muy limitado. Necesitaba incluir el código de la base de datos dentro de la página, pero el servidor de alojamiento no tenía disponible nada utilizable. Configuré un par de scripts básicos en mi propio servidor, pensando originalmente que podía usar AJAX para importar los contenidos de mis scripts directamente en la plantilla del CMS (conservando así imágenes dinámicas, elementos de menú, CSS, etc.). Estaba equivocado.
Debido a las limitaciones de los objetos XMLHttpRequest
, no es posible extraer contenido de un dominio diferente. Así que pensé iFrame - aunque no soy fanático de los marcos, pensé que podría crear un marco que coincidiera con el ancho y alto del contenido, para que pareciera nativo. Una vez más, me bloquearon las "protecciones" de scripts entre sitios. Si bien podría cargar un archivo remoto en el iFrame, no podría ejecutar JavaScript para modificar su tamaño en la página del host o en la página cargada.
En este caso particular, no pude apuntar un subdominio a mi servidor. Tampoco pude crear una secuencia de comandos en el servidor CMS que pudiera proxy de contenido de mi servidor, por lo que mi último pensamiento fue utilizar un JavaScript remoto.
Un JavaScript remoto funciona. Se rompe cuando el usuario tiene JavaScript desactivado, lo cual es un inconveniente; pero funciona. El "problema" que tenía con el uso de JavaScript remoto era que tenía que usar la función JS document.write()
para generar cualquier contenido. Cualquier salida que no sea JS causa errores de script. Además de usar document.write()
para cada línea, también debe asegurarse de que se escape el contenido, o de lo contrario terminará con más errores de secuencia de comandos.
Mi solución fue la siguiente:
Mi script recibió un parámetro GET ("página") y luego buscó el archivo ({$page}.php
), y leer el contenido en una variable. Sin embargo, tuve que usar técnicas de búfer incómodas para ejecutar realmente los scripts incluidos (para cosas como la interacción con la base de datos) y luego quitar el contenido final de todos los caracteres de salto de línea (\n
) y luego escapé todos los caracteres requeridos. El resultado final es que mi script original (que emite JavaScript) accede a scripts aparentemente "estándar" en mi servidor y convierte su salida estándar a JavaScript para mostrar dentro de la plantilla de CMS.
Si bien esta solución funciona, parece que puede haber una forma mejor de lograr lo mismo. ¿Cuál es la mejor manera de hacer que las secuencias de comandos entre sitios específicamente trabajen con el propósito de incluir contenido de un dominio completamente diferente?
Ruego que se aclare # 2? Para el tipo de datos 'html', como en load(), jQuery usa XMLHttpRequest, que no funciona en sitios cruzados. Además, load() quita las etiquetas de script. –
Lo siento, lo que quise decir con # 2 es usar JSONP http://docs.jquery.com/Release:jQuery_1.2/Ajax#Cross-Domain_getJSON_.28using_JSONP.29 –