ืื ื’ืœื™ืชืฆืจืคืชื™ืชืกืคืจื“ื™

Ad


ืกืžืœ OnWorks

haserl - ืžืงื•ื•ืŸ ื‘ืขื ืŸ

ื”ืคืขืœ haserl ื‘ืกืคืง ืื™ืจื•ื— ื‘ื—ื™ื ื ืฉืœ OnWorks ืขืœ ืื•ื‘ื•ื ื˜ื• ืžืงื•ื•ืŸ, ืคื“ื•ืจื” ืžืงื•ื•ืŸ, ืืžื•ืœื˜ื•ืจ ืžืงื•ื•ืŸ ืฉืœ Windows ืื• ืืžื•ืœื˜ื•ืจ ืžืงื•ื•ืŸ ืฉืœ MAC OS

ื–ื” ื”ืคืงื•ื“ื” haserl ืฉื ื™ืชืŸ ืœื”ืคืขื™ืœ ื‘ืกืคืง ื”ืื™ืจื•ื— ื”ื—ื™ื ืžื™ ืฉืœ OnWorks ื‘ืืžืฆืขื•ืช ืื—ืช ืžืชื—ื ื•ืช ื”ืขื‘ื•ื“ื” ื”ืžืงื•ื•ื ื•ืช ื”ืžืจื•ื‘ื•ืช ืฉืœื ื•, ื›ื’ื•ืŸ Ubuntu Online, Fedora Online, ืืžื•ืœื˜ื•ืจ ืžืงื•ื•ืŸ ืฉืœ Windows ืื• ืืžื•ืœื˜ื•ืจ ืžืงื•ื•ืŸ ืฉืœ MAC OS

ืชึธื›ึฐื ึดื™ืช:

ืฉืึตื


haserl - ืชื•ื›ื ื™ืช ืกืงืจื™ืคื˜ื™ื ืฉืœ cgi ืขื‘ื•ืจ ืกื‘ื™ื‘ื•ืช ืžื•ื˜ื‘ืขื•ืช

ืชึทืงืฆึดื™ืจ


#!/usr/bin/haserl [--shell=ืžืคืจื˜ ื ืชื™ื‘ื™ื] [--upload-dir=dirspec] [--upload-handler=ืžื˜ืคืœ]
[--upload-limit=ืœื”ื’ื‘ื™ืœ] [--ืงื‘ืœ ื”ื›ืœ] [--ืงื‘ืœ-ืืฃ ืื—ื“] [--ืฉืงื˜] [--ืœื ืคื•ืช]

[ ื˜ืงืกื˜ ] [ <% ืกืงืจื™ืคื˜ ืžืขื˜ืคืช %> ] [ ื˜ืงืกื˜ ] ...

ืชื™ืื•ืจ


Haserl ื”ื•ื ืžืขื˜ืคืช cgi ืงื˜ื ื” ื”ืžืืคืฉืจืช ืชื›ื ื•ืช cgi ื‘ืกื’ื ื•ืŸ "PHP", ืืš ืžืฉืชืžืฉืช ื‘-UNIX
ืžืขื˜ืคืช ื“ืžื•ื™ืช bash ืื• Lua ื›ืฉืคืช ื”ืชื›ื ื•ืช. ื”ื•ื ืงื˜ืŸ ืžืื•ื“, ื›ืš ืฉื ื™ืชืŸ ืœื”ืฉืชืžืฉ ื‘ื•
ื‘ืกื‘ื™ื‘ื•ืช ืžืฉื•ื‘ืฆื•ืช, ืื• ื›ืืฉืจ ืžืฉื”ื• ื›ืžื• PHP ื’ื“ื•ืœ ืžื“ื™.

ื”ื•ื ืžืฉืœื‘ ืฉืœื•ืฉ ืชื›ื•ื ื•ืช ืœืชื•ืš ืžื ื•ืข cgi ืงื˜ืŸ:

ื”ื•ื ืžื ืชื— ื‘ืงืฉื•ืช POST ื•-GET, ื•ืžืฆื™ื‘ ืจื›ื™ื‘ื™ ื˜ื•ืคืก ื‘ืชื•ืจ ื–ื•ื’ื•ืช ืฉื=ืขืจืš ื‘-
ืกื‘ื™ื‘ื” ืœืฉื™ืžื•ืฉ ื‘ืกืงืจื™ืคื˜ CGI. ื–ื” ืงืฆืช ื“ื•ืžื” ืœ uncgi ืขึฒื˜ึดื™ืคึธื”.

ื–ื” ืคื•ืชื— ืžืขื˜ืคืช ื•ืžืชืจื’ื ืืช ื›ืœ ื”ื˜ืงืกื˜ ืœื”ืฆื”ืจื•ืช ื”ื ื™ืชื ื•ืช ืœื”ื“ืคืกื”. ื›ืœ ื”ื˜ืงืกื˜
ื‘ืชื•ืš <% ... %> ืžื‘ื ื™ื ืžื•ืขื‘ืจื™ื ืžื™ืœื” ื‘ืžื™ืœื” ืœืžืขื˜ืคืช. ื–ื” ื‘ืžื™ื“ืช ืžื”
ื›ืžื• ื›ืชื™ื‘ื” PHP ืชืกืจื™ื˜ื™ื.

ื ื™ืชืŸ ืœื”ืชืงื™ืŸ ืื•ืชื• ื‘ืื•ืคืŸ ืื•ืคืฆื™ื•ื ืœื™ ื›ื“ื™ ืœืฉื—ืจืจ ืืช ื”ื”ืจืฉืื•ืช ืฉืœื• ืœื‘ืขืœื™ื ืฉืœ ื”ืกืงืจื™ืคื˜,
ื ื•ืชืŸ ืœื• ื›ืžื” ืžืชื›ื•ื ื•ืช ื”ืื‘ื˜ื—ื” ืฉืœ suexec or cgiwrapper.

ืืคืฉืจื•ื™ื•ืช ืกื™ื›ื•ื


ื–ื”ื• ืกื™ื›ื•ื ืฉืœ ืืคืฉืจื•ื™ื•ืช ืฉื•ืจืช ื”ืคืงื•ื“ื”. ืื ื ืจืื” ืืช ืืคืฉืจื•ื™ื•ืช ืกืขื™ืฃ ืชื—ืช
ืฉื ืืคืฉืจื•ืช ืืจื•ืš ืœืชื™ืื•ืจ ืžืœื.

-ื --ืงื‘ืœ-ื”ื›ืœ
-n --ืงื‘ืœ-ืื™ืŸ
-d --debug
-s, --ืฉืจื™ื•ืŸ
-S, --ืฉืงื˜
-U, --upload-dir
-u, --upload-limit
-H, ---load-handler

ืืคืฉืจื•ื™ื•ืช


--ืงื‘ืœ ื”ื›ืœ
ื”ืชื•ื›ื ื™ืช ื‘ื“ืจืš ื›ืœืœ ืžืงื‘ืœืช ื ืชื•ื ื™ POST ืจืง ื›ืืฉืจ REQUEST_METHOD ื”ื•ื POST ื•
ืžืงื‘ืœ ื ืชื•ื ื™ื ืขืœ ื ืชื•ื ื™ ื›ืชื•ื‘ืช ื”ืืชืจ ืจืง ื›ืืฉืจ REQUEST_METHOD ื”ื•ื GET. ืืคืฉืจื•ืช ื–ื•
ืžืืคืฉืจ ืœืงื‘ืœ ื ืชื•ื ื™ POST ื•-URL ื’ื ื™ื—ื“ ืœืœื ืงืฉืจ ืœ-REQUEST_METHOD.
ื›ืืฉืจ ืืคืฉืจื•ืช ื–ื• ืžื•ื’ื“ืจืช, REQUEST_METHOD ืžืงื‘ืœ ืขื“ื™ืคื•ืช (ืœืžืฉืœ ืื ื”ืฉื™ื˜ื”
ื”ื•ื POST, ืžืฉืชื ื™ื FORM_ื ืœืงื—ื™ื ืžื ืชื•ื ื™ COOKIE, ื ืชื•ื ื™ GET ื•ื ืชื•ื ื™ POST, ื‘
ื”ืกื“ืจ ื”ื–ื”. ืื ื”ืฉื™ื˜ื” ื”ื™ื GET, ืžืฉืชื ื™ื FORM_ื ืœืงื—ื™ื ืžื ืชื•ื ื™ COOKIE, POST
ื ืชื•ื ื™ื, ื•ื ืชื•ื ื™ GET.) ื‘ืจื™ืจืช ื”ืžื—ื“ืœ ื”ื™ื ืœื ืœืงื‘ืœ ืืช ื›ืœ ืฉื™ื˜ื•ืช ื”ืงืœื˜ - ืจืง ืืช
ื ืชื•ื ื™ COOKIE ื•ื”-REQUEST_METHOD.

