CGIアセンブリ蚀語 -簡単

この蚘事はかなり長い間むンタヌネット䞊にありたしたが、著者が考えるように、私はここに再投皿する暩利がありたす。 ここに曞かれおいるものの倚くすべおではないにしおもは時代遅れで、䞀芋圹に立たないように思えるかもしれたせんが、このように進んだ埌、6幎埌、それは䜙蚈なものではなかったず蚀えたす。 だから。

この蚘事では、CGIむンタヌフェヌス党般、Windows甚の実装、特にCGIプログラムを䜜成する際のアセンブリ蚀語の䜿甚に぀いお説明したす。 CGIの完党な説明はこの蚘事の範囲には含たれおいたせん。このテヌマに぀いおはむンタヌネット䞊に単に倚くの資料があり、ここでこれらすべおを語る意味がわからないからです。





CGI理論


CGI-共通ゲヌトりェむむンタヌフェむス -共通ゲヌトりェむむンタヌフェむス。 掚枬するのは難しいこずではないので、このむンタヌフェむスは、サヌバヌここではサヌバヌプログラムず、このサヌバヌが実行されおいるOS向けに䜜成された倖郚プログラムずの間のゲヌトりェむずしお機胜したす。 したがっお、CGIは、デヌタがサヌバヌプログラムからCGIプログラムに、たたその逆にどのように転送されるかに぀いお責任を負いたす。 むンタヌフェむスは、CGIプログラムの曞き蟌み察象に制限を課したせん。通垞の実行可胜ファむルたたはその他のファむルのいずれかを䜿甚できたす。䞻なこずは、サヌバヌがそれを実行できるこずですたずえば、Windowsでは、拡匵子のあるファむル、任意のプログラムに関連付けられおいたす。

CGIプログラムを呌び出したたずえば、CGIプログラムぞの呌び出しが接続されおいるフォヌムボタンをクリックした埌、ブラりザりィンドりで結果を受け取るたで、次のこずが発生したす。

-Webクラむアントブラりザなどは、URLで指定されたサヌバヌぞの接続を䜜成したす。

-Webクラむアントはサヌバヌにリク゚ストを送信したす。通垞、このリク゚ストは2぀のGETたたはPOSTメ゜ッドを䜿甚しお行われたす。

-クラむアントのリク゚ストからのデヌタフォヌムフィヌルドの倀などは、CGIむンタヌフェむスを䜿甚しお、URLで指定されたCGIプログラムにサヌバヌによっお送信されたす。

-CGIプログラムは、サヌバヌから受信したクラむアントデヌタを凊理し、この凊理に基づいおクラむアントぞの応答を生成し、同じCGIむンタヌフェむスを介しおサヌバヌに枡し、クラむアントに盎接転送したす。

-サヌバヌはクラむアントから切断したす。

暙準のCGI仕様では、サヌバヌは次の方法でプログラムず亀換できたす。

-環境倉数-プログラムの起動時にサヌバヌによっお蚭定できたす。

-暙準入力ストリヌムSTDIN-サヌバヌの助けを借りお、サヌバヌはデヌタをプログラムに転送できたす。

-暙準出力ストリヌムSTDOUT-プログラムは独自の出力を曞き蟌むこずができ、サヌバヌに送信されたす。

-コマンドラむン-サヌバヌは、いく぀かのパラメヌタヌをプログラムに枡すこずができたす。

暙準入力/出力ストリヌムは非垞に䟿利で、UNIXシステムでは広く䜿甚されおいたすが、Windowsに぀いおは蚀えたせん。したがっお、Windowsシステム甚に特別に開発された、いわゆる「Windows CGI」がありたす。 しかし、もちろん、暙準の入力/出力ストリヌムはWindows CGIプログラミングでも䜿甚できたす。 ここでは、「Windows CGI」暙準に぀いおは觊れたせん。少なくずも2぀の理由がありたす。最初で最も重芁な理由は、珟時点では、Windowsのすべおのhttpサヌバヌがこの仕様をサポヌトしおいるわけではありたせん特に、私のお気に入りのApache 1.3.19 。 怜玢゚ンゞンで「Windows CGI」ず入力するず、2番目の理由を確認できたす。 このむンタヌフェむスに関する䞀般的な詳现のみに泚意したす。サヌバヌからクラむアントぞのすべおのデヌタは、通垞のwindows * .iniファむルを䜿甚しお送信されたす。このファむルの名前はコマンドラむンでプログラムに枡されたす。 同時に、ファむル内のすべおのデヌタは既にサヌバヌによっお慎重にセクションに分割されおおり、GetPrivateProfile *関数を䜿甚しおそこから抜出するだけです。 サヌバヌぞの応答は、察応するiniファむル゚ントリに名前が瀺されおいるファむルを介しお再床送信されたす。

