Perbedaan Server.Execute dan Execute di ASP untuk mengimplementasikan skrip include dinamis, teman-teman yang membutuhkan bisa merujuknya. Baru-baru ini saya berencana mencoba mengimplementasikan arsitektur MVC di ASP. Pasti ada yang bertanya kepada saya: ASP sudah dihilangkan, kenapa saya masih mempelajarinya? Saya juga mengetahui hal ini. Sejak Microsoft meninggalkan ASP 3.0 dan beralih ke ASP.NET, ASP tertinggal jauh di belakang PHP dan JSP, yang dimulai hampir pada waktu yang sama. Keuntungan dari open source dibandingkan close source sama dengan PHP dan ASP . ASP dikatakan telah dihilangkan. Tidak ada yang bisa menyelamatkannya dari penghapusan, namun perlu dicatat bahwa ASP masih cukup luas di pasar Cina, terutama untuk beberapa aplikasi dari beberapa perusahaan kecil dan menengah masalah, dan mudah untuk diterapkan. Pada beberapa sistem Windows lama, Tidak perlu menginstal .NET Framework pada dasarnya dapat dijalankan secara langsung, sehingga masih perlu menyiapkan framework. Namun framework saya merupakan framework eksperimental, hanya untuk memverifikasi apakah ASP dapat mengimplementasikan arsitektur MVC yang mirip dengan PHP.
Oke, setelah banyak bicara, mari langsung ke intinya. Alasan terjadinya masalah ini adalah saya perlu menyertakan file ASP secara dinamis. Seperti yang kita ketahui bersama, hanya ada satu metode penyertaan di ASP, yaitu SSI (Server Side Include), yang pada dasarnya terbagi menjadi dua jenis berikut:
Copy kode kodenya sebagai berikut:
<!-- #include file=sample.asp -->
<!-- #include virtual=sample.asp -->
Pada dasarnya, yang pertama lebih umum digunakan dari keduanya. #include virtual berisi jalur virtual, yang umumnya digunakan dalam direktori virtual. Namun keduanya bersifat statis. Jika kita ingin memasukkannya secara dinamis, tidak dapat dituliskan sebagai:
Copy kode kodenya sebagai berikut:
<!-- #sertakan file=<%=MyVar%> -->
<!-- #include virtual=<%=MyVar%> -->
Penulisan di atas salah. Dapat dipahami bahwa direktif #include dijalankan sebelum ASP memulai mesin skrip dan mengeksekusi skrip di antara tag ASP<% %> program server. Seperti pekerjaan terjemahan IIS, sehingga tidak akan memperhatikan kode ASP Anda.
Bagaimana cara menerapkan metode skrip inklusi dinamis yang mirip dengan include, include_once, require, dan require_once PHP? Mari kita lihat metode objek ASP Server: Server.Execute. Mencari semua fitur ASP, kita dapat menemukan bahwa fungsi ini paling mirip dengan penyertaan dinamis.
Contoh.inc.asp
Copy kode kodenya sebagai berikut:
<%
Tanggapan.Tulis Halo Dunia!
%>
tes.asp
Copy kode kodenya sebagai berikut:
<%
Server.Jalankan Sample.inc.asp
Respon.Tulis Saya test.asp!
%>
Output sebenarnya seharusnya Hello World!Saya test.asp!, yang menunjukkan bahwa Server.Execute dapat bekerja dengan baik dengan penyertaan dinamis, tetapi bagaimana jika saya ingin menyertakan kelas atau fungsi? Selanjutnya lakukan percobaan berikut:
Contoh.kelas.asp
Copy kode kodenya sebagai berikut:
<%
Contoh Kelas
Kelas Akhir
%>
tes.asp
Copy kode kodenya sebagai berikut:
<%
Server.Jalankan Sampel.class.asp
Response.Tulis TypeName(Eval(Contoh Baru))
%>
Jalankan langsung, dan error Microsoft VBScript runtime error '800a01fa' class is not didefinisikan: 'Sample', hasilnya sangat mengecewakan, kenapa bisa terjadi? Saya memeriksa MSDN dan menemukan deskripsi ini: Jika file disertakan dalam halaman panggilan dengan menggunakan #include, .asp yang dijalankan tidak akan menggunakannya. Misalnya, Anda mungkin memiliki subrutin dalam file yang disertakan dalam halaman panggilan Anda. tetapi .asp yang dieksekusi tidak akan mengenali nama subrutin. Tampaknya agak berbeda dari masalah yang saya temui. Apakah kode Server.Execute diisolasi? Kemudian lakukan percobaan berikut:
Contoh.inc.asp
Copy kode kodenya sebagai berikut:
<%
Redupkan MyVar
MyVar = Saya Sampel!
%>
tes.asp
Copy kode kodenya sebagai berikut:
<%
Redupkan MyVar
MyVar = Saya sedang ujian!
Server.Jalankan Sample.inc.asp
Respon.Tulis MyVar
%>
Outputnya saya tes!, yang sangat mengecewakan! Tampaknya Server.Execute mengisolasi variabel, fungsi, kelas, dan kode lainnya, yang berarti bahwa ujung panggilan dan ujung yang dipanggil tidak saling mengganggu pada tingkat kode. Tampaknya Server.Execute hanya dapat digunakan untuk menyertakan . templat asp.
Berikut ini adalah fitur skrip VBScript Execute. Yang diteruskan ke Execute harus berupa kode skrip VBScript yang valid, dan Execute peka terhadap konteks.
tes.asp
Copy kode kodenya sebagai berikut:
<%
Jalankan Contoh Kelas: Kelas Akhir
Response.Tulis TypeName(Eval(Contoh Baru))
%>
Kode di atas berhasil menampilkan nama tipe Sample yang kita perlukan. Ini membuktikan bahwa Execute memang sensitif terhadap konteks, tetapi masalahnya adalah menggunakan Execute untuk memasukkan file asp tidak senyaman Server.Execute dilengkapi dengan skrip VBScript , jadi konten file perlu dibaca satu kali. Kedua, tidak dapat Beberapa tag yang digunakan untuk mengidentifikasi ASP, seperti <% %>, ada metode pemanggilan yang mirip dengan <%=MyVar %>, jadi Anda perlu memfilter < % %>, lalu konversikan <%=MyVar %> menjadi Response.Write Var Saya. Karena yang saya perlukan adalah memasukkan file kelas, <%=MyVar %> tidak akan muncul. Saya hanya perlu mengganti <% %> saja. Untuk membaca konten file dan mengecualikan <% %>, Anda dapat merujuk ke fungsi berikut:
Copy kode kodenya sebagai berikut:
Fungsi file_get_contents(nama file)
Redupkan fso, f
Setel fso = Server.CreateObject(Scripting.FilesystemObject)
Setel f = fso.OpenTextFile(Server.MapPath(nama file), 1)
file_get_contents = f.BacaSemua
f.Tutup
Tetapkan f = Tidak ada
Tetapkan fso = Tidak ada
Fungsi Akhir
Fungsi class_get_contents (nama file)
Redupkan isinya
isi = file_get_contents(nama file)
isi = Ganti(isi, < & %, )
isi = Ganti(isi, % & >, )
class_get_contents = isi
Fungsi Akhir
Dengan fungsi di atas kita bisa langsung menguji kode berikut:
Contoh.kelas.asp
Copy kode kodenya sebagai berikut:
<%
Contoh Kelas
Kelas Akhir
%>
tes.asp
Copy kode kodenya sebagai berikut:
<%
Jalankan class_get_contents(Sample.class.asp)
Response.Tulis TypeName(Eval(Contoh Baru))
%>
Output hasilnya adalah nama tipe Contoh yang kami harapkan. Tampaknya Execute masih sangat kuat. Ini memang sangat kuat, karena orang dengan niat buruk sering menggunakannya untuk membuat kuda poni. Trojan satu kalimat ASP yang paling sederhana mungkin ditulis sebagai kalimat berikut.
Salin kode sebagai berikut: <%Execute Request(c)%>
Misal script ini terletak di file.asp, lalu diteruskan di file.asp?c=Trojan text, haha, kalian sudah tahu hal berikut ini. Oke, ini adalah penyimpangan. Hal lain yang perlu diperhatikan tentang Execute adalah bahwa ini terkait dengan konteks, jadi perhatikan masalah cakupannya. Jika Execute terletak di dalam Sub proses atau fungsi Fungsi, maka itu tidak dapat diakses dari luar.