--ืงื‘ืœ-ืื™ืŸ
ืื ื ื™ืชืŸ, haserl ืœื ืชื ืชื— ืงืœื˜ ืกื˜ื ื“ืจื˜ื™ ื›ืชื•ื›ืŸ http ืœืคื ื™ ื”ืขื™ื‘ื•ื“
ื”ืชืกืจื™ื˜. ื–ื” ืฉื™ืžื•ืฉื™ ืื ืงื•ืจืื™ื ืœืกืงืจื™ืคื˜ haserl ืžืกืงืจื™ืคื˜ haserl ืื—ืจ.

--ืœื ืคื•ืช
ื‘ืžืงื•ื ืœื”ืคืขื™ืœ ืืช ื”ืกืงืจื™ืคื˜, ื”ื“ืคืก ืืช ื”ืกืงืจื™ืคื˜ ืฉื™ื‘ื•ืฆืข. ืื
ืžืฉืชื ื” ื”ืกื‘ื™ื‘ื” 'REQUEST_METHOD' ืžื•ื’ื“ืจ, ื”ื ืชื•ื ื™ื ื ืฉืœื—ื™ื ืขื ื”-
ืกื•ื’ ืชื•ื›ืŸ ืจื’ื™ืœ/ื˜ืงืกื˜. ืื—ืจืช, ื›ืชื‘ ื”ืžืขื˜ืคืช ืžื•ื“ืคืก ืžื™ืœื” ื‘ืžื™ืœื”.

--shell=ืžืคืจื˜ ื ืชื™ื‘ื™ื
ืฆื™ื™ืŸ ืงืœื™ืคื” ื—ืœื•ืคื™ืช ื“ืžื•ื™ืช bash ืœืฉื™ืžื•ืฉ. ื‘ืจื™ืจืช ื”ืžื—ื“ืœ ื”ื™ื "/ Bin / sh"

ื›ื“ื™ ืœื›ืœื•ืœ ืคืจืžื˜ืจื™ื ืฉืœ ืžืขื˜ืคืช ืืœ ืชืฉืชืžืฉ ื‘--shell=/ Bin / sh ืคื•ึผืจืžึธื˜. ื‘ืžืงื•ื ื–ืืช, ื”ืฉืชืžืฉ ื‘-
ืคื•ืจืžื˜ ื—ืœื•ืคื™ ืœืœื "=", ื›ืžื• ื‘--shell "/ bin / bash --norc". ื”ืงืคื“ ืœืขืฉื•ืช ื–ืืช
ืฆื™ื˜ื•ื˜ ืืช ืžื—ืจื•ื–ืช ื”ืืคืฉืจื•ื™ื•ืช ื›ื“ื™ ืœื”ื’ืŸ ืขืœ ื”ืชื•ื•ื™ื ื”ืžื™ื•ื—ื“ื™ื.

ืื ื”ื™ื“ื•ืจ ืขื ืกืคืจื™ื•ืช Lua, ืื–ื™ ื”ืžื—ืจื•ื–ืช "lua" ืžืฉืžืฉืช ืœืฉื™ืžื•ืฉ ื‘ืฉื™ืœื•ื‘
Lua vm. ื”ืžื—ืจื•ื–ืช ื”ื–ื• ืชืœื•ื™ืช ืจื™ืฉื™ื•ืช. ื“ื•ื’ืžื: --shell=lua

ื—ืœื•ืคื” ื”ื™ื "ืœื•ืืง". ื–ื” ื’ื•ืจื ืœื ืชื—ื™ haserl ื•-lua ืœื”ื™ื•ืช ืžื•ืฉื‘ืชื™ื,
ื•ื”ื”ื ื—ื” ื”ื™ื ืฉื”ืชืกืจื™ื˜ ื”ื•ื ื ืชื— ืœื•ืื” ืžืฉื•ื“ืจ ืžืจืืฉ. ืœึดืจึฐืื•ึนืช LUAC ืœืžื˜ื” ืœืขื•ื“
ืžื™ื“ืข.

--ืฉืงื˜
Haserl ืžื“ืคื™ืก ื‘ื“ืจืš ื›ืœืœ ื”ื•ื“ืขืช ืžื™ื“ืข ืขืœ ืชื ืื™ ืฉื’ื™ืื”. ื–ึถื”
ืžื“ื›ื ืืช ื”ื•ื“ืขืช ื”ืฉื’ื™ืื”, ื›ืš ืฉื”ืฉื™ืžื•ืฉ ื‘-haserl ืœื ื™ืชืคืจืกื.

--upload-dir=dirspec
ื‘ืจื™ืจืช ื”ืžื—ื“ืœ ื”ื™ื "/ Tmp". ื›ืœ ื”ืงื‘ืฆื™ื ืฉื”ื•ืขืœื• ื ื•ืฆืจื™ื ืขื ืฉื ืงื•ื‘ืฅ ื–ืžื ื™ ื‘ื–ื”
ื‘ืกืคืจื™ื™ื” HASERL_xxx_path ืžื›ื™ืœ ืืช ืฉื ื”ืงื•ื‘ืฅ ื”ื–ืžื ื™. FORM_xxx_name
ืžื›ื™ืœ ืืช ื”ืฉื ื”ืžืงื•ืจื™ ืฉืœ ื”ืงื•ื‘ืฅ, ื›ืคื™ ืฉืฆื•ื™ืŸ ืขืœ ื™ื“ื™ ื”ืœืงื•ื—.

--upload-handler=ืžืคืจื˜ ื ืชื™ื‘ื™ื
ื›ืืฉืจ ืฆื•ื™ืŸ, ื”ืขืœืื•ืช ืงื‘ืฆื™ื ืžื˜ื•ืคืœื•ืช ืขืœ ื™ื“ื™ ื”ืžื˜ืคืœ ื”ื–ื”, ื•ืœื ื ื›ืชื‘ื•ืช
ืงื‘ืฆื™ื ื–ืžื ื™ื™ื. ื™ืฉ ืœืชืช ืืช ืžืคืจื˜ ื”ื ืชื™ื‘ ื”ืžืœื (ืœื ืžื—ืคืฉื™ื ืืช ื”-PATH), ื•ื›ืŸ
ืœ-Upload-handler ื ื™ืชืŸ ืคืจืžื˜ืจ ืื—ื“ ืฉืœ ืฉื•ืจืช ืคืงื•ื“ื”: ืฉื ื”-FIFO on
ืฉื‘ื• ื™ื™ืฉืœื— ืงื•ื‘ืฅ ื”ื”ืขืœืื”. ื‘ื ื•ืกืฃ, ื”ืžื˜ืคืœ ืขืฉื•ื™ ืœืงื‘ืœ 3
ืžืฉืชื ื™ ืกื‘ื™ื‘ื”: ืกื•ื’ ืชื•ื›ืŸ, ืฉื ืงื•ื‘ืฅ, ื• ืฉืึตื. ืืœื” ืžืฉืงืคื™ื ืืช ื”-MIME
ื›ื•ืชืจื•ืช ืชื•ื›ืŸ-disposition ืขื‘ื•ืจ ื”ืชื•ื›ืŸ. Haserl ื™ื—ืœืง ืืช ื”ืžื˜ืคืœ ืขื‘ื•ืจ ื›ืœ ืื—ื“
ื”ืงื•ื‘ืฅ ืฉื”ื•ืขืœื”, ื•ื™ืฉืœื— ืืช ืชื•ื›ืŸ ืงื•ื‘ืฅ ื”ื”ืขืœืื” ืœ-FIFO ืฉืฆื•ื™ืŸ.
ืœืื—ืจ ืžื›ืŸ Haserl ื™ื—ืกื•ื ืขื“ ืฉื”ืžื˜ืคืœ ื™ืกืชื™ื™ื. ืฉื™ื˜ื” ื–ื• ืžื™ื•ืขื“ืช ืœืžื•ืžื—ื™ื
ื‘ืœื‘ื“.

--upload-limit=ืœื”ื’ื‘ื™ืœ
ืืคืฉืจ ืงื•ื‘ืฅ ืžืงื•ื“ื“ ื‘-Mime ืขื“ ืœื”ื’ื‘ื™ืœ KB ืœื”ืขืœื•ืช. ื‘ืจื™ืจืช ื”ืžื—ื“ืœ ื”ื™ื 0KB ืœื
ื”ืขืœืื•ืช ืžื•ืชืจื•ืช). ืฉื™ืžื• ืœื‘ ืฉืงื™ื“ื•ื“ ื”-Mime ืžื•ืกื™ืฃ 33% ืœื’ื•ื“ืœ ื”ื ืชื•ื ื™ื.

ืกืงื™ืจื” ื›ืœืœื™ืช OF ืคืขื•ืœื”