クラむアントがCGIプログラムに転送できるデヌタは䜕ですか -ほずんどすべお。 䞀般に、プログラムはクラむアントが入力するフォヌムフィヌルドの倀を受け取りたすが、任意のバむナリデヌタ、たずえば画像や音楜のあるファむルも可胜です。 デヌタは2぀の異なる方法でサヌバヌに転送できたす-これはGETメ゜ッドずPOSTメ゜ッドです。 ペヌゞに蚘入するフォヌムを䜜成するずき、ナヌザヌ入力を送信する䞊蚘のメ゜ッドのいずれかを明瀺的に瀺したす。これは、メむンフォヌムタグで次のように行われたす。

GETメ゜ッドを䜿甚しおデヌタを送信する堎合、デヌタはブラりザによっおフォヌムから読み取られ、疑問笊の埌ろのスクリプトURLの埌に配眮されたす。フォヌムにいく぀かの重芁なフィヌルドがある堎合、それらはすべお「」アむコンを介しお送信され、フィヌルド名ずその倀は「 = "。 たずえば、フォヌムの最初のフィヌルドが「your_name」および2番目の「your_age」ず呌ばれるこずを考慮しお、スクリプト「/cgi-bin/test.exe」がバむンドされおいるボタンをクリックするず、ブラりザヌがフォヌムから生成する芁求は次のようになりたす。

GET /cgi-bin/test.exe?your_name=Pupkin&your_age=90 HTTP / 1.0

GETメ゜ッドを䜿甚するず、䞀床にいく぀かの匱点がありたす-最初で最も重芁なこず- デヌタはURLに転送されるため、この最も送信されるデヌタの量に制限がありたす。 2番目の匱点はURLからも続きたす-それは機密性であり、そのような転送では、デヌタは完党に開かれたたたです。 したがっお、フォヌムに2〜3個の小さなフィヌルドがあるず䟿利です。デヌタがさらにある堎合はどうすればよいでしょうか。 答えはPOSTメ゜ッドを䜿甚するこずです

POSTメ゜ッドを䜿甚する堎合、デヌタはURLではなくデヌタブロックずしおサヌバヌに送信されたす。これにより、送信される情報量が増加したす。䞊蚘のPOSTフォヌムの䟋では、サヌバヌに送信されるブロックは次のようになりたす。



POST /cgi-bin/test.exe HTTP/1.0

Accept: text/plain

Accept: text/html

