La diferencia entre Server.Execute y Execute en ASP para implementar scripts de inclusión dinámica, los amigos que lo necesiten pueden consultarla. Recientemente planeé intentar implementar la arquitectura MVC en ASP. Alguien debe haberme preguntado: ASP ha sido eliminado, ¿por qué sigo estudiándolo? También sé esto. Desde que Microsoft abandonó ASP 3.0 y cambió a ASP.NET, ASP se ha quedado muy por detrás de PHP y JSP, que comenzaron casi al mismo tiempo. Los beneficios del código abierto sobre el código cerrado son los mismos que PHP y ASP. Se dice que ASP está eliminado. Nadie puede salvarlo de la eliminación, pero vale la pena señalar que ASP todavía está bastante extendido en el mercado chino, especialmente para algunas aplicaciones de algunas pequeñas y medianas empresas. es un problema y es fácil de implementar. En algunos sistemas Windows antiguos, no es necesario instalar .NET. Básicamente, el marco se puede ejecutar directamente, por lo que aún es necesario preparar un marco. Sin embargo, mi marco es un marco experimental, solo para verificar si ASP puede implementar una arquitectura MVC similar a PHP.
Bien, habiendo dicho tanto, vayamos directo al grano. La razón de este problema es que necesito incluir archivos ASP dinámicamente. Como todos sabemos, solo hay un método de inclusión en ASP, que es SSI (Server Side Include), que básicamente se divide en los dos tipos siguientes:
Copie el código de código de la siguiente manera:
<!-- #include archivo=muestra.asp -->
<!-- #include virtual=muestra.asp -->
Básicamente, el primero se usa más comúnmente de estos dos. #include virtual contiene la ruta virtual, que generalmente se usa en directorios virtuales. Pero ambos son estáticos. Si queremos incluirlo dinámicamente, no se puede escribir como:
Copie el código de código de la siguiente manera:
<!-- #include file=<%=MiVar%> -->
<!-- #include virtual=<%=MiVar%> -->
La escritura anterior es incorrecta. Se puede entender que la directiva #include se ejecuta antes de que ASP inicie el motor de script y ejecute el script entre las etiquetas ASP <% %>. En otras palabras, #include no es trabajo de ASP. el programa del servidor, como la traducción de IIS, no prestará atención a su código ASP.
¿Cómo implementar métodos de script de inclusión dinámica similares a include, include_once, require y require_once de PHP? Veamos un método del objeto del servidor ASP: Server.Execute. Al buscar todas las funciones de ASP, podemos encontrar que esta función es más similar a la inclusión dinámica. Podemos hacer un experimento:
Muestra.inc.asp
Copie el código de código de la siguiente manera:
<%
Respuesta.Escribe ¡Hola mundo!
%>
prueba.asp
Copie el código de código de la siguiente manera:
<%
Servidor.Ejecutar muestra.inc.asp
Respuesta.Escribe ¡Soy prueba.asp!
%>
El resultado real debería ser ¡Hola mundo! Soy test.asp!, lo que indica que Server.Execute puede funcionar bien con la inclusión dinámica, pero ¿qué sucede si quiero incluir una clase o función? A continuación haz el siguiente experimento:
Muestra.clase.asp
Copie el código de código de la siguiente manera:
<%
Muestra de clase
Fin de clase
%>
prueba.asp
Copie el código de código de la siguiente manera:
<%
Servidor.Ejecutar muestra.clase.asp
Respuesta.Escribir nombre de tipo (Eval (nueva muestra))
%>
Ejecútelo directamente y aparecerá el error Error de tiempo de ejecución de Microsoft VBScript La clase '800a01fa' no está definida: 'Muestra', el resultado es muy decepcionante, ¿por qué sucede esto? Revisé MSDN y encontré esta descripción: Si se incluye un archivo en la página de llamada usando #include, el .asp ejecutado no lo usará. Por ejemplo, es posible que tenga una subrutina en un archivo que esté incluido en su página de llamada. pero el .asp ejecutado no reconoce el nombre de la subrutina. Parece ser algo diferente del problema que encontré. ¿Está aislado el código Server.Execute? Luego realice el siguiente experimento:
Muestra.inc.asp
Copie el código de código de la siguiente manera:
<%
Atenuar MiVar
MyVar = ¡Soy muestra!
%>
prueba.asp
Copie el código de código de la siguiente manera:
<%
Atenuar MiVar
MyVar = ¡Soy una prueba!
Servidor.Ejecutar muestra.inc.asp
Respuesta.Escribir MyVar
%>
El resultado es ¡Soy una prueba!, ¡lo cual es muy decepcionante! Parece que Server.Execute aísla variables, funciones, clases y otros códigos, lo que significa que el extremo que llama y el extremo llamado no interfieren entre sí a nivel de código. Parece que Server.Execute solo se puede usar para incluir. plantillas asp.
La siguiente es la función Ejecutar del script VBScript. Lo que se pasa a Ejecutar debe ser un código de script VBScript válido, y Ejecutar es sensible al contexto. Esto parece estar muy cerca de la inclusión dinámica que necesitamos.
prueba.asp
Copie el código de código de la siguiente manera:
<%
Ejecutar muestra de clase: finalizar clase
Respuesta.Escribir nombre de tipo (Eval (nueva muestra))
%>
El código anterior genera con éxito el nombre de tipo Muestra que necesitamos. Demuestra que Execute puede ser sensible al contexto, pero el problema es que usar Execute para incluir archivos ASP no es tan conveniente como Server. Execute viene con scripts VBScript. En primer lugar, solo se puede usar para ejecutar texto de código. , por lo que el contenido del archivo debe leerse una vez. En segundo lugar, no puede. Algunas etiquetas utilizadas para identificar ASP, como <% %>, existe un método de llamada similar a <%=MyVar %>, por lo que debe filtrar <. % %>, y luego convierta <%=MyVar %> a Response.Write MiVar. Como lo que necesito es incluir archivos de clase, <%=MyVar %> no aparecerá, solo necesito reemplazar <% %>. Para leer el contenido del archivo y simplemente excluir <% %>, puede consultar la siguiente función:
Copie el código de código de la siguiente manera:
Función file_get_contents(nombre de archivo)
tenue fso, f
Establecer fso = Server.CreateObject(Scripting.FilesystemObject)
Establecer f = fso.OpenTextFile(Server.MapPath(nombre de archivo), 1)
file_get_contents = f.ReadAll
f.Cerrar
Establecer f = Nada
Establecer fso = Nada
Función final
Función class_get_contents(nombre de archivo)
Contenidos oscuros
contenido = file_get_contents(nombre de archivo)
contenido = Reemplazar (contenido, < & %, )
contenido = Reemplazar (contenido, % & >, )
class_get_contents = contenido
Función final
Con la función anterior podemos probar directamente el siguiente código:
Muestra.clase.asp
Copie el código de código de la siguiente manera:
<%
Muestra de clase
Fin de clase
%>
prueba.asp
Copie el código de código de la siguiente manera:
<%
Ejecute class_get_contents(Muestra.clase.asp)
Respuesta.Escribir nombre de tipo (Eval (nueva muestra))
%>
El resultado es el nombre del tipo de muestra que esperábamos. Parece que Execute sigue siendo muy poderoso. De hecho, es muy poderoso, porque las personas con malas intenciones a menudo lo usan para crear ponis. El troyano ASP de una sola frase más simple probablemente esté escrito como. siguiente frase.
Copie el código de la siguiente manera: <%Execute Request(c)%>
Por ejemplo, este script se encuentra en file.asp y luego pasa el texto file.asp?c=Trojan, jaja, ya sabes lo siguiente. Bien, esto es una digresión. Otra cosa a tener en cuenta sobre Ejecutar es que está relacionado con el contexto, así que preste atención al problema del alcance. Si Ejecutar está ubicado dentro de un subproceso o función de función, es inaccesible desde el exterior.