ื‘ืื•ืคืŸ ื›ืœืœื™, ืฉืจืช ื”ืื™ื ื˜ืจื ื˜ ืžื’ื“ื™ืจ ืžืกืคืจ ืžืฉืชื ื™ ืกื‘ื™ื‘ื”, ื•ืœืื—ืจ ืžื›ืŸ ืžืฉืชืžืฉ ืžื–ืœื’ or
ืฉื™ื˜ื” ื ื•ืกืคืช ืœื”ืคืขืœืช ืกืงืจื™ืคื˜ CGI. ืื ื”ืกืงืจื™ืคื˜ ืžืฉืชืžืฉ ื‘- haserl ืžืชื•ืจื’ืžืŸ, ื”
ืงื•ืจื” ื”ื‘ื:

If haserl ืžื•ืชืงืŸ suid root, ื•ืื– uid/gid ืžื•ื’ื“ืจ ืœื‘ืขืœื™ื ืฉืœ ื”ืกืงืจื™ืคื˜.

ื”ืกื‘ื™ื‘ื” ื ืกืจืงืช ืขื‘ื•ืจ HTTP_COOKIE, ืฉื™ื™ืชื›ืŸ ืฉื”ื•ื’ื“ืจ ืขืœ ื™ื“ื™ ื”ืื™ื ื˜ืจื ื˜
ืฉืจืช. ืื ื”ื•ื ืงื™ื™ื, ื”ืชื•ื›ืŸ ื”ืžื ืชื— ืžืžื•ืงื ื‘ืกื‘ื™ื‘ื” ื”ืžืงื•ืžื™ืช.

ื”ืกื‘ื™ื‘ื” ื ืกืจืงืช ืขื‘ื•ืจ REQUEST_METHOD, ืฉื”ื•ื’ื“ืจ ืขืœ ื™ื“ื™ ืฉืจืช ื”ืื™ื ื˜ืจื ื˜.
ื‘ื”ืชื‘ืกืก ืขืœ ืฉื™ื˜ืช ื”ื‘ืงืฉื”, ืงืœื˜ ืกื˜ื ื“ืจื˜ื™ ื ืงืจื ื•ืžื ืชื—. ื”ืžื ื•ืชื—
ื”ืชื›ื ื™ื ืžืžื•ืงืžื™ื ื‘ืกื‘ื™ื‘ื” ื”ืžืงื•ืžื™ืช.

ื”ืชืกืจื™ื˜ ืžืื•ื–ืŸ, ื ื™ืชื•ื— haserl ื‘ืœื•ืงื™ ืงื•ื“ ืžื˜ืงืกื˜ ื’ื•ืœืžื™. ื˜ืงืกื˜ ื’ื•ืœืžื™ ื”ื•ื
ืžื•ืžืจื™ื ืœื”ืฆื”ืจื•ืช "ื”ื“", ื•ืื– ื›ืœ ื”ืืกื™ืžื•ื ื™ื ื ืฉืœื—ื™ื ืœืชืช-ื”ืžืขื˜ืคืช.

haserl ืžื–ืœื’ื•ืช ื•ืชืช-ืงืœื™ืคื” (ื‘ื“ืจืš ื›ืœืœ / Bin / sh) ื”ืชื—ื™ืœ.

ื›ืœ ื”ืืกื™ืžื•ื ื™ื ื ืฉืœื—ื™ื ืœ-STDIN ืฉืœ ืชืช-ื”ืžืขื˜ืคืช, ืขื ื ื’ืจืจ ื™ืฆื™ืื” ืคืงื•ื“ื”.

ื›ืืฉืจ ืชืช-ื”ืžืขื˜ืคืช ืžืกืชื™ื™ืžืช, ื”- haserl ืžืชื•ืจื’ืžืŸ ืžื‘ืฆืข ื ื™ืงื•ื™ ืกื•ืคื™ ื•
ื•ืื– ืžืกืชื™ื™ื.

ืœึธืงื•ึผื—ึท ืฆึทื“ ืงืœื˜


ืืœ ื”ืื ื™ haserl ื”ืžืชื•ืจื’ืžืŸ ื™ืคืขื ื— ื ืชื•ื ื™ื ืฉื ืฉืœื—ื• ื‘ืืžืฆืขื•ืช ืžืฉืชื ื” ื”ืกื‘ื™ื‘ื” HTTP_COOKIE, ื•
ืฉื™ื˜ืช GET ืื• POST ืžื”ืœืงื•ื—, ื•ืœืื—ืกืŸ ืื•ืชื ื›ืžืฉืชื ื™ ืกื‘ื™ื‘ื” ืฉื™ื›ื•ืœื™ื
ื™ืฉ ืœื’ืฉืช ืืœื™ื• ืขืœ ื™ื“ื™ haserl. ืฉื ื”ืžืฉืชื ื” ืขื•ืงื‘ ืื—ืจ ื”ืฉื ืฉื ื™ืชืŸ ื‘ืžืงื•ืจ,
ื—ื•ืฅ ืžื–ื” ืฉืชื—ื™ืœื™ืช ( ื˜ื•ืคืก_) ืžื•ื ื— ืœืคื ื™. ืœื“ื•ื’ืžื”, ืื ื”ืœืงื•ื— ืฉื•ืœื— "foo=bar",
ืžืฉืชื ื” ื”ืกื‘ื™ื‘ื” ื”ื•ื FORM_foo=ื‘ึผึธืจ.

ืขื‘ื•ืจ ืฉื™ื˜ืช HTTP_COOKIE, ืžืฉืชื ื™ื ืžืื•ื—ืกื ื™ื ื’ื ืขื ื”ืงื™ื“ื•ืžืช ( ืขื•ื’ื™ื™ื”_) ื”ื•ืกื™ืฃ.
ืœื“ื•ื’ืžื”, ืื HTTP_COOKIE ื›ื•ืœืœ "foo=bar", ืžืฉืชื ื” ื”ืกื‘ื™ื‘ื” ื”ื•ื
COOKIE_foo=ื‘ึผึธืจ.

ืขื‘ื•ืจ ืฉื™ื˜ืช GET, ื ืชื•ื ื™ื ืฉื ืฉืœื—ื™ื ื‘ืฆื•ืจื” %xx ืžืชื•ืจื’ืžื™ื ืœืชื•ื•ื™ื ืฉื”ื
represent, ื•ืžืฉืชื ื™ื ืžืื•ื—ืกื ื™ื ื’ื ืขื ื”ืงื™ื“ื•ืžืช ( ืœืงื‘ืœ_) ื ื•ืกืฃ. ืœื“ื•ื’ืžื”, ืื
QUERY_STRING ื›ื•ืœืœ "foo=bar", ืžืฉืชื ื” ื”ืกื‘ื™ื‘ื” ื”ื•ื GET_foo=ื‘ึผึธืจ.

ืขื‘ื•ืจ ืฉื™ื˜ืช POST, ืžืฉืชื ื™ื ืžืื•ื—ืกื ื™ื ื’ื ืขื ื”ืงื™ื“ื•ืžืช ( POST_) ื ื•ืกืฃ. ืœ
ืœื“ื•ื’ืžื”, ืื ื–ืจื ื”ืคื•ืกื˜ ื›ื•ืœืœ "foo=bar", ืžืฉืชื ื” ื”ืกื‘ื™ื‘ื” ื”ื•ื POST_foo=ื‘ึผึธืจ.

ื›ืžื• ื›ืŸ, ืขื‘ื•ืจ ืฉื™ื˜ืช POST, ืื ื”ื ืชื•ื ื™ื ื ืฉืœื—ื™ื ื‘ืืžืฆืขื•ืช ื ืชื•ื ื™ื ืžืจื•ื‘ื™ ื—ืœืงื™ื / ื˜ืคืกื™ื ืงื™ื“ื•ื“, ื”
ื”ื ืชื•ื ื™ื ืžืคื•ืขื ื—ื™ื ืื•ื˜ื•ืžื˜ื™ืช. ื–ื” ืžืฉืžืฉ ื‘ื“ืจืš ื›ืœืœ ื›ืืฉืจ ืงื‘ืฆื™ื ืžื•ืขืœื™ื ืžื”ืื™ื ื˜ืจื ื˜
ื”ืœืงื•ื— ืžืฉืชืžืฉ .

ื”ืขืจื” ื›ืืฉืจ ืงื•ื‘ืฅ ืžื•ืขืœื” ืœืฉืจืช ื”ืื™ื ื˜ืจื ื˜, ื”ื•ื ืžืื•ื—ืกืŸ ื‘- upload-dir
ื‘ืžื“ืจื™ืš. FORM_variable_name= ืžื›ื™ืœ ืืช ืฉื ื”ืงื•ื‘ืฅ ืฉื”ื•ืขืœื” (ื›ืžื•
ืฉืฆื•ื™ืŸ ืขืœ ื™ื“ื™ ื”ืœืงื•ื—.) HASERL_variable_path= ืžื›ื™ืœ ืืช ืฉื ื”ืงื•ื‘ืฅ ื‘
upload-dir ืฉืžื—ื–ื™ืง ืืช ื”ืชื•ื›ืŸ ืฉื”ื•ืขืœื”. ื›ื“ื™ ืœืžื ื•ืข ืžืœืงื•ื—ื•ืช ื–ื“ื•ื ื™ื™ื
ืžืชืžืœื upload-dir ื‘ืฉืจืช ื”ืื™ื ื˜ืจื ื˜ ืฉืœืš, ื”ืขืœืืช ืงื‘ืฆื™ื ืžื•ืชืจืช ืจืง ื›ืืฉืจ
--ื”ืขืœืื”-ืžื’ื‘ืœื” ื”ืืคืฉืจื•ืช ืžืฉืžืฉืช ื›ื“ื™ ืœืฆื™ื™ืŸ ื›ืžื” ื’ื“ื•ืœ ื ื™ืชืŸ ืœื”ืขืœื•ืช ืงื•ื‘ืฅ. ื”ืืกืจืœ
ืžื•ื—ืง ืื•ื˜ื•ืžื˜ื™ืช ืืช ื”ืงื•ื‘ืฅ ื”ื–ืžื ื™ ืขื ืกื™ื•ื ื”ืกืงืจื™ืคื˜. ื›ื“ื™ ืœืฉืžื•ืจ ืขืœ
ืงื•ื‘ืฅ, ื”ืขื‘ืจ ืื•ืชื• ืื• ืฉื ื” ืืช ืฉืžื• ื‘ืžืงื•ื ื›ืœืฉื”ื• ื‘ืกืงืจื™ืคื˜.

ืฉื™ืžื• ืœื‘ ืฉืฉื ื”ืงื•ื‘ืฅ ืžืื•ื—ืกืŸ ื‘ HASERL_ื ืชื™ื‘_ืžืฉืชื ื” ื”ืกื™ื‘ื” ืœื›ืš ื”ื™ื ืฉื”-FORM_,
ืžืฉืชื ื™ GET_ ื•-POST_ ื ื™ืชื ื™ื ืœืฉื™ื ื•ื™ ืขืœ ื™ื“ื™ ื”ืœืงื•ื—, ื•ืœืงื•ื— ื–ื“ื•ื ื™ ื™ื›ื•ืœ
ื”ื’ื“ืจ ืžืฉืชื ื” ืฉื ื™ ืขื ื”ืฉื ืžืฉืชื ื”_ื ืชื™ื‘=/ etc / passwd. ื’ืจืกืื•ืช ืงื•ื“ืžื•ืช
ืœื ืื—ืกืŸ ืืช ืžืคืจื˜ ื”ื ืชื™ื‘ื™ื ื”ืืกืจืœ ืžืจื—ื‘ ืฉืžื•ืช. ืœ ืœืชื—ื–ืง ืœึฐืึธื—ื•ึนืจ
ืชืื™ืžื•ืช, ืžื” ื”ื™ื ืฉื of ืžื” ื”ื™ื ื–ืžื ื™ ืคื™ืœื” is ื’ื ืžืื•ื—ืกืŸ in FORM_variable= ื•
POST_variable=. ื–ึถื” is ื ื—ืฉื‘ ืžึฐืกื•ึผื›ึผึธืŸ ื• ืฆืจื™ืš ืœึนื be ืžึฐืฉืื•ึผืžึธืฉื.

ืื ื”ืœืงื•ื— ืฉื•ืœื— ื ืชื•ื ื™ื ืฉื ื™ื”ื ืœืคื™ ืฉื™ื˜ื•ืช POST ื•-GET, ืื ื›ืŸ haserl ื™ื ืชื— ืจืง ืืช
ื ืชื•ื ื™ื ื”ืชื•ืืžื™ื ืืช REQUEST_METHOD ืžืฉืชื ื” ืฉื”ื•ื’ื“ืจ ืขืœ ื™ื“ื™ ืฉืจืช ื”ืื™ื ื˜ืจื ื˜, ืืœื ืื ื›ืŸ
ืงื‘ืœ ื”ื›ืœ ื”ื•ื’ื“ืจื” ืืคืฉืจื•ืช. ืœื“ื•ื’ืžื”, ื˜ื•ืคืก ืฉื ืงืจื ื‘ืืžืฆืขื•ืช ืฉื™ื˜ืช POST, ืืš ื‘ืขืœ a
URI ืฉืœ some.cgi?foo=bar&otherdata=something ื™ื ืชื— ืืช ื ืชื•ื ื™ ื”-POST, ื•ื”- Foo
ื• ื ืชื•ื ื™ื ืื—ืจื™ื ืžืชืขืœืžื™ื ืžื”ืžืฉืชื ื™ื.

ืื ืฉืจืช ื”ืื™ื ื˜ืจื ื˜ ืžื’ื“ื™ืจ ื HTTP_COOKIE ืžืฉืชื ื” ืกื‘ื™ื‘ื”, ื ืชื•ื ื™ ื”ืขื•ื’ื™ื•ืช ืžื ื•ืชื—ื™ื.
ื ืชื•ื ื™ ืงื•ื‘ืฆื™ Cookie ืžื ื•ืชื—ื™ื ืœืคื ื™ ื ืชื•ื ื™ GET ืื• POST, ื›ืš ืฉื‘ืžืงืจื” ืฉืœ ืฉื ื™ ืžืฉืชื ื™ื ืฉืœ
ื‘ืื•ืชื• ืฉื, ื ืชื•ื ื™ ื”-GET ืื• ื”-POST ืžื—ืœื™ืคื™ื ืืช ืžื™ื“ืข ื”ืขื•ื’ื™ื•ืช.

ื›ืืฉืจ ื ืฉืœื—ื™ื ืžืกืคืจ ืžื•ืคืขื™ื ืฉืœ ืื•ืชื• ืžืฉืชื ื” ืžืžืงื•ืจื•ืช ืฉื•ื ื™ื, ื”-
FORM_variable ื™ื•ื’ื“ืจ ืœืคื™ ืกื“ืจ ืขื™ื‘ื•ื“ ื”ืžืฉืชื ื™ื.
HTTP_COOKIE ืชืžื™ื“ ืžืขื•ื‘ื“ ืจืืฉื•ืŸ, ื•ืื—ืจื™ื• REQUEST_METHOD. ืื ื”ืงื‘ืœ-ื”ื›ืœ
ื”ื•ื’ื“ืจื” ื”ืืคืฉืจื•ืช, ื•ืื– HTTP_COOKIE ืžืขื•ื‘ื“ ืชื—ื™ืœื”, ื•ืœืื—ืจ ืžื›ืŸ ื”ืฉื™ื˜ื” ืœื
ืฆื•ื™ืŸ ืขืœ ื™ื“ื™ REQUEST_METHOD, ื•ืื—ืจื™ื• REQUEST_METHOD. ื”ืžืงืจื” ื”ืื—ืจื•ืŸ ืฉืœ ื”
ื”ืžืฉืชื ื” ื™ืฉืžืฉ ืœื”ื’ื“ืจืช FORM_variable. ืฉื™ืžื• ืœื‘ ืฉื’ื ื”ืžืฉืชื ื™ื ื”ื ื‘ื ืคืจื“
ื™ื•ืฆืจ ื›-COOKIE_variable, GET_variable ื•-POST_variable. ื–ื” ืžืืคืฉืจ ืฉื™ืžื•ืฉ ื‘
ืฉืžื•ืช ื—ื•ืคืคื™ื ืžื›ืœ ืžืงื•ืจ.

ื›ืืฉืจ ืžืกืคืจ ืžื•ืคืขื™ื ืฉืœ ืื•ืชื• ืžืฉืชื ื” ื ืฉืœื—ื™ื ืžืื•ืชื• ืžืงื•ืจ, ืจืง ื”ืื—ืจื•ืŸ
ืื—ื“ ื ืฉืžืจ. ื›ื“ื™ ืœืฉืžื•ืจ ืืช ื›ืœ ื”ืขื•ืชืงื™ื (ืขื‘ื•ืจ ืจื™ื‘ื•ื™ ื‘ื—ื™ืจื•ืช, ืœืžืฉืœ), ื”ื•ืกืฃ "[]" ืœืกื•ืฃ
ืฉืœ ืฉื ื”ืžืฉืชื ื”. ื›ืœ ื”ืชื•ืฆืื•ืช ื™ื•ื—ื–ืจื•, ืžื•ืคืจื“ื•ืช ื‘ืฉื•ืจื•ืช ื—ื“ืฉื•ืช. ืœื“ื•ื’ืžื”,
host=Enoch&host=Esther&host=Joshua ืชื•ืฆืื•ืช ื‘"FORM_host=Joshua".
host[]=Henoch&host[]Esther&host[]=Joshua ืชื•ืฆืื•ืช ื‘"FORM_host=Enoch\nEsther\nJoshua"

ืฉื‚ึธืคึธื”


ืžื‘ื ื™ ื”ืฉืคื” ื”ื‘ืื™ื ืžื–ื•ื”ื™ื ืขืœ ื™ื“ื™ haserl.

ืœึธืจื•ึผืฅ
<% [ืชืกืจื™ื˜ ืžืขื˜ืคืช] %>

ื›ืœ ื“ื‘ืจ ื”ืžื•ืงืฃ ื‘ืชื’ื™ื•ืช <% %> ื ืฉืœื— ืืœ ืชืช-ื”ืžืขื˜ืคืช ืœื‘ื™ืฆื•ืข. ื”ื˜ืงืกื˜
ื ืฉืœื— ืžื™ืœื” ื‘ืžื™ืœื”.

ืœึดื›ืœื•ึนืœ
<%in pathspec %>

ื›ืœื•ืœ ืงื•ื‘ืฅ ืื—ืจ ืžื™ืœื” ื‘ืžื™ืœื” ื‘ืกืงืจื™ืคื˜ ื–ื”. ื”ืงื•ื‘ืฅ ื›ืœื•ืœ ื›ืืฉืจ ื”ืกืงืจื™ืคื˜
ืžื ื•ืชื— ื‘ืชื—ื™ืœื”.

EVAL
<%= ื‘ื™ื˜ื•ื™ %>

ืœื”ื“ืคื™ืก ืืช ื‘ื™ื˜ื•ื™ ื”ืงืœื™ืคื”. ืกื•ื›ืจ ืชื—ื‘ื™ืจื™ ืขื‘ื•ืจ "echo expr".

ืื™ืš
<%# ืชื’ื•ื‘ื” %>

ื—ืกื™ืžืช ืชื’ื•ื‘ื•ืช. ื›ืœ ื“ื‘ืจ ื‘ื‘ืœื•ืง ื”ืขืจื•ืช ืื™ื ื• ืžื ื•ืชื—. ื ื™ืชืŸ ืœืงื ืŸ ื”ืขืจื•ืช
ื•ื™ื›ื•ืœ ืœื”ื›ื™ืœ ืจื›ื™ื‘ื™ haserl ืื—ืจื™ื.

ื“ื•ื’ืžืื•ืช


ืื–ื”ืจื”
ื”ื“ื•ื’ืžืื•ืช ืฉืœื”ืœืŸ ืžืคื•ืฉื˜ื•ืช ื›ื“ื™ ืœื”ืจืื•ืช ื›ื™ืฆื“ ืœื”ืฉืชืžืฉ haserl. ืืชื” ืฆืจื™ืš ืœื”ื™ื•ืช
ื”ื™ื›ืจื•ืช ืขื ืื‘ื˜ื—ืช ืกืงืจื™ืคื˜ื™ื ื‘ืกื™ืกื™ืช ื‘ืื™ื ื˜ืจื ื˜ ืœืคื ื™ ื”ืฉื™ืžื•ืฉ haserl (ืื• ื›ืœ ืชืกืจื™ื˜
ืฉืคื”) ื‘ืกื‘ื™ื‘ืช ื™ื™ืฆื•ืจ.

ืคึผึธืฉืื•ึผื˜ ืคื™ืงื•ื“
#!/usr/local/bin/haserl
ืกื•ื’ ืชื•ื›ืŸ: ื˜ืงืกื˜/ืจื’ื™ืœ

<%# ื–ื”ื• ืกืงืจื™ืคื˜ "env" ืœื“ื•ื’ืžื” %>
<% env %>

ืžื“ืคื™ืก ืืช ื”ืชื•ืฆืื•ืช ืฉืœ env ื”ืคืงื•ื“ื” ื›ืžืกืžืš "ื˜ืงืกื˜/ืจื’ื™ืœ" ืžืกื•ื’ ืคื ื˜ื•ืžื™ืžืื™. ื–ื”
ืžื” ื”ื™ื haserl ื’ืจืกื” ืฉืœ ื”ื ืคื•ืฅ printenv cgi.

ืœื•ืœืื” ืขื ื“ื™ื ืžื™ ืชืคื•ืงื”
#!/usr/local/bin/haserl
ืกื•ื’ ืชื•ื›ืŸ: ื˜ืงืกื˜ / HTML




<% ืขื‘ื•ืจ ืฆื™ืืŸ ืื“ื•ื ื›ื—ื•ืœ ืฆื”ื•ื‘; ืœืขืฉื•ืช %>
"><% echo -n "$a" %>
<% ื‘ื•ืฆืข %>




ืฉื•ืœื— ืžืกืžืš ืžืกื•ื’ "ื˜ืงืกื˜/html" ืžืกื•ื’ "ื˜ืงืกื˜/html" ืœืœืงื•ื—, ืขื ื˜ื‘ืœืช HTML ืฉืœ ืขื
ืืœืžื ื˜ื™ื ื”ืžืกื•ืžื ื™ื ืขื ืฆื‘ืข ื”ืจืงืข.

ื”ืฉืชืžืฉ ืคึผึธื’ึธื– ืžื•ื’ื“ืจ ืคื•ื ืงืฆื™ื•ืช.
#!/usr/local/bin/haserl
ืกื•ื’ ืชื•ื›ืŸ: text/html

<% # ื”ื’ื“ืจ ืคื•ื ืงืฆื™ื™ืช ืžืฉืชืžืฉ
table_element() {
ื”ื“" $1 "
}
%>



<% ืขื‘ื•ืจ ืฆื™ืืŸ ืื“ื•ื ื›ื—ื•ืœ ืฆื”ื•ื‘; ืœืขืฉื•ืช %>
<% table_element $a %>
<% ื‘ื•ืฆืข %>




ื–ื”ื” ืœืขื™ืœ, ืื‘ืœ ืžืฉืชืžืฉ ื‘ืคื•ื ืงืฆื™ื™ืช ืžืขื˜ืคืช ื‘ืžืงื•ื html ืžื•ื˜ื‘ืข.

ืขืฆืžื™ ื”ืคื ื™ื” CGI ืขื a ื˜ื•ืคืก
#!/usr/local/bin/haserl
ืกื•ื’ ืชื•ื›ืŸ: text/html


ื˜ื•ืคืก ืœื“ื•ื’ืžื
" method="GET" style=";text-align:right;direction:rtl">
<% # ื‘ืฆืข ืื™ืžื•ืช ื‘ืกื™ืกื™ ืฉืœ FORM_textfield
# ื›ื“ื™ ืœืžื ื•ืข ื”ืชืงืคื•ืช ืื™ื ื˜ืจื ื˜ ื ืคื•ืฆื•ืช
FORM_textfield=$( echo "$FORM_textfield" | sed "s/[^A-Za-z0-9 ]//g")
%>
<input type=text name=textfield
Value="<% echo -n "$FORM_textfield" | tr az AZ %>" cols=20>




ืžื“ืคื™ืก ื˜ื•ืคืก. ืื ื”ืœืงื•ื— ืžื–ื™ืŸ ื˜ืงืกื˜ ื‘ื˜ื•ืคืก, ื”-CGI ื ื˜ืขืŸ ืžื—ื“ืฉ (ืžื•ื’ื“ืจ
by $SCRIPT_NAME) ื•ืฉื“ื” ื”ื˜ืงืกื˜ ืžื—ื•ื˜ื ื›ื“ื™ ืœืžื ื•ืข ื”ืชืงืคื•ืช ืื™ื ื˜ืจื ื˜, ื•ืื– ื”
ื”ื˜ื•ืคืก ืžื•ืฆื’ ืžื—ื“ืฉ ืขื ื”ื˜ืงืกื˜ ืฉื”ืžืฉืชืžืฉ ื”ื–ื™ืŸ. ื”ื˜ืงืกื˜ ื‘ืื•ืชื™ื•ืช ื’ื“ื•ืœื•ืช.

ื”ืขืœืื” a ืฉืœื—
#!/usr/local/bin/haserl --upload-limit=4096 --upload-dir=/ Tmp
ืกื•ื’ ืชื•ื›ืŸ: text/html


" method=POST enctype="multipart/form-data" style=";text-align:right;direction:rtl">



<% if test -n "$HASERL_uploadfile_path"; ื•ืื– %>

ื”ืขืœื™ืช ืงื•ื‘ืฅ ื‘ืฉื <% echo -n $FORM_uploadfile_name %> , ื•ื–ื” ื”ื™ื”
. ืžืื•ื—ืกืŸ ื‘ืื•ืคืŸ ื–ืžื ื™ ื‘ืฉืจืช ื‘ืชื•ืจ . ื”
ื”ืงื•ื‘ืฅ ื”ื™ื” <% cat $HASERL_uploadfile_path | wc -c %> ื‘ืชื™ื ื‘ืื•ืจืš.
<% rm -f $HASERL_uploadfile_path %> ืืœ ื“ืื’ื”, ื”ืงื•ื‘ืฅ ื ืžื—ืง ื–ื” ืขืชื”
ืžืฉืจืช ื”ืื™ื ื˜ืจื ื˜.
<% ืื—ืจ %>
ืขื“ื™ื™ืŸ ืœื ื”ืขืœื™ืช ืงื•ื‘ืฅ.
<% fi %>



ืžืฆื™ื’ ื˜ื•ืคืก ื”ืžืืคืฉืจ ื”ืขืœืืช ืงื‘ืฆื™ื. ื–ื” ืžื•ืฉื’ ืขืœ ื™ื“ื™ ืฉื™ืžื•ืฉ ื‘-
--ื”ืขืœืื”-ืžื’ื‘ืœื” ื•ืขืœ ื™ื“ื™ ื”ื’ื“ืจืช ื”ื˜ื•ืคืก ืื ืงื˜ื™ื™ืค ืœ ื ืชื•ื ื™ื ืžืจื•ื‘ื™ ื—ืœืงื™ื / ื˜ืคืกื™ื. ืื
ื”ืœืงื•ื— ืฉื•ืœื— ืงื•ื‘ืฅ, ื•ืื– ืžื•ื“ืคืก ืžื™ื“ืข ื›ืœืฉื”ื• ืœื’ื‘ื™ ื”ืงื•ื‘ืฅ, ื•ืœืื—ืจ ืžื›ืŸ
ื ืžื—ืง. ืื—ืจืช, ื”ื˜ื•ืคืก ืžืฆื™ื™ืŸ ืฉื”ืœืงื•ื— ืœื ื”ืขืœื” ืงื•ื‘ืฅ.

RFC-2616 ื”ืชืืžื”
#!/usr/local/bin/haserl
<% echo -en "content-type: text/html\r\n\r\n" %>

...


ื›ื“ื™ ืœื”ืชืื™ื ื‘ืื•ืคืŸ ืžืœื ืœืžืคืจื˜ HTTP, ื™ืฉ ืœืกื™ื™ื ืืช ื”ื›ื•ืชืจื•ืช ื‘ืืžืฆืขื•ืช
CR+LF, ื‘ืžืงื•ื ืกื™ื•ื ืงื• LF ืจื’ื™ืœ ืฉืœ ื™ื•ื ื™ืงืก ื‘ืœื‘ื“. ื”ืชื—ื‘ื™ืจ ืœืขื™ืœ ื™ื›ื•ืœ
ืœืฉืžืฉ ืœื™ื™ืฆื•ืจ ื›ื•ืชืจื•ืช ืชื•ืืžื•ืช RFC 2616.

ื”ืกื‘ื™ื‘ื”


ื‘ื ื•ืกืฃ ืœืžืฉืชื ื™ ื”ืกื‘ื™ื‘ื” ืฉืขื‘ืจื• ื‘ื™ืจื•ืฉื” ืžืฉืจืช ื”ืื™ื ื˜ืจื ื˜, ื”ื“ื‘ืจื™ื ื”ื‘ืื™ื
ืžืฉืชื ื™ ืกื‘ื™ื‘ื” ืžื•ื’ื“ืจื™ื ืชืžื™ื“ ื‘ืืชื—ื•ืœ:

HASERLVER
haserl ื’ืจืกื” - ืชื’ ืžื™ื“ืข.

SESSIONID
ืชื’ ื”ืงืกื“ืฆื™ืžืœื™ ื™ื™ื—ื•ื“ื™ ืœื›ืœ ื—ื™ื™ ื”-CGI (ื”ื•ื ื ื•ืฆืจ ื›ืืฉืจ
cgi ืžืชื—ื™ืœ; ื•ืื™ื ื• ืžืฉืชื ื” ืขื“ ืฉื ื•ืฆืจืช ืฉืื™ืœืชืช POST ืื• GET ื ื•ืกืคืช.)

HASERL_ACCEPT_ALL
ืื --ืงื‘ืœ ื”ื›ืœ ื”ื“ื’ืœ ื”ื•ืฆื‘, -1, ืื—ืจืช 0.

HASERL_SHELL
ื”ืฉื ืฉืœ ื”- shell haserl ื”ืชื—ื™ืœ ืœื”ืจื™ืฅ ืคืงื•ื“ื•ืช ืชืช-ืžืขื˜ืคืช.

HASERL_UPLOAD_DIR
ื”ืกืคืจื™ื™ื” haserl ืชืฉืชืžืฉ ื›ื“ื™ ืœืื—ืกืŸ ืงื‘ืฆื™ื ืฉื”ื•ืขืœื•.

HASERL_UPLOAD_LIMIT
ืžืกืคืจ ื”-KB ื”ืžื•ืชืจื™ื ืœื”ื™ืฉืœื— ืžื”ืœืงื•ื— ืœืฉืจืช.

ื ื™ืชืŸ ืœืฉื ื•ืช ืื• ืœื“ืจื•ืก ืžืฉืชื ื™ื ืืœื” ื‘ืชื•ืš ื”ืกืงืจื™ืคื˜, ืื ื›ื™ ืืœื”
ื”ืžืชื—ื™ืœ ื‘-"HASERL_" ื”ื ืื™ื ืคื•ืจืžื˜ื™ื‘ื™ื™ื ื‘ืœื‘ื“, ื•ืื™ื ื ืžืฉืคื™ืขื™ื ืขืœ ื”ืกืงืจื™ืคื˜ ื”ืคื•ืขืœ.

ื‘ื˜ื™ื—ื•ืช ืžืืคื™ื™ื ื™ื


ื™ืฉ ืกืคืจื•ืช ืจื‘ื” ืœื’ื‘ื™ ื”ืกื›ื ื•ืช ื‘ืฉื™ืžื•ืฉ ื‘-Shell ื›ื“ื™ ืœืชื›ื ืช ืกืงืจื™ืคื˜ื™ื ืฉืœ CGI.
haserl ืžื›ื™ืœ ื›ืžื” ื”ื’ื ื•ืช ื›ื“ื™ ืœื”ืคื—ื™ืช ืกื™ื›ื•ืŸ ื–ื”.

ืกื‘ื™ื‘ื” ืžืฉืชื ื™ื
ื”ืงื•ื“ ืœืื›ืœื•ืก ืžืฉืชื ื™ ื”ืกื‘ื™ื‘ื” ื ืžืฆื ืžื—ื•ืฅ ืœื˜ื•ื•ื— ืฉืœ ืชืช-
ืฆื“ืฃ. ื–ื” ืžื ืชื— ืืช ื”ื“ืžื•ื™ื•ืช? ื• &, ืื– ื–ื” ืงืฉื” ื™ื•ืชืจ ืœืœืงื•ื— ืœืขืฉื•ืช
ื”ืชืงืคื•ืช "ื–ืจื™ืงื”". ืœื“ื•ื’ืžื, foo.cgi?a=test;cat / etc / passwd ื™ื›ื•ืœ ืœื’ืจื•ื ืœ
ืœืžืฉืชื ื” ืžื•ืงืฆื” ื”ืขืจืš ืžื‘ื—ืŸ ื•ืื– ืชื•ืฆืื•ืช ื”ืจื™ืฆื” ื—ืชื•ืœ
/ etc / passwd ื ืฉืœื— ืœืœืงื•ื—. ื”ืืกืจืœ ื™ืงืฆื” ืœืžืฉืชื ื” ืืช ื”ืฉืœื
ืขืจืš: ืžื‘ื—ืŸ; ื—ืชื•ืœ / etc / passwd

ื–ื” ื‘ื˜ื•ื— ืœื”ืฉืชืžืฉ ื‘ืžืฉืชื ื” "ื”ืžืกื•ื›ืŸ" ื”ื–ื” ื‘ืกืงืจื™ืคื˜ื™ื ืฉืœ ืžืขื˜ืคืช ืขืœ ื™ื“ื™ ืกื’ื™ืจืชื•
ืฆื™ื˜ื•ื˜ื™ื; ืื ื›ื™ ื™ืฉ ืœื‘ืฆืข ืื™ืžื•ืช ื‘ื›ืœ ืฉื“ื•ืช ื”ืงืœื˜.

ื–ึฐื›ื•ึผืช ื ืฉืžื˜
ืื ืžื•ืชืงืŸ ื›ืกืงืจื™ืคื˜ suid, haserl ื™ืงื‘ืข ืืช ื”-uid/gid ืฉืœื• ืœื–ื” ืฉืœ ื”ื‘ืขืœื™ื ืฉืœ
ื”ืชืกืจื™ื˜. ื–ื” ื™ื›ื•ืœ ืœืฉืžืฉ ื›ื“ื™ ืœืงื‘ืœ ืงื‘ื•ืฆื” ืฉืœ ืกืงืจื™ืคื˜ื™ื CGI ืฉื™ืฉ ืœื”ื ืฉื•ื ื™ื
ื–ึฐื›ื•ึผืช. ืื ื” haserl ื‘ื™ื ืืจื™ ืœื ืžื•ืชืงืŸ suid, ืื– ืกืงืจื™ืคื˜ื™ื ืฉืœ CGI ื™ืขืฉื• ื–ืืช
ื”ืคืขืœ ืขื ื”-uid/gid ืฉืœ ืฉืจืช ื”ืื™ื ื˜ืจื ื˜.