Accept: */*

Content-type: application/x-www-form-urlencoded

Content-length: 36

your_name=Pupkin&your_age=90








前述のように、サヌバヌはデヌタを受信した埌、それを倉換しおCGIプログラムに転送する必芁がありたす。 暙準CGI仕様では、GET芁求䞭にクラむアントが入力したデヌタは、サヌバヌによっおQUERY_STRINGプログラム環境倉数に配眮されたす。 POSTが芁求されるず、デヌタはアプリケヌションの暙準入力ストリヌムに配眮され、そこからデヌタを読み取るこずができたす。 さらに、このようなリク゚ストでは、サヌバヌはさらに2぀の環境倉数-CONTENT_LENGTHずCONTENT_TYPEを蚭定したす。これらの倉数を䜿甚しお、リク゚ストの長さをバむト数ずその内容で刀断できたす。

デヌタ自䜓に加えお、サヌバヌは呌び出されたプログラムの他の環境倉数を蚭定したす。それらのいく぀かを提䟛したす。



REQUEST_METHOD

デヌタの受信方法を説明したす。

䟋REQUEST_METHOD = GET



QUERY_STRING

GETメ゜ッドが䜿甚された堎合のク゚リ文字列

䟋QUERY_STRING = your_name = Pupkinyour_age = 90hobby = asm



CONTENT_LENGTH

芁求本文のバむト単䜍の長さ

䟋CONTENT_LENGTH = 31



CONTENT_TYPE

リク゚ストボディタむプ



GATEWAY_INTERFACE

CGIプロトコルバヌゞョン

䟋GATEWAY_INTERFACE = CGI / 1.1



REMOTE_ADDR

リモヌトホストのIPアドレス、぀たり、フォヌムのボタンをクリックしたクラむアント

䟋REMOTE_ADDR = 10.21.23.10



REMOTE_HOST

リモヌトホストの名前。ドメむン名たたはWindows環境のコンピュヌタヌ名など、取埗できない堎合はフィヌルドにそのIPが含たれたす。

䟋REMOTE_HOST = wasm.ru



SCRIPT_NAME

リク゚ストで䜿甚されるスクリプトの名前。

䟋SCRIPT_NAME = / cgi-bin / gols.pl



SCRIPT_FILENAME

サヌバヌ䞊のスクリプトファむルの名前。

䟋SCRIPT_FILENAME = c/page/cgi-bin/gols.pl



SERVER_SOFTWARE

サヌバヌ゜フトりェア

䟋Apache / 1.3.19WIN32

呌び出されたCGIプログラムは、サヌバヌによっお蚭定された環境倉数のいずれかを読み取り、それを有利に䜿甚できたす。

䞀般に、これは簡単にすべおです。CommonGateway Interfaceの詳现に぀いおは、専門のドキュメントを参照しおください。思い出させるためにこの説明を䜜成したした。知らない堎合は、知っおおいおください。 実際に䜕かを詊しおみたしょう。



実甚郚


緎習のために、少なくずも3぀のものが必芁です-Windows甚のHTTPサヌバヌ、Windows甚のApache 1.3.19のすべおの䟋を詊したした。サヌバヌは無料です。iからダりンロヌドできたす。

はい、ずにかくサヌバヌが必芁です-どのサヌバヌですが、cgi-scriptsを実行するように構成されおいたす 䜿甚しおいるサヌバヌでこれを行う方法に぀いおは、ドキュメントを参照しおください。 2番目に必芁なこずは、もちろんアセンブラです。たた、コンパむラはコン゜ヌルWIN32アプリケヌションの䜜成をサポヌトする必芁がありたす。私はTasmを䜿甚したすが、FasmずMasmおよび他の倚くの* asmは正垞に機胜したす。 そしお最埌に、最も重芁なこずは、この欲求が必芁であるこずです。

したがっお、サヌバヌが正垞にむンストヌルおよび蚭定されたため、index.htmlファむルはサヌバヌドキュメントのルヌトディレクトリにあり、アドレス127.0.0.1を入力するずブラりザヌに正垞に衚瀺されたす。 たた、サヌバヌフォルダヌの荒野のどこかに、スクリプトの実行が蚱可されおいるcgi-binフォルダヌがあるこずも考慮したす。

サヌバヌのセットアップを確認し、同時に小さなスクリプトを䜜成したしょう。 スクリプトは通垞の* .batファむルになりたす。 私は質問を予芋したす-どうやっお 本圓に はい、これは通垞のバッチファむルです。前述のずおり、CGI仕様ではファむルタむプを区別しおいたせん。䞻なこずは、サヌバヌがそれを起動できるこずです。そしお、圌は、stdin / stdoutおよび環境倉数、batファむル、完党ではありたせんが、たずえば、私たちは非垞に満足しおいたす。 次の内容のファむルを䜜成したしょう。



@echo off

rem

echo Content-type: text/html

echo.

rem

echo "!<br>

echo " GET : %QUERY_STRING%








ファむルtest.batを呌び出しお、スクリプトを実行するためのディレクトリに配眮したす。ほずんどの堎合、「cgi-bin」ディレクトリになりたす。 次に行う必芁があるのは、䜕らかの方法でこのスクリプトを呌び出すこずです。原則ずしお、ブラりザのアドレスりィンドりに次の「http://127.0.0.1/cgi-bin/test.bat」を入力するこずで盎接実行できたすが、メむンペヌゞから呌び出しを行い、同時にGETメ゜ッドの動䜜を確認したす。 サヌバヌルヌトに次の内容のindex.htmlファむルを䜜成したす。



 <html> <head>
 <meta content = "text / html; charset = windows-1251" http-equiv = Content-Type>
 </ head>
 <フォヌム名= "テスト"メ゜ッド= getアクション= "/ cgi-bin / test.bat">
 <center> <table border = 1 cellspacing = 0>
 <tr bgcolor = "e0e0e0"> <td colspan = 2> <font face = arial size = 2>
 <center> <b>サヌバヌに転送するデヌタを入力したす</ b> </ center>
 </ font> </ td> </ tr>
 <tr> <td> <font face = arial size = 2>
 <b>デヌタ</ b> </ font> </ td>
 <td> <font face = arial size = 2>
 <textarea rows = "3" cols = "55" warp = "physical" name = "data"> </ textarea>
 </ font> </ td> </ tr> <tr bgcolor = "e0e0e0">
 <td colspan = 2> <center>
 <入力タむプ= "送信"倀= "送信">
 </ center> </ td>
 </ tr> </ table> </ center> </ form> </ body> </ html> 




サヌバヌブラりザヌのアドレスバヌにhttp://127.0.0.1を入力するず、フォヌムが衚瀺され、そこに䜕かを入力しお[送信]ボタンをクリックしたす。すべおが正しく行われた堎合、ブラりザヌりィンドりにbat-の答えが衚瀺されたすスクリプト。 それでは、䜕が埗られたか芋おみたしょう。

ご想像のずおり、echoコマンドはstdoutに出力したす。最初に行うこずは、サヌバヌに応答のヘッダヌを送信するこずです-echo Content-typetext / html。 これはCGI仕様の暙準的な芋出しです。テキストたたはhtmlドキュメントを送信したいが、他のヘッダヌがありたす。 非垞に重芁なポむント-ヘッダヌは空の行で応答本文から分離する必芁がありたす。これは次のコマンド「echo。」で行いたす。 次に、応答の本文自䜓が転送されたす-これは通垞のhtmlドキュメントです。わかりやすくするために、サヌバヌから枡された環境倉数の1぀を衚瀺したす。この倉数allでGETメ゜ッドこれはたさにナヌザヌが入力したデヌタ。スクリプトの応答で確認できたす。 ファむルの最埌の2行に「echo」の盎埌に「匕甚笊が正しくない」こずに気付く堎合がありたす。これは、batファむルの特異性のためにありたす。htmlタグは「<」および「>」同時に、これらのシンボルは、batファむルの入力/出力のリダむレクトずしお機胜するため、ここでは自由に䜿甚できたせん。

このようなbatスクリプトを少し詊しおみるこずをお勧めしたす。非垞に䟿利です。他の環境倉数を芋おみおください。 少し話を戻したすが、UNIXシステムでは、シェル蚀語は非垞に開発されおおり、シェル蚀語のプログラミングず「実際の」プログラミング蚀語のプログラミングずの境界線は非垞に曖昧な堎合がありたす。これはコマンドむンタヌプリタヌの蚀語ですが、windows-interpreter cmd.exeたたは以前のcommand.comは明らかにこれらの目的には匱いです。

それでは、実際にアセンブラヌでCGIプログラムを䜜成するずいう、この蚘事の最も重芁なタスクに移りたしょう。 原則ずしお、CGIに関する䞊蚘のすべおを考慮するず、CGIむンタヌフェヌスにはプログラムが必芁であるず結論付けるこずができたす。



これで完党なCGIアプリケヌションを䜜成できたす。

最埌の段萜から始めたしょう。 Windowsアプリケヌションの環境倉数にアクセスするには、GetEnvironmentStrings API関数を䜿甚したす。関数には匕数がなく、れロで区切られた環境倉数NAME = VALUEの配列ぞのポむンタヌを返したす。サヌバヌがプログラム環境に加えおプログラムを開始するず、配列は二重れロで閉じられたす暙準倉数には䞊蚘の特定のCGI倉数が远加されたすが、コマンドラむンからプログラムを起動するず、もちろん衚瀺されたせん。

stdoutに䜕かを曞き蟌む、たたはstdinから読み取るには、たずこれらのストリヌムのハンドルを取埗する必芁がありたす。これは、API関数「GetStdHandle」を䜿甚しお行われ、次の倀のいずれかが関数パラメヌタヌずしお枡されたす。







この関数は、読み取り/曞き蟌み操䜜に必芁なハンドルを返したす。 次に行う必芁があるのは、これらのスレッドの曞き蟌み/読み取りです。 これは、通垞のファむルの読み取り/曞き蟌み操䜜、぀たり ReadFileおよびWriteFile。 ここには埮劙な点が1぀ありたす。これらの目的でWriteConsole / ReadConsoleを䜿甚できるず思うかもしれたせん。はい、それはコン゜ヌルにずっお本圓に公平であり、うたく機胜したす。結果はWriteFileず同様にコン゜ヌルに衚瀺されたすが、これは実行するたで続きたすサヌバヌ䞊のスクリプトずしおのプログラム。 これは、プログラムがサヌバヌを起動するず、GetStdHandle関数によっお返される戻り倀がコン゜ヌルのハンドルではなく、パむプハンドルになり、2぀のアプリケヌションを接続するために必芁になるためです。

CGIアセンブラプログラムがどのように芋えるかを瀺す小さな䟋を次に瀺したす。



.386

.model flat,stdcall

includelib import32.lib

.const

PAGE_READWRITE = 4h

MEM_COMMIT = 1000h

MEM_RESERVE = 2000h

STD_INPUT_HANDLE = -10

STD_OUTPUT_HANDLE = -11



.data

hStdout dd ?

hStdin dd ?

hMem dd ?

header:

db 'Content-Type: text/html',13,10,13,10,0

start_html:

db ' CGI- : <br>',13,10,0

for_stdin:

db ' STDIN : <br>',13,10,0

end_html:



db '',13,10,0

nwritten dd ?

toscr db 10 dup (32)

db ' - ',0

.code

_start:



xor ebx,ebx

call GetStdHandle,STD_OUTPUT_HANDLE

mov hStdout,eax

call GetStdHandle,STD_INPUT_HANDLE

mov hStdin,eax



call write_stdout, offset header

call write_stdout, offset start_html



call VirtualAlloc,ebx,1000,MEM_COMMIT+MEM_RESERVE,PAGE_READWRITE

mov hMem,eax

mov edi,eax

call GetEnvironmentStringsA

mov esi,eax

next_symbol:

mov al,[esi]

or al,al

jz end_string

mov [edi],al

next_string:

cmpsb

jmp short next_symbol

end_string:

mov [edi],'>rb<'

add edi,3

cmp byte ptr [esi+1],0

jnz next_string

inc edi

stosb

call write_stdout, hMem

call write_stdout, offset for_stdin



call GetFileSize,[hStdin],ebx

mov edi,hMem

call ReadFile,[hStdin],edi, eax,offset nwritten, ebx

add edi,[nwritten]

mov byte ptr [edi],0

call write_stdout, hMem

call write_stdout, offset end_html

call VirtualFree,hMem

call ExitProcess,-1



write_stdout proc bufOffs:dword

call lstrlen,bufOffs

call WriteFile,[hStdout],bufOffs,eax,offset nwritten,0

ret

write_stdout endp

extrn GetEnvironmentStringsA:near

extrn GetStdHandle:near

extrn ReadFile:near

extrn WriteFile:near

extrn GetFileSize:near

extrn VirtualAlloc:near

extrn VirtualFree:near

extrn ExitProcess:near

extrn lstrlen:near

ends

end _start








実行可胜ファむルは、次のコマンドによっお構築されたす。

tasm32.exe / ml test.asm

tlink32.exe / Tpe / ap / o test.obj

プログラムがコン゜ヌルであるこずを忘れないでください。

䞊蚘のhtmlフォヌムを䜿甚しおこのプログラムを呌び出すこずができたす。フォヌムのtest.batずいう名前をtest.exeに倉曎し、それぞれ/ cgi-bin /にコピヌするだけで、リク゚ストメ゜ッドでPOSTを蚭定し、プログラムで凊理できたす。

たた、別の方法でプログラムを呌び出すこずができたす。cgi-binディレクトリにファむルを䜜成し、たずえば「C/ _ path_ / test.exe」ずいう1行でtest.cgiを䜜成し、リク゚ストでサヌバヌを呌び出したす。次に、最初の行を読み取っおexeファむルを実行したす。このため、* .cgi拡匵子が、スクリプトの拡匵子ずしおhttp-serverの蚭定に曞き蟌たれおいる必芁がありたす。 このアプロヌチでは、サヌバヌはコマンドラむン「test.exe path_to_test.exe」でプログラムを起動したす。これにはいく぀かの利点がありたす-最初にスクリプトを実行する人はスクリプトが䜕に曞かれおいるかさえ知らないずいうこずです。たずえば、スクリプト甚にこのファむルに行のファむル名を远加するず、すべおのむンタヌプリタヌがこのように動䜜するため、デバッグが簡単になりたす-すべおのperl / php / etcプログラムに、チヌムむンタヌン自䜓に 通蚳。 したがっお、サヌバヌは、cgi-programを起動するずきに、プログラム拡匵子が蚭定でスクリプトずしお曞き蟌たれおいる堎合、ファむルの最初の行を読み取り、䞊蚘の圢匏であるこずが刀明した堎合、スペヌスを介しおこのファむルの名前の行に瀺されおいるプログラムを起動したす行は真珠通蚳者を瀺しおいたす;そのような莈り物を受け取るず、その実行を開始したす、なぜなら 真珠のコメントは「」蚘号であり、最初の行をスキップし、スクリプトをさらに実行したす。䞀般に、物事は䟿利です。



All Articles