ืื ืืคืงืืื 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