ืœึดื“ื—ื•ึนืช ื”ืคืงื•ื“ื” ืงื• ืคืจืžื˜ืจื™ื ื ืชืŸ on ืžื” ื”ื™ื ื›ืชื•ื‘ืช ื”ืืชืจ
ืื ื›ืชื•ื‘ืช ื”ืืชืจ ืื™ื ื” ืžื›ื™ืœื” "=" ืœื ืžืงื•ื“ื“, ืžืคืจื˜ ื”-CGI ืžืฆื™ื™ืŸ ืืช ื”ืืคืฉืจื•ื™ื•ืช
ื™ืฉ ืœื”ืฉืชืžืฉ ื›ืคืจืžื˜ืจื™ื ืฉืœ ืฉื•ืจืช ื”ืคืงื•ื“ื” ืœืชื•ื›ื ื™ืช. ืœืžืฉืœ, ืœืคื™
ืœืžืคืจื˜ CGI: http://192.168.0.1/test.cgi?--upload-limit%3d2000&foo%3dbar
ืฆืจื™ืš ืœื”ื’ื“ื™ืจ ืืช ืžื’ื‘ืœืช ื”ื”ืขืœืื” ืœ-2000KB ื‘ื ื•ืกืฃ ืœื”ื’ื“ืจื” "Foo=bar". ืœื”ื’ืŸ
ื ื’ื“ ืœืงื•ื—ื•ืช ื”ืžืืคืฉืจื™ื ื”ืขืœืื•ืช ืžืฉืœื”ื, haserl ื“ื•ื—ื” ื›ืœ ืืคืฉืจื•ื™ื•ืช ืฉื•ืจืช ืคืงื•ื“ื”
ืžืขื‘ืจ ืœ-argv[2]. ืื ืžื•ืคืขืœ ื›-#! script, ื”ืžืชื•ืจื’ืžืŸ ื”ื•ื argv[0], ื”ื›ืœ
ืืคืฉืจื•ื™ื•ืช ืฉื•ืจืช ื”ืคืงื•ื“ื” ื”ืžืคื•ืจื˜ื•ืช ื‘-#! ืงื• ืžืฉื•ืœื‘ื™ื ืœืชื•ืš argv[1], ื•ื”-
ืฉื ื”ืกืงืจื™ืคื˜ ื”ื•ื argv[2].

LUA


ืื ื”ื™ื“ื•ืจ ืขื ืชืžื™ื›ืช lua, --shell=lua ื™ืืคืฉืจ ืืช lua ื›ืฉืคืช ื”ืกืงืจื™ืคื˜ ื‘ืžืงื•ื ื–ืืช
ืฉืœ ืงืœื™ืคืช bash. ืžืฉืชื ื™ ื”ืกื‘ื™ื‘ื” (SCRIPT_NAME, SERVER_NAME ื•ื›ื•') ืžืžื•ืงืžื™ื ื‘
ื˜ื‘ืœืช ENV, ื•ืžืฉืชื ื™ ื”ื˜ื•ืคืก ืžืžื•ืงืžื™ื ื‘ื˜ื‘ืœืช FORM. ืœื“ื•ื’ืžื”, ื”
ื˜ื•ืคืก ื”ืคื ื™ื” ืขืฆืžื™ ืœืขื™ืœ ื™ื›ื•ืœ ืœื”ื™ื›ืชื‘ ื›ืš:

#!/usr/local/bin/haserl --shell=lua
ืกื•ื’ ืชื•ื›ืŸ: text/html


ื˜ื•ืคืก ืœื“ื•ื’ืžื
" method="GET">
<% # ื‘ืฆืข ืื™ืžื•ืช ื‘ืกื™ืกื™ ืฉืœ FORM_textfield
# ื›ื“ื™ ืœืžื ื•ืข ื”ืชืงืคื•ืช ืื™ื ื˜ืจื ื˜ ื ืคื•ืฆื•ืช
FORM.textfield=string.gsub(FORM.textfield, "[^%a%d]", "")
%>
<input type=text name=textfield
Value="<% io.write (string.upper(FORM.textfield)) %>" cols=20>




ื”ืื•ืคืจื˜ื•ืจ <%= ืžื™ื•ืขื“ ืœืกื•ื›ืจ ืชื—ื‘ื™ืจื™ io.write (ื˜ื•ืกื˜ืจ( ... )) ืื–, ืœืžืฉืœ, ื”
ื ื™ืชืŸ ืœื›ืชื•ื‘ ืืช ื”ืฉื•ืจื” Value= ืœืžืขืœื”: ืขืจืš="<%= string.upper(FORM.textfield) %>" cols=20>

ืกืงืจื™ืคื˜ื™ื ืฉืœ haserl lua ื™ื›ื•ืœื™ื ืœื”ืฉืชืžืฉ ื‘ืคื•ื ืงืฆื™ื” haserl.loadfile(ืฉื ื”ืงื•ื‘ืฅ) ืœืขื‘ื“ ื™ืขื“
ืกืงืจื™ืคื˜ ื›ื›ืชื‘ haserl (lua). ื”ืคื•ื ืงืฆื™ื” ืžื—ื–ื™ืจื” ืกื•ื’ ืฉืœ "ืคื•ื ืงืฆื™ื”".

ืœื“ื•ื’ืžื”,

bar.lsp
<% io.write ("ืฉืœื•ื ืขื•ืœื") %>

ื”ื”ื•ื“ืขื” ืฉืœืš ื”ื™ื <%= gvar %>

-- ืกื•ืฃ ืงื•ื‘ืฅ ื›ืœื•ืœ --

foo.haserl
#!/usr/local/bin/haserl --shell=lua
<% m = haserl.loadfile("bar.lsp")
gvar = "ื”ืคืขืœ ื›-m()"
M()

gvar = "ื˜ืขืŸ ื•ื”ืคืขืœ ื‘ืฆืขื“ ืื—ื“"
haserl.loadfile("bar.lsp")()
%>

ืจื™ืฆื” Foo ื™ืคื™ืง:

ืฉืœื•ื ืขื•ืœื
ื”ื”ื•ื“ืขื” ืฉืœืš ืžื•ืคืขืœืช ื›-m()
-- ืกื•ืฃ ืงื•ื‘ืฅ ื›ืœื•ืœ --
ืฉืœื•ื ืขื•ืœื
ื”ื”ื•ื“ืขื” ืฉืœืš ื”ื™ื ื˜ืขืŸ ื•ื”ืคืขืœ ื‘ืฉืœื‘ ืื—ื“
-- ืกื•ืฃ ืงื•ื‘ืฅ ื›ืœื•ืœ --

ืคื•ื ืงืฆื™ื” ื–ื• ืžืืคืฉืจืช ืœืงื‘ืœ ื“ืคื™ ืฉืจืช haserl ืžืงื•ื ื ื™ื - ืงื˜ืขื™ ืขืžื•ื“ื™ื
ืฉืžืขื•ื‘ื“ื™ื ืขืœ ื™ื“ื™ ื”- haserl tokenizer.

LUAC


ืืœ ื”ืื ื™ ืœื•ืืง "ืงืœื™ืคื”" ื”ื™ื ื ืชื— ืœื•ืื” ืžืฉื•ื“ืจ ืžืจืืฉ, ืื– ืขืจื™ื›ื” ื•ื‘ื“ื™ืงื” ืื™ื ื˜ืจืืงื˜ื™ื‘ื™ืช ืฉืœ ืกืงืจื™ืคื˜ื™ื
ื‘ืœืชื™ ืืคืฉืจื™. ืขื ื–ืืช, ื ื™ืชืŸ ืœื”ืจื›ื™ื‘ haserl ืขื ืชืžื™ื›ืช luac ื‘ืœื‘ื“, ื•ื–ื” ืžืืคืฉืจ
ืชืžื™ื›ื” ื‘-lua ืืคื™ืœื• ื‘ืกื‘ื™ื‘ืช ื–ื™ื›ืจื•ืŸ ืงื˜ื ื”. ื›ืœ ืชื›ื•ื ื•ืช haserl lua ื”ืžืคื•ืจื˜ื•ืช ืœืขื™ืœ ื”ืŸ
ืขื“ื™ื™ืŸ ืคื ื•ื™. (ืื luac ื”ื™ื ื”ืžืขื˜ืคืช ื”ื™ื—ื™ื“ื” ื”ืžื•ื‘ื ื™ืช ื‘-haserl, ื”ืงื•ื‘ืฅ haserl.load ื”ื•ื
ืžื•ืฉื‘ืช, ืžื›ื™ื•ื•ืŸ ืฉืžื ืชื— haserl ืื™ื ื• ื”ื™ื“ื•ืจ.)

ื”ื ื” ื“ื•ื’ืžื” ืœืกืงืจื™ืคื˜ ื˜ืจื™ื•ื•ื™ืืœื™, ืฉื”ื•ืžืจ ืœืกืงืจื™ืคื˜ luac cgi:

ื‘ื”ืชื—ืฉื‘ ื‘ืงื•ื‘ืฅ test.lua:
ื”ื“ืคืก ("ืกื•ื’ ืชื•ื›ืŸ: ื˜ืงืกื˜/ืจื’ื™ืœ0)
ื”ื“ืคืก ("ื”-UUID ืฉืœืš ืขื‘ื•ืจ ืจื™ืฆื” ื–ื• ื”ื•ื: " .. ENV.SESSIONID)

ื ื™ืชืŸ ืœื”ืจื›ื™ื‘ ืื•ืชื• ืขื luac:
luac -o test.luac -s test.lua

ื•ืื– ื”ื›ื•ืชืจืช ืฉืœ haserl ื”ื•ืกื™ืคื” ืœื–ื”:
echo '#!/usr/bin/haserl --shell=luac' | cat - test.luac >luac.cgi

ืœื—ืœื•ืคื™ืŸ, ื ื™ืชืŸ ืœืคืชื— ืืชืจ ืฉืœื ื‘ืืžืฆืขื•ืช ื”-lua shell ื”ืกื˜ื ื“ืจื˜ื™ืช,
ื•ืœืื—ืจ ืžื›ืŸ ืชื‘ืงืฉ ืž-haserl ืขืฆืžื” ืœืขื‘ื“ ืžืจืืฉ ืืช ื”ืกืงืจื™ืคื˜ื™ื ืขื‘ื•ืจ ืžื”ื“ืจ luac ื›ื—ืœืง ืž-a
ืชื”ืœื™ืš ื‘ื ื™ื™ื”. ืœืฉื ื›ืš, ื”ืฉืชืžืฉ ื‘--shell=lua, ื•ืคืชื— ืืช ื”ืืชืจ. ื›ืฉืžื•ื›ื ื™ื ืœื‘ื ื•ืช
ืกื‘ื™ื‘ืช ื–ืžืŸ ื”ืจื™ืฆื”, ื”ื•ืกืฃ ืืช ืฉื•ืจืช --debug ืœืกืงืจื™ืคื˜ื™ื ืฉืœ lua ืฉืœืš, ื•ื”ืคืขืœ ืื•ืชื ื‘ืคืœื˜
ื”ืชื•ืฆืื•ืช ืœืงื‘ืฆื™ ืžืงื•ืจ .lua. ืœื“ื•ื’ืžื”:

ื‘ื”ืชื—ืฉื‘ ื‘ืกืงืจื™ืคื˜ haserl test.cgi:
#!/usr/bin/haserl --shell=lua --debug
ืกื•ื’ ืชื•ื›ืŸ: ื˜ืงืกื˜ / ืจื’ื™ืœ

ื”-UUID ืฉืœืš ืขื‘ื•ืจ ืจื™ืฆื” ื–ื• ื”ื•ื <%= ENV.SESSIONID %>

ื”ื™ื“ื•ืจ ืžืงื“ื™ื, ืงื•ืžืคื™ืœ ื•ื”ื•ืกืฃ ืืช ื”ื›ื•ืชืจืช haserl luac:
./test.cgi > test.lua
luac -s -o test.luac test.lua
echo '#!/usr/bin/haserl --shell=luac' | cat - test.luac >luac.cgi

ื”ืฉืชืžืฉ ื‘-haserl ื‘ืื™ื ื˜ืจื ื˜ ื‘ืืžืฆืขื•ืช ืฉื™ืจื•ืชื™ onworks.net


ืฉืจืชื™ื ื•ืชื—ื ื•ืช ืขื‘ื•ื“ื” ื‘ื—ื™ื ื

ื”ื•ืจื“ ืืคืœื™ืงืฆื™ื•ืช Windows & Linux

  • 1
    Phaser
    Phaser
    Phaser ื”ื™ื ืคืชื™ื—ื” ืžื”ื™ืจื”, ื—ื™ื ืžื™ืช ื•ืžื”ื ื”
    ืžืกื’ืจืช ืžืฉื—ืง ืžืงื•ืจ HTML5 ืฉืžืฆื™ืขื”
    ืขื™ื‘ื•ื“ WebGL ื•-Canvas ืœืจื•ื—ื‘
    ื“ืคื“ืคื ื™ ืื™ื ื˜ืจื ื˜ ืฉื•ืœื—ื ื™ื™ื ื•ื ื™ื™ื“ื™ื. ืžืฉื—ืงื™ื
    ื™ื›ื•ืœ ืœื”ื™ื•ืช ืฉื•ืชืฃ...
    ื”ื•ืจื“ ืืช Phaser
  • 2
    ืžื ื•ืข VASSAL
    ืžื ื•ืข VASSAL
    VASSAL ื”ื•ื ืžื ื•ืข ืžืฉื—ืง ืœื™ืฆื™ืจื”
    ื’ืจืกืื•ืช ืืœืงื˜ืจื•ื ื™ื•ืช ืฉืœ ืœื•ื— ืžืกื•ืจืชื™
    ื•ืžืฉื—ืงื™ ืงืœืคื™ื. ื–ื” ืžืกืคืง ืชืžื™ื›ื” ืขื‘ื•ืจ
    ืขื™ื‘ื•ื“ ื•ืื™ื ื˜ืจืืงืฆื™ื” ืฉืœ ื—ืœืงื™ ืžืฉื—ืง,
    ื•...
    ื”ื•ืจื“ ืืช VASSAL Engine
  • 3
    OpenPDF - Fork of iText
    OpenPDF - Fork of iText
    OpenPDF ื”ื™ื ืกืคืจื™ื™ืช Java ืœื™ืฆื™ืจื”
    ื•ืขืจื™ื›ืช ืงื‘ืฆื™ PDF ืขื LGPL ื•
    ืจื™ืฉื™ื•ืŸ ืงื•ื“ ืคืชื•ื— MPL. OpenPDF ื”ื•ื ื”
    ื™ื•ืจืฉ ื”ืงื•ื“ ื”ืคืชื•ื— LGPL/MPL ืฉืœ iText,
    ...
    ื”ื•ืจื“ ืืช OpenPDF - Fork of iText
  • 4
    SAGA GIS
    SAGA GIS
    SAGA - ืžืขืจื›ืช ืœืื•ื˜ื•ืžื˜ื™ื•ืช
    ื ื™ืชื•ื—ื™ื ื’ื™ืื•ื’ืจืคื™ื™ื - ื”ื•ื ื’ื™ืื•ื’ืจืคื™
    ืชื•ื›ื ืช ืžืขืจื›ืช ืžื™ื“ืข (GIS) ืขื
    ื™ื›ื•ืœื•ืช ืขืฆื•ืžื•ืช ืœื’ื™ืื•ื“ื˜ื”
    ืขื™ื‘ื•ื“ ื•ืื ื”...
    ื”ื•ืจื“ ืืช SAGA GIS
  • 5
    ืืจื’ื– ื›ืœื™ื ืขื‘ื•ืจ Java/JTOpen
    ืืจื’ื– ื›ืœื™ื ืขื‘ื•ืจ Java/JTOpen
    ืืจื’ื– ื”ื›ืœื™ื ืฉืœ IBM ืขื‘ื•ืจ Java / JTOpen ื”ื•ื ื
    ืกืคืจื™ื™ืช ืžื—ืœืงื•ืช Java ื”ืชื•ืžื›ื•ืช ื‘
    ืชื›ื ื•ืช ืœืงื•ื—/ืฉืจืช ื•ืื™ื ื˜ืจื ื˜
    ื“ื’ืžื™ื ืœืžืขืจื›ืช ืขื OS/400,
    i5/OS, o...
    ื”ื•ืจื“ ืืช ืืจื’ื– ื”ื›ืœื™ื ืขื‘ื•ืจ Java/JTOpen
  • 6
    D3.js
    D3.js
    D3.js (ืื• D3 ืขื‘ื•ืจ ืžืกืžื›ื™ื ืžื‘ื•ืกืกื™ ื ืชื•ื ื™ื)
    ื”ื™ื ืกืคืจื™ื™ืช JavaScript ื”ืžืืคืฉืจืช ืœืš
    ืœื™ื™ืฆืจ ื ืชื•ื ื™ื ื“ื™ื ืžื™ื™ื ื•ืื™ื ื˜ืจืืงื˜ื™ื‘ื™ื™ื
    ื”ื“ืžื™ื•ืช ื‘ื“ืคื“ืคื ื™ ืื™ื ื˜ืจื ื˜. ืขื D3
    ืืชื”...
    ื”ื•ืจื“ ืืช D3.js
  • ืขื•ื“ ยป

ืคืงื•ื“ื•ืช ืœื™ื ื•ืงืก

Ad