์ด๊ฒ์ Ubuntu Online, Fedora Online, Windows ์จ๋ผ์ธ ์๋ฎฌ๋ ์ดํฐ ๋๋ MAC OS ์จ๋ผ์ธ ์๋ฎฌ๋ ์ดํฐ์ ๊ฐ์ ์ฌ๋ฌ ๋ฌด๋ฃ ์จ๋ผ์ธ ์ํฌ์คํ ์ด์ ์ค ํ๋๋ฅผ ์ฌ์ฉํ์ฌ OnWorks ๋ฌด๋ฃ ํธ์คํ ๊ณต๊ธ์์์ ์คํํ ์ ์๋ ๋ช ๋ น haserl์ ๋๋ค.
ํ๋ก๊ทธ๋จ:
์ด๋ฆ
haserl - ์๋ฒ ๋๋ ํ๊ฒฝ์ ์ํ cgi ์คํฌ๋ฆฝํ ํ๋ก๊ทธ๋จ
๊ฐ์
#!/usr/bin/haserl [--์=๊ฒฝ๋ก ์ฌ์] [--์ ๋ก๋-๋๋ ํ ๋ฆฌ=๋๋ ํ ๋ฆฌ] [--์ ๋ก๋ ํธ๋ค๋ฌ=๋งค๋์ ]
[--์ ๋ก๋ ์ ํ=์ ํ] [--๋ชจ๋ ๊ฒ์ ๋ฐ์ ๋ค์ธ๋ค] [--์๋ฝ ์์] [--์กฐ์ฉํ] [--๋๋ฒ๊ทธ]
[ ํ ์คํธ ] [ <% ์ ์คํฌ๋ฆฝํธ %> ] [ ํ ์คํธ ] ...
๊ธฐ์
Haserl์ "PHP" ์คํ์ผ์ cgi ํ๋ก๊ทธ๋๋ฐ์ ํ์ฉํ๋ ์์ cgi ๋ํผ์ด์ง๋ง UNIX๋ฅผ ์ฌ์ฉํฉ๋๋ค.
bash์ ๊ฐ์ ์ ธ ๋๋ Lua๋ฅผ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก ์ฌ์ฉํฉ๋๋ค. ๋งค์ฐ ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์๋ฒ ๋๋ ํ๊ฒฝ ๋๋ PHP์ ๊ฐ์ ๊ฒ์ด ๋๋ฌด ํฐ ๊ฒฝ์ฐ.
์ธ ๊ฐ์ง ๊ธฐ๋ฅ์ ์์ cgi ์์ง์ ๊ฒฐํฉํฉ๋๋ค.
POST ๋ฐ GET ์์ฒญ์ ๊ตฌ๋ฌธ ๋ถ์ํ์ฌ ์์ ์์๋ฅผ ์ด๋ฆ=๊ฐ ์์ผ๋ก
์ฌ์ฉํ CGI ์คํฌ๋ฆฝํธ์ ํ๊ฒฝ์ ๋๋ค. ์ด๊ฒ์ ๋ค์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ์ด๊ธฐ ์ธ๊ฐ.
์์ ์ด๊ณ ๋ชจ๋ ํ ์คํธ๋ฅผ ์ธ์ ๊ฐ๋ฅํ ๋ช ๋ น๋ฌธ์ผ๋ก ๋ณํํฉ๋๋ค. ๋ชจ๋ ํ ์คํธ
<% ... %> ๋ด ๊ตฌ์ฑ์ ๊ทธ๋๋ก ์์ ์ ๋ฌ๋ฉ๋๋ค. ์ด๊ฒ์ ๋ค์
๊ธ์ฐ๊ธฐ์ฒ๋ผ PHP ์คํฌ๋ฆฝํธ.
์ ํ์ ์ผ๋ก ์ค์นํ์ฌ ์คํฌ๋ฆฝํธ ์์ ์์๊ฒ ๊ถํ์ ๋ถ์ฌํ ์ ์์ต๋๋ค.
์ผ๋ถ ๋ณด์ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ์์ or cgiwrapper.
์ต์ ๊ฐ์
๋ค์์ ๋ช ๋ น์ค ์ต์ ์ ๋ํ ์์ฝ์ ๋๋ค. ์ฐธ์กฐํ์ญ์์ค ์ต์ ์๋ ์น์
์์ ํ ์ค๋ช ์ ์ํ ๊ธด ์ต์ ์ด๋ฆ.
-a --์๋ฝ ๋ชจ๋
-n --์๋ฝ ์์
-d --๋๋ฒ๊ทธ
-s, --์
-S, --์นจ๋ฌต
-U, --์ ๋ก๋-๋๋ ํฐ๋ฆฌ
-u, --์ ๋ก๋ ์ ํ
-H, --์ ๋ก๋ ํธ๋ค๋ฌ
์ต์
--๋ชจ๋ ๊ฒ์ ๋ฐ์ ๋ค์ธ๋ค
ํ๋ก๊ทธ๋จ์ ์ผ๋ฐ์ ์ผ๋ก REQUEST_METHOD๊ฐ POST์ด๊ณ
REQUEST_METHOD๊ฐ GET์ธ ๊ฒฝ์ฐ์๋ง URL ๋ฐ์ดํฐ์ ๋ฐ์ดํฐ๋ฅผ ์๋ฝํฉ๋๋ค. ์ด ์ต์
REQUEST_METHOD์ ๊ด๊ณ์์ด POST ๋ฐ URL ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ํ์ฉํฉ๋๋ค.
์ด ์ต์ ์ด ์ค์ ๋๋ฉด REQUEST_METHOD๊ฐ ์ฐ์ ํฉ๋๋ค(์: ๋ฉ์๋๊ฐ
๋ POST์ด๊ณ FORM_variables๋ COOKIE ๋ฐ์ดํฐ, GET ๋ฐ์ดํฐ ๋ฐ POST ๋ฐ์ดํฐ์์ ๊ฐ์ ธ์ต๋๋ค.
๊ทธ ์ฃผ๋ฌธ. ๋ฉ์๋๊ฐ GET์ธ ๊ฒฝ์ฐ FORM_variables๋ COOKIE ๋ฐ์ดํฐ์์ ๊ฐ์ ธ์ค๊ณ POST
๋ฐ์ดํฐ ๋ฐ GET ๋ฐ์ดํฐ.) ๊ธฐ๋ณธ๊ฐ์ ๋ชจ๋ ์ ๋ ฅ ๋ฐฉ๋ฒ์ ํ์ฉํ์ง ์๋ ๊ฒ์ ๋๋ค.
COOKIE ๋ฐ์ดํฐ ๋ฐ REQUEST_METHOD.
--์๋ฝ ์์
์ฃผ์ด์ง ๊ฒฝ์ฐ haserl์ ์ฒ๋ฆฌํ๊ธฐ ์ ์ ํ์ค ์ ๋ ฅ์ http ์ฝํ ์ธ ๋ก ๊ตฌ๋ฌธ ๋ถ์ํ์ง ์์ต๋๋ค.
๋๋ณธ. ์ด๊ฒ์ ๋ค๋ฅธ haserl ์คํฌ๋ฆฝํธ์์ haserl ์คํฌ๋ฆฝํธ๋ฅผ ํธ์ถํ๋ ๊ฒฝ์ฐ์ ์ ์ฉํฉ๋๋ค.
-๋๋ฒ๊ทธ
์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๋ ๋์ ์คํํ ์คํฌ๋ฆฝํธ๋ฅผ ์ถ๋ ฅํฉ๋๋ค. ๋ง์ฝ์
ํ๊ฒฝ ๋ณ์ 'REQUEST_METHOD'๊ฐ ์ค์ ๋๋ฉด ๋ฐ์ดํฐ๊ฐ
์ผ๋ฐ/ํ ์คํธ ์ฝํ ์ธ ์ ํ. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ ธ ์คํฌ๋ฆฝํธ๊ฐ ๊ทธ๋๋ก ์ธ์๋ฉ๋๋ค.
--์=๊ฒฝ๋ก ์ฌ์
์ฌ์ฉํ ๋์ฒด bash์ ์ ์ฌํ ์ ธ์ ์ง์ ํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ "/ ๋น / SH"
์ ธ ๋งค๊ฐ๋ณ์๋ฅผ ํฌํจํ๋ ค๋ฉด --shell=์ ์ฌ์ฉํ์ง ๋ง์ญ์์ค./ ๋น / SH ์ฒด์ฌ. ๋์ ๋ค์์ ์ฌ์ฉํ์ญ์์ค.
--shell "์์์ ๊ฐ์ด "="๊ฐ ์๋ ๋์ฒด ํ์/ bin / bash --norc". ๋ฐ๋์
ํน์ ๋ฌธ์๋ฅผ ๋ณดํธํ๋ ค๋ฉด ์ต์ ๋ฌธ์์ด์ ์ธ์ฉํ์ญ์์ค.
Lua ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ปดํ์ผ๋ ๊ฒฝ์ฐ "lua" ๋ฌธ์์ด์ ํตํฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
๋ฃจ์ vm. ์ด ๋ฌธ์์ด์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์: --์=๋ฃจ์
๋์์ "luac"์ ๋๋ค. ์ด๋ก ์ธํด haserl ๋ฐ lua ํ์๊ฐ ๋นํ์ฑํ๋ฉ๋๋ค.
์คํฌ๋ฆฝํธ๋ ๋ฏธ๋ฆฌ ์ปดํ์ผ๋ lua ์ฒญํฌ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค. ๋ณด๋ค ๋ฃจ์ ์์ธํ ๋ด์ฉ์ ์๋
์ ๋ณด.
--์กฐ์ฉํ
Haserl์ ์ผ๋ฐ์ ์ผ๋ก ์ค๋ฅ ์กฐ๊ฑด์ ๋ํ ์ ๋ณด ๋ฉ์์ง๋ฅผ ์ธ์ํฉ๋๋ค. ์ด๊ฒ
์ค๋ฅ ๋ฉ์์ง๋ฅผ ์ต์ ํ์ฌ haserl ์ฌ์ฉ์ด ๊ด๊ณ ๋์ง ์๋๋ก ํฉ๋๋ค.
--์ ๋ก๋-๋๋ ํ ๋ฆฌ=๋๋ ํ ๋ฆฌ
๊ธฐ๋ณธ๊ฐ์ "/ TMP". ์ ๋ก๋๋ ๋ชจ๋ ํ์ผ์ ์์ ํ์ผ ์ด๋ฆ์ผ๋ก ์์ฑ๋ฉ๋๋ค.
์๋ฐฐ ๊ท์น์ HASERL_xxx_๊ฒฝ๋ก ์์ ํ์ผ์ ์ด๋ฆ์ ํฌํจํฉ๋๋ค. FORM_xxx_์ด๋ฆ
ํด๋ผ์ด์ธํธ์์ ์ง์ ํ ํ์ผ์ ์๋ ์ด๋ฆ์ ํฌํจํฉ๋๋ค.
--์ ๋ก๋ ํธ๋ค๋ฌ=๊ฒฝ๋ก ์ฌ์
์ง์ ํ๋ฉด ํ์ผ ์ ๋ก๋๊ฐ ๊ธฐ๋ก๋์ง ์๊ณ ์ด ํธ๋ค๋ฌ์ ์ํด ์ฒ๋ฆฌ๋ฉ๋๋ค.
์์ ํ์ผ. ์ ์ฒด ๊ฒฝ๋ก ์ฌ์์ ์ ๊ณตํด์ผ ํฉ๋๋ค(PATH๋ ๊ฒ์๋์ง ์์).
์ ๋ก๋ ํธ๋ค๋ฌ์๋ ํ๋์ ๋ช ๋ น์ค ๋งค๊ฐ๋ณ์๊ฐ ์ ๊ณต๋ฉ๋๋ค.
์ ๋ก๋ ํ์ผ์ด ์ ์ก๋ฉ๋๋ค. ๋ํ ํธ๋ค๋ฌ๋ 3
ํ๊ฒฝ ๋ณ์: ์ปจํ ์ธ ํ์ , ํ์ผ ์ด๋ฆ๋ฐ ์ด๋ฆ. ์ด๋ค์ MIME์ ๋ฐ์ํฉ๋๋ค.
์ฝํ ์ธ ์ ๋ํ ์ฝํ ์ธ ์ฒ๋ฆฌ ํค๋์ ๋๋ค. Haserl์ ๊ฐ๊ฐ์ ๋ํด ํธ๋ค๋ฌ๋ฅผ ํฌํฌํฉ๋๋ค.
ํ์ผ์ด ์ ๋ก๋๋๊ณ ์ ๋ก๋ ํ์ผ์ ๋ด์ฉ์ ์ง์ ๋ FIFO๋ก ๋ณด๋ ๋๋ค.
๊ทธ๋ฌ๋ฉด Haserl์ ์ฒ๋ฆฌ๊ธฐ๊ฐ ์ข ๋ฃ๋ ๋๊น์ง ์ฐจ๋จํฉ๋๋ค. ์ด ๋ฐฉ๋ฒ์ ์ ๋ฌธ๊ฐ๋ฅผ ์ํ ๊ฒ์ ๋๋ค.
๋ก ์์ฑ๋์ด์ผ ํฉ๋๋ค.
--์ ๋ก๋ ์ ํ=์ ํ
MIME ์ธ์ฝ๋ฉ ํ์ผ์ ์ต๋ ํ์ฉ ์ ํ KB ์ ๋ก๋ ์์ . ๊ธฐ๋ณธ๊ฐ์ 0KB (์๋์ค
์ ๋ก๋ ํ์ฉ). MIME ์ธ์ฝ๋ฉ์ ๋ฐ์ดํฐ ํฌ๊ธฐ์ 33%๋ฅผ ์ถ๊ฐํฉ๋๋ค.
๊ฐ์ OF ์ด์
์ผ๋ฐ์ ์ผ๋ก ์น ์๋ฒ๋ ์ฌ๋ฌ ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ ํ ๋ค์ ์ฌ์ฉํฉ๋๋ค. ํฌํฌ or
CGI ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๋ ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ. ์คํฌ๋ฆฝํธ๊ฐ ๋ค์์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ํ์ ํต์ญ์ฌ,
๋ค์์ด ๋ฐ์ํฉ๋๋ค.
If ํ์ suid ๋ฃจํธ๊ฐ ์ค์น๋๋ฉด uid/gid๊ฐ ์คํฌ๋ฆฝํธ ์์ ์๋ก ์ค์ ๋ฉ๋๋ค.
ํ๊ฒฝ์ด ์ค์บ๋ฉ๋๋ค. HTTP_์ฟ ํค, ์น์์ ์ค์ ํ์ ์ ์์
์ฌ๊ธฐ๋ ์ฌ๋. ์กด์ฌํ๋ ๊ฒฝ์ฐ ๊ตฌ๋ฌธ ๋ถ์๋ ๋ด์ฉ์ด ๋ก์ปฌ ํ๊ฒฝ์ ๋ฐฐ์น๋ฉ๋๋ค.
ํ๊ฒฝ์ด ์ค์บ๋ฉ๋๋ค. ์์ฒญํ๊ธฐ, ์น ์๋ฒ์ ์ํด ์ค์ ๋์์ต๋๋ค.
์์ฒญ ๋ฐฉ๋ฒ์ ๋ฐ๋ผ ํ์ค ์ ๋ ฅ์ ์ฝ๊ณ ๊ตฌ๋ฌธ ๋ถ์ํฉ๋๋ค. ํ์ฑ๋
์ฝํ ์ธ ๋ ๋ก์ปฌ ํ๊ฒฝ์ ๋ฐฐ์น๋ฉ๋๋ค.
์คํฌ๋ฆฝํธ๋ ํ ํฐํ๋์ด ๊ตฌ๋ฌธ ๋ถ์๋ฉ๋๋ค. ํ์ ์์ ํ ์คํธ์ ์ฝ๋ ๋ธ๋ก. ์์ ํ ์คํธ๋
"echo" ๋ฌธ์ผ๋ก ๋ณํ๋ ๋ค์ ๋ชจ๋ ํ ํฐ์ด ํ์ ์ ธ๋ก ์ ์ก๋ฉ๋๋ค.
ํ์ ํฌํฌ ๋ฐ ํ์ ์(์ผ๋ฐ์ ์ผ๋ก / ๋น / SH)์ด ์์๋ฉ๋๋ค.
๋ชจ๋ ํ ํฐ์ ํํ๊ณผ ํจ๊ป ํ์ ์ ธ์ STDIN์ผ๋ก ์ ์ก๋ฉ๋๋ค. ์ถ๊ตฌ ๋ช ๋ น.
ํ์ ์ ธ์ด ์ข ๋ฃ๋๋ฉด ํ์ ํต์ญ์ฌ๋ ์ต์ข ์ ๋ฆฌ๋ฅผ ์ํํ๊ณ
๊ทธ๋ฐ ๋ค์ ์ข ๋ฃํฉ๋๋ค.
๊ณ ๊ฐ ์ธก๋ฉด ์ ๋ ฅ
XNUMXD๋ดํ์ ํ์ ์ธํฐํ๋ฆฌํฐ๋ HTTP_COOKIE ํ๊ฒฝ ๋ณ์๋ฅผ ํตํด ์ ์ก๋ ๋ฐ์ดํฐ๋ฅผ ๋์ฝ๋ฉํ๊ณ
ํด๋ผ์ด์ธํธ์์ GET ๋๋ POST ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ณ ์ด๋ฅผ ํ๊ฒฝ ๋ณ์๋ก ์ ์ฅํ์ฌ
haserl์ ์ํด ์ก์ธ์ค๋ฉ๋๋ค. ๋ณ์์ ์ด๋ฆ์ ์์ค์ ์ฃผ์ด์ง ์ด๋ฆ์ ๋ฐ๋ฆ ๋๋ค.
์ ๋์ฌ( FORM_)๊ฐ ๋ถ์ต๋๋ค. ์๋ฅผ ๋ค์ด, ํด๋ผ์ด์ธํธ๊ฐ "foo=bar"๋ฅผ ๋ณด๋ธ๋ค๋ฉด,
ํ๊ฒฝ ๋ณ์๋ FORM_foo=๋ฐ.
HTTP_COOKIE ๋ฉ์๋์ ๊ฒฝ์ฐ ๋ณ์๋ ์ ๋์ฌ( COOKIE_) ์ถ๊ฐํ์ต๋๋ค.
์๋ฅผ ๋ค์ด HTTP_COOKIE์ "foo=bar"๊ฐ ํฌํจ๋ ๊ฒฝ์ฐ ํ๊ฒฝ ๋ณ์๋
COOKIE_foo=๋ฐ.
GET ๋ฉ์๋์ ๊ฒฝ์ฐ %xx ํ์์ผ๋ก ์ ์ก๋ ๋ฐ์ดํฐ๋ ํด๋น ๋ฌธ์๋ก ๋ณํ๋ฉ๋๋ค.
๋ํ๋ด๊ณ ๋ณ์๋ ์ ๋์ฌ( ๋ฐ๋ก_) ์ถ๊ฐํ์ต๋๋ค. ์๋ฅผ ๋ค์ด,
QUERY_STRING์๋ "foo=bar"๊ฐ ํฌํจ๋๋ฉฐ ํ๊ฒฝ ๋ณ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. GET_foo=๋ฐ.
POST ๋ฉ์๋์ ๊ฒฝ์ฐ ๋ณ์๋ ์ ๋์ฌ( POST_) ์ถ๊ฐํ์ต๋๋ค. ์ ์ํ
์๋ฅผ ๋ค์ด ํฌ์คํธ ์คํธ๋ฆผ์ "foo=bar"๊ฐ ํฌํจ๋ ๊ฒฝ์ฐ ํ๊ฒฝ ๋ณ์๋ POST_foo=๋ฐ.
๋ํ POST ๋ฐฉ์์ ๊ฒฝ์ฐ ๋ค์์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ ๊ฒฝ์ฐ ๋ฉํฐ ํํธ / ์์ ๋ฐ์ดํฐ ์ธ์ฝ๋ฉ,
๋ฐ์ดํฐ๊ฐ ์๋์ผ๋ก ๋์ฝ๋ฉ๋ฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์น์์ ํ์ผ์ ์ ๋ก๋ํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
์ฌ์ฉํ๋ ํด๋ผ์ด์ธํธ .
์ฃผ์์ฌํญ ํ์ผ์ด ์น ์๋ฒ์ ์ ๋ก๋๋๋ฉด ๋ค์ ์์น์ ์ ์ฅ๋ฉ๋๋ค. ์ ๋ก๋ ๋๋ ํฐ๋ฆฌ
๋๋ ํ ๋ฆฌ. FORM_๋ณ์_์ด๋ฆ= ์ ๋ก๋๋ ํ์ผ์ ์ด๋ฆ์ ํฌํจํฉ๋๋ค(์:
ํด๋ผ์ด์ธํธ๊ฐ ์ง์ ํฉ๋๋ค.) HASERL_variable_path= ํ์ผ์ ์ด๋ฆ์ ํฌํจ
์ ๋ก๋ ๋๋ ํฐ๋ฆฌ ์ ๋ก๋๋ ์ฝํ ์ธ ๋ฅผ ๋ณด์ ํ๊ณ ์์ต๋๋ค. ์ ์์ ์ธ ํด๋ผ์ด์ธํธ๋ฅผ ๋ฐฉ์งํ๋ ค๋ฉด
์ฑ์ฐ๋ค ์ ๋ก๋ ๋๋ ํฐ๋ฆฌ ์น ์๋ฒ์์ ํ์ผ ์ ๋ก๋๋ ๋ค์ ๊ฒฝ์ฐ์๋ง ํ์ฉ๋ฉ๋๋ค.
--์ ๋ก๋ ์ ํ ์ต์ ์ ์ ๋ก๋ํ ์ ์๋ ํ์ผ ํฌ๊ธฐ๋ฅผ ์ง์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ํ์
์คํฌ๋ฆฝํธ๊ฐ ์๋ฃ๋๋ฉด ์์ ํ์ผ์ ์๋์ผ๋ก ์ญ์ ํฉ๋๋ค. ์ ์งํ๋ ค๋ฉด
ํ์ผ์ ์ด๋ํ๊ฑฐ๋ ์คํฌ๋ฆฝํธ์ ์ด๋๊ฐ์ ์ด๋ฆ์ ๋ฐ๊ฟ๋๋ค.
ํ์ผ ์ด๋ฆ์ ๋ค์์ ์ ์ฅ๋ฉ๋๋ค. HASERL_๋ณ์_๊ฒฝ๋ก ์ด๋ FORM_,
GET_ ๋ฐ POST_ ๋ณ์๋ ํด๋ผ์ด์ธํธ์์ ์์ ํ ์ ์์ผ๋ฉฐ ์ ์์ ์ธ ํด๋ผ์ด์ธํธ๋
์ด๋ฆ์ผ๋ก ๋ ๋ฒ์งธ ๋ณ์๋ฅผ ์ค์ ํ์ญ์์ค. ๋ณ์_๊ฒฝ๋ก=/ etc / passwd. ์ด์ ๋ฒ์
pathspec์ ์ ์ฅํ์ง ์์์ต๋๋ค. ํ์ ๋ค์ ์คํ์ด์ค. ์ ์ ์งํ๋ค ๋ค๋ก
ํธํ์ฑ, ์ ์, name of ์ ์, ์ผ์์ ์ธ ํ์ผ is ๋ํ ์ ์ฅ in FORM_๋ณ์= ๊ณผ
POST_๋ณ์=. ์ด is ๊ณ ๋ ค ์ํํ ๊ณผ ์์์ ์ง์ be ์ต์ํ.
ํด๋ผ์ด์ธํธ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๋ ๊ฒฝ์ฐ ๋ POST ๋ฐ GET ๋ฐฉ๋ฒ์ผ๋ก ํ์ ๋ง ๊ตฌ๋ฌธ ๋ถ์ํฉ๋๋ค
์ ํด๋นํ๋ ๋ฐ์ดํฐ ์์ฒญํ๊ธฐ ์น ์๋ฒ๊ฐ ์ค์ ํ ๋ณ์
๋ชจ๋ ๊ฒ์ ๋ฐ์ ๋ค์ธ๋ค ์ต์ ์ด ์ค์ ๋์์ต๋๋ค. ์๋ฅผ ๋ค์ด, POST ๋ฉ์๋๋ฅผ ํตํด ํธ์ถ๋์์ง๋ง
some.cgi?foo=bar&otherdata=something์ URI์๋ POST ๋ฐ์ดํฐ๊ฐ ๊ตฌ๋ฌธ ๋ถ์๋๊ณ ํธ
๊ณผ ๊ธฐํ ๋ฐ์ดํฐ ๋ณ์๋ ๋ฌด์๋ฉ๋๋ค.
์น ์๋ฒ๊ฐ ์ ์ํ๋ ๊ฒฝ์ฐ HTTP_์ฟ ํค ํ๊ฒฝ ๋ณ์, ์ฟ ํค ๋ฐ์ดํฐ๊ฐ ๊ตฌ๋ฌธ ๋ถ์๋ฉ๋๋ค.
์ฟ ํค ๋ฐ์ดํฐ๊ฐ ๊ตฌ๋ฌธ ๋ถ์๋จ ์ ์ GET ๋๋ POST ๋ฐ์ดํฐ์ด๋ฏ๋ก ๋ ๋ณ์์ ๊ฒฝ์ฐ
๊ฐ์ ์ด๋ฆ์ ์ฌ์ฉํ๋ฉด GET ๋๋ POST ๋ฐ์ดํฐ๊ฐ ์ฟ ํค ์ ๋ณด๋ฅผ ๋ฎ์ด์๋๋ค.
๋์ผํ ๋ณ์์ ์ฌ๋ฌ ์ธ์คํด์ค๊ฐ ๋ค๋ฅธ ์์ค์์ ์ ์ก๋ ๋
FORM_variable์ ๋ณ์๊ฐ ์ฒ๋ฆฌ๋๋ ์์์ ๋ฐ๋ผ ์ค์ ๋ฉ๋๋ค.
HTTP_COOKIE๊ฐ ํญ์ ๋จผ์ ์ฒ๋ฆฌ๋๊ณ ๊ทธ ๋ค์ REQUEST_METHOD๊ฐ ์ฒ๋ฆฌ๋ฉ๋๋ค. ๋ชจ๋ ์๋ฝํ๋ ๊ฒฝ์ฐ
์ต์ ์ด ์ค์ ๋๋ฉด HTTP_COOKIE๊ฐ ๋จผ์ ์ฒ๋ฆฌ๋๊ณ ๊ทธ ๋ค์์๋ not ๋ฉ์๋๊ฐ ์ฒ๋ฆฌ๋ฉ๋๋ค.
REQUEST_METHOD ๋ค์์ REQUEST_METHOD๊ฐ ์ง์ ๋ฉ๋๋ค. ์ ๋ง์ง๋ง ์ธ์คํด์ค
๋ณ์๋ FORM_variable์ ์ค์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๋ณ์๋ ๋ณ๋๋ก
COOKIE_variable, GET_variable ๋ฐ POST_variable๋ก ์์ฑ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ค์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ฐ ์์ค์ ์ค๋ณต ์ด๋ฆ.
๋์ผํ ์์ค์์ ๋์ผํ ๋ณ์์ ์ฌ๋ฌ ์ธ์คํด์ค๊ฐ ์ ์ก๋๋ฉด ๋ง์ง๋ง
ํ๋๋ ์ ์ฅ๋ฉ๋๋ค. ๋ชจ๋ ๋ณต์ฌ๋ณธ์ ์ ์งํ๋ ค๋ฉด(์: ๋ค์ค ์ ํ์ ๊ฒฝ์ฐ) ๋์ "[]"๋ฅผ ์ถ๊ฐํฉ๋๋ค.
๋ณ์ ์ด๋ฆ์. ๋ชจ๋ ๊ฒฐ๊ณผ๊ฐ ์ค ๋ฐ๊ฟ์ผ๋ก ๊ตฌ๋ถ๋์ด ๋ฐํ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด,
host=Enoch&host=Esther&host=Joshua๋ "FORM_host=Joshua"๊ฐ ๋ฉ๋๋ค.
host[]=Enoch&host[]Esther&host[]=Joshua ๊ฒฐ๊ณผ "FORM_host=Enoch\nEsther\nJoshua"
์ธ์ด
๋ค์ ์ธ์ด ๊ตฌ์กฐ๋ ํ์ .
์ด์
<% [์ ์คํฌ๋ฆฝํธ] %>
<% %> ํ๊ทธ๋ก ๋๋ฌ์ธ์ธ ๋ชจ๋ ํญ๋ชฉ์ ์คํ์ ์ํด ํ์ ์ ธ๋ก ์ ์ก๋ฉ๋๋ค. ํ ์คํธ
๋ฌธ์ ๊ทธ๋๋ก ์ ์ก๋ฉ๋๋ค.
ํฌํจ
<%in pathspec %>
์ด ์คํฌ๋ฆฝํธ์ ๋ค๋ฅธ ํ์ผ์ ๊ทธ๋๋ก ํฌํจํฉ๋๋ค. ํ์ผ์ ์คํฌ๋ฆฝํธ๊ฐ
์ฒ์์ ํ์ฑ๋ฉ๋๋ค.
ํ๊ฐ
<%= ํํ์ %>
์ ํํ์์ ์ธ์ํ์ญ์์ค. "echo expr"์ ๋ํ ๊ตฌ๋ฌธ ์คํ.
๋ฐฉ๋ฒ
<%# ์ฝ๋ฉํธ %>
๋๊ธ ๋ธ๋ก. ์ฃผ์ ๋ธ๋ก์ ๋ด์ฉ์ ๊ตฌ๋ฌธ ๋ถ์๋์ง ์์ต๋๋ค. ์ฃผ์์ ์ค์ฒฉ๋ ์ ์์ต๋๋ค.
๋ค๋ฅธ haserl ์์๋ฅผ ํฌํจํ ์ ์์ต๋๋ค.
์ฌ์ฉ ์
๊ฒฝ๊ณ
์๋ ์์ ๋ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ๋จ์ํ๋์์ต๋๋ค. ํ์ . ๋น์ ์ํด์ผํ๋ค
์ฌ์ฉํ๊ธฐ ์ ์ ๊ธฐ๋ณธ ์น ์คํฌ๋ฆฝํ ๋ณด์์ ์ต์ํจ ํ์ (๋๋ ์คํฌ๋ฆฝํ
์ธ์ด) ์์ฐ ํ๊ฒฝ์์.
๋จ์, ๊ฐ๋จ, ํธ๋ฆฌ ๋ช ๋ น
#!/usr/local/bin/haserl
์ฝํ ์ธ ์ ํ: ํ ์คํธ/์ผ๋ฐ
<%# ์ํ "env" ์คํฌ๋ฆฝํธ์ ๋๋ค %>
<%ํ๊ฒฝ%>
์ ๊ฒฐ๊ณผ๋ฅผ ์ธ์ํฉ๋๋ค. ํ๊ฒฝ ๋ช ๋ น์ MIME ์ ํ "ํ ์คํธ/์ผ๋ฐ" ๋ฌธ์๋ก ์ฌ์ฉํฉ๋๋ค. ์ด๊ฒ์
์ ์, ํ์ ์ผ๋ฐ์ ์ธ ๋ฒ์ ์ธ์ cgi.cgi
๋ฃจํ ๊ณผ ๋์ ์ถ๋ ฅ
#!/usr/local/bin/haserl
์ฝํ ์ธ ์ ํ: ํ ์คํธ/html
<๋นจ๊ฐ์ ํ๋์ ๋ ธ๋์ ์ฒญ๋ก์์ a์ ๋ํ %; ํ %>
"><% ์์ฝ -n "$a" %>
<% ์๋ฃ %>
MIME ํ์์ "text/html" ๋ฌธ์๋ฅผ html ํ ์ด๋ธ๊ณผ ํจ๊ป ํด๋ผ์ด์ธํธ์ ๋ณด๋ ๋๋ค.
๋ฐฐ๊ฒฝ์์ผ๋ก ๋ ์ด๋ธ์ด ์ง์ ๋ ์์.
๊ป์ง ํ์ ๋ ๊ธฐ๋ฅ.
#!/usr/local/bin/haserl
์ฝํ ์ธ ์ ํ: ํ ์คํธ/html
<% # ์ฌ์ฉ์ ํจ์ ์ ์
ํ ์ด๋ธ ์์() {
์์ฝ " $1 "
}
%>
<๋นจ๊ฐ์ ํ๋์ ๋ ธ๋์ ์ฒญ๋ก์์ a์ ๋ํ %; ํ %>
<% table_element $a %>
<% ์๋ฃ %>
์์ ๋์ผํ์ง๋ง ์๋ฒ ๋๋ html ๋์ ์ ํจ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ ํ ์ฐธ์กฐ CGI ๊ณผ a ํํ
#!/usr/local/bin/haserl
์ฝํ ์ธ ์ ํ: ํ ์คํธ/html
์ํ ์์
" method="GET">
<% # FORM_textfield์ ๊ธฐ๋ณธ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ํํฉ๋๋ค.
# ์ผ๋ฐ์ ์ธ ์น ๊ณต๊ฒฉ์ ๋ฐฉ์งํ๊ธฐ ์ํด
FORM_textfield=$( echo "$FORM_textfield" | sed "s/[^A-Za-z0-9 ]//g" )
%>
<์ ๋ ฅ ์ ํ=ํ ์คํธ ์ด๋ฆ=ํ ์คํธ ํ๋
๊ฐ="<% echo -n "$FORM_textfield" | tr az AZ %>" cols=20>
์์์ ์ธ์ํฉ๋๋ค. ํด๋ผ์ด์ธํธ๊ฐ ์์์ ํ ์คํธ๋ฅผ ์ ๋ ฅํ๋ฉด CGI๊ฐ ๋ค์ ๋ก๋๋ฉ๋๋ค(์ ์๋จ).
by $SCRIPT_NAME) ์น ๊ณต๊ฒฉ์ ๋ฐฉ์งํ๊ธฐ ์ํด ํ ์คํธ ํ๋๋ฅผ ์ญ์ ํ ๋ค์
์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ํ ์คํธ๋ก ์์์ด ๋ค์ ํ์๋ฉ๋๋ค. ํ ์คํธ๋ ๋๋ฌธ์์ ๋๋ค.
์ ๋ก๋ a ์ ์ ๋ถ๋ชจ๋ก์์ ๊ทํ์ ์ ํฉ์ฑ์ ๊ฒฐ์ ํ๊ธฐ ์ํด ๋ฏธ๊ตญ ์ด๋ฏผ๊ตญ์
#!/usr/local/bin/haserl --์ ๋ก๋ ์ ํ=4096 --์ ๋ก๋ ๋๋ ํฐ๋ฆฌ=/ TMP
์ฝํ ์ธ ์ ํ: ํ ์คํธ/html
" method=POST enctype="multipart/form-data" >
<% 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
<% ์์ฝ -en "์ฝํ ์ธ ์ ํ: ํ ์คํธ/html\r\n\r\n" %>
...
HTTP ์ฌ์์ ์์ ํ ์ค์ํ๋ ค๋ฉด ๋ค์์ ์ฌ์ฉํ์ฌ ํค๋๋ฅผ ์ข ๋ฃํด์ผ ํฉ๋๋ค.
์ผ๋ฐ ์ ๋์ค LF ๋ผ์ธ ์ข ๋ฃ ์ ์ฉ์ด ์๋ CR+LF. ์์ ๊ตฌ๋ฌธ์
RFC 2616 ์ค์ ํค๋๋ฅผ ์์ฑํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
ํ๊ฒฝ
์น ์๋ฒ์์ ์์๋ฐ์ ํ๊ฒฝ ๋ณ์ ์ธ์ ๋ค์๊ณผ ๊ฐ์
ํ๊ฒฝ ๋ณ์๋ ํญ์ ์์ํ ๋ ์ ์๋ฉ๋๋ค.
ํ์ ๋ฒ
ํ์ ๋ฒ์ - ์ ๋ณด ํ๊ทธ์ ๋๋ค.
์ธ์ ID
CGI ์๋ช ๋์ ๊ณ ์ ํ XNUMX์ง์ ํ๊ทธ์ ๋๋ค.
cgi๊ฐ ์์๋ฉ๋๋ค. ๋ค๋ฅธ POST ๋๋ GET ์ฟผ๋ฆฌ๊ฐ ์์ฑ๋ ๋๊น์ง ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค.)
HASERL_ACCEPT_ALL
๊ฒฝ์ฐ --๋ชจ๋ ๊ฒ์ ๋ฐ์ ๋ค์ธ๋ค ๊น๋ฐ์ ๊ฝ์๊ณ , -1๊ทธ๋ ์ง ์์ผ๋ฉด 0.
HASERL_SHELL
ํ์ ์ ธ ๋ช ๋ น์ ์คํํ๊ธฐ ์์ํ ์ ธ haserl์ ์ด๋ฆ์ ๋๋ค.
HASERL_UPLOAD_DIR
๋๋ ํ ๋ฆฌ haserl์ ์ ๋ก๋๋ ํ์ผ์ ์ ์ฅํ๋ ๋ฐ ์ฌ์ฉํ ๊ฒ์ ๋๋ค.
HASERL_UPLOAD_LIMIT
ํด๋ผ์ด์ธํธ์์ ์๋ฒ๋ก ๋ณด๋ผ ์ ์๋ KB ์์ ๋๋ค.
์ด๋ฌํ ๋ณ์๋ ์คํฌ๋ฆฝํธ ๋ด์์ ์์ ํ๊ฑฐ๋ ๋ฎ์ด์ธ ์ ์์ต๋๋ค.
"HASERL_"๋ก ์์ํ๋ ๊ฒ์ ์ ๋ณด์ฉ์ผ ๋ฟ์ด๋ฉฐ ์คํ ์ค์ธ ์คํฌ๋ฆฝํธ์ ์ํฅ์ ์ฃผ์ง ์์ต๋๋ค.
์์ STYLE
์์ ์ฌ์ฉํ์ฌ CGI ์คํฌ๋ฆฝํธ๋ฅผ ํ๋ก๊ทธ๋๋ฐํ๋ ๊ฒ์ ์ํ์ฑ์ ๊ดํ ๋ง์ ๋ฌธํ์ด ์์ต๋๋ค.
ํ์ ์ด ํฌํจ๋์ด ์์ต๋๋ค ์ผ๋ถ ์ด ์ํ์ ์ํํ๊ธฐ ์ํ ๋ณดํธ.
ํ๊ฒฝ ๋ณ์
ํ๊ฒฝ ๋ณ์๋ฅผ ์ฑ์ฐ๋ ์ฝ๋๋ ํ์ ๋ฒ์๋ฅผ ๋ฒ์ด๋ฉ๋๋ค.
๊ป๋ฐ๊ธฐ. ๋ฌธ์๋ฅผ ํ์ฑํฉ๋๊น? ๋ฐ &, ํด๋ผ์ด์ธํธ๊ฐ ์ํํ๊ธฐ ๋ ์ด๋ ต์ต๋๋ค.
"์ฃผ์ " ๊ณต๊ฒฉ. ์๋ก์, foo.cgi?a=ํ ์คํธ;๊ณ ์์ด / etc / passwd ๋ฐ์ํ ์ ์์ต๋๋ค
๊ฐ์ด ํ ๋น๋๋ ๋ณ์ test ๊ทธ๋ฆฌ๊ณ ์คํ ๊ฒฐ๊ณผ ๋ฐฉ๋ฒ
/ etc / passwd ํด๋ผ์ด์ธํธ์๊ฒ ์ ์ก๋๊ณ ์์ต๋๋ค. ํ์ค ๋ณ์์ ์๋ฃ๋ฅผ ํ ๋นํฉ๋๋ค
๊ฐ : ํ ์คํธ;๊ณ ์์ด / etc / passwd
์ ธ ์คํฌ๋ฆฝํธ์์ ์ด "์ํํ" ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์์ ํฉ๋๋ค.
์ธ์ฉ ๋ถํธ; ๋ชจ๋ ์ ๋ ฅ ํ๋์ ๋ํด ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ํํด์ผ ํ์ง๋ง.
ํน๊ถ ์ ํ
suid ์คํฌ๋ฆฝํธ๋ก ์ค์นํ๋ฉด ํ์ uid/gid๋ฅผ ์์ ์์ uid/gid๋ก ์ค์ ํฉ๋๋ค.
๋๋ณธ. ์ด๊ฒ์ ๋ค์ํ CGI ์คํฌ๋ฆฝํธ ์ธํธ๋ฅผ ๊ฐ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค.
ํน๊ถ. ๋ง์ฝ ํ์ ๋ฐ์ด๋๋ฆฌ๊ฐ suid๋ก ์ค์น๋์ง ์์ ๊ฒฝ์ฐ CGI ์คํฌ๋ฆฝํธ๋
์น ์๋ฒ์ uid/gid๋ก ์คํํฉ๋๋ค.
๊ฑฐ์ ๋ช ๋ น ์ ๋งค๊ฐ ๋ณ์ ์ฃผ์ด์ง on ์ ์, URL
URL์ ์ธ์ฝ๋ฉ๋์ง ์์ "="๊ฐ ํฌํจ๋์ด ์์ง ์์ผ๋ฉด CGI ์ฌ์์ ์ต์ ์ด ๋ช ์๋์ด ์์ต๋๋ค.
ํ๋ก๊ทธ๋จ์ ๋ํ ๋ช ๋ น์ค ๋งค๊ฐ๋ณ์๋ก ์ฌ์ฉ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด,
CGI ์ฌ์: http://192.168.0.1/test.cgi?--์ ๋ก๋ ์ ํ%3d2000&foo%3dbar
"Foo=bar" ์ค์ ์ธ์ ์ ๋ก๋ ์ ํ์ 2000KB๋ก ์ค์ ํด์ผ ํฉ๋๋ค. ๋ณดํธํ๊ธฐ ์ํด
์์ฒด ์ ๋ก๋๋ฅผ ํ์ฉํ๋ ํด๋ผ์ด์ธํธ์ ๋ํด ํ์ ๋ชจ๋ ๋ช ๋ น์ค ์ต์ ์ ๊ฑฐ๋ถํฉ๋๋ค.
argv[2] ๋๋จธ. #! ์คํฌ๋ฆฝํธ, ์ธํฐํ๋ฆฌํฐ๋ argv[0], ๋ชจ๋
#! ๋ผ์ธ์ argv[1]๋ก ๊ฒฐํฉ๋๊ณ
์คํฌ๋ฆฝํธ ์ด๋ฆ์ argv[2]์ ๋๋ค.
LUA
๋ฃจ์ ์ง์์ผ๋ก ์ปดํ์ผํ๋ฉด --์=๋ฃจ์ ๋์ ์คํฌ๋ฆฝํธ ์ธ์ด๋ก lua๋ฅผ ํ์ฑํํฉ๋๋ค.
bash ์์. ํ๊ฒฝ ๋ณ์(SCRIPT_NAME, SERVER_NAME ๋ฑ)๋
ENV ํ ์ด๋ธ๊ณผ ์์ ๋ณ์๋ FORM ํ ์ด๋ธ์ ๋ฐฐ์น๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด,
์์ ์๊ธฐ ์ฐธ์กฐ ํ์์ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์์ต๋๋ค.
#!/usr/local/bin/haserl --shell=๋ฃจ์
์ฝํ ์ธ ์ ํ: ํ ์คํธ/html
์ํ ์์
" ๋ฐฉ๋ฒ="๊ฐ์ ธ์ค๊ธฐ">
<% # FORM_textfield์ ๊ธฐ๋ณธ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ํํฉ๋๋ค.
# ์ผ๋ฐ์ ์ธ ์น ๊ณต๊ฒฉ์ ๋ฐฉ์งํ๊ธฐ ์ํด
FORM.textfield=string.gsub(FORM.textfield, "[^%a%d]", "")
%>
<์ ๋ ฅ ์ ํ=ํ ์คํธ ์ด๋ฆ=ํ ์คํธ ํ๋
๊ฐ="<% io.write (string.upper(FORM.textfield)) %>" cols=20>
<%= ์ฐ์ฐ์๋ ๋ค์์ ๋ํ ๊ตฌ๋ฌธ ์คํ์ ๋๋ค. io.์ฐ๊ธฐ (tostring( ... )) ์๋ฅผ ๋ค์ด
Value= ์์ ์ค์ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์์ต๋๋ค. ๊ฐ="<%= string.upper(FORM.ํ ์คํธ ํ๋) %>" ์ด = 20>
haserl lua ์คํฌ๋ฆฝํธ๋ ๋ค์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. haserl.๋ก๋ํ์ผ(ํ์ผ ์ด๋ฆ) ๋์์ ์ฒ๋ฆฌํ๊ธฐ ์ํด
haserl(lua) ์คํฌ๋ฆฝํธ๋ก ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํฉ๋๋ค. ํจ์๋ "ํจ์" ์ ํ์ ๋ฐํํฉ๋๋ค.
์๋ฅผ ๋ค์ด,
๋ฐ.lsp
<% io.write ("Hello World" ) %>
๊ทํ์ ๋ฉ์์ง๋ <%= gvar %>์ ๋๋ค.
-- ์ธํด๋ฃจ๋ ํ์ผ ๋ --
foo.haserl
#!/usr/local/bin/haserl --shell=๋ฃจ์
<% m = haserl.loadfile("bar.lsp")
gvar = "m()์ผ๋ก ์คํ"
๋ฏธ๋์()
gvar = "ํ ๋ฒ์ ๋ก๋ ๋ฐ ์คํ"
haserl.loadfile("bar.lsp")()
%>
๋ฌ๋ฆฌ๋ ํธ ๋ค์์ ์์ฑํฉ๋๋ค.
์๋ ํ์ธ์
๊ทํ์ ๋ฉ์์ง๋ m()์ผ๋ก ์คํ๋ฉ๋๋ค.
-- ์ธํด๋ฃจ๋ ํ์ผ ๋ --
์๋ ํ์ธ์
๊ทํ์ ๋ฉ์์ง๋ ํ ๋จ๊ณ์์ ๋ก๋ ๋ฐ ์คํ์ ๋๋ค.
-- ์ธํด๋ฃจ๋ ํ์ผ ๋ --
์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ์ค์ฒฉ๋ haserl ์๋ฒ ํ์ด์ง - ํ์ด์ง ์ค๋ํซ์ ๊ฐ์ง ์ ์์ต๋๋ค.
haserl ํ ํฌ๋์ด์ ์ ์ํด ์ฒ๋ฆฌ๋ฉ๋๋ค.
๋ฃจ์
XNUMXD๋ดํ์ ๋ฃจ์ "shell"์ ๋ฏธ๋ฆฌ ์ปดํ์ผ๋ lua ์ฒญํฌ์ด๋ฏ๋ก ์คํฌ๋ฆฝํธ์ ๋ํ์ ํธ์ง ๋ฐ ํ ์คํธ
๋ถ๊ฐ๋ฅํฉ๋๋ค. ๊ทธ๋ฌ๋ haserl์ luac ์ง์์ผ๋ก๋ง ์ปดํ์ผํ ์ ์์ต๋๋ค.
์์ ๋ฉ๋ชจ๋ฆฌ ํ๊ฒฝ์์๋ ๋ฃจ์๋ฅผ ์ง์ํฉ๋๋ค. ์์ ๋์ด๋ ๋ชจ๋ haserl lua ๊ธฐ๋ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์์ง ์ฌ์ฉํ ์ ์์ต๋๋ค. (luac์ด haserl์ ๋ด์ฅ๋ ์ ์ผํ ์์ด๋ผ๋ฉด haserl.loadfile์
haserl ํ์๊ฐ ์ปดํ์ผ๋์ง ์์๊ธฐ ๋๋ฌธ์ ๋นํ์ฑํ๋ฉ๋๋ค.)
๋ค์์ luac cgi ์คํฌ๋ฆฝํธ๋ก ๋ณํ๋ ์ฌ์ํ ์คํฌ๋ฆฝํธ์ ์์ ๋๋ค.
test.lua ํ์ผ์ด ์ฃผ์ด์ง ๊ฒฝ์ฐ:
์ธ์("์ฝํ ์ธ ์ ํ: ํ ์คํธ/์ผ๋ฐ0)
print("์ด ์คํ์ ๋ํ UUID๋: " .. ENV.SESSIONID)
๋ค์๊ณผ ๊ฐ์ด luac์ผ๋ก ์ปดํ์ผํ ์ ์์ต๋๋ค.
๋ฃจ์ -o ํ ์คํธ.๋ฃจ์ -s ํ ์คํธ.๋ฃจ์
๊ทธ๋ฐ ๋ค์ haserl ํค๋๊ฐ ์ถ๊ฐ๋์์ต๋๋ค.
echo '#!/usr/bin/haserl --shell=luac' | ๊ณ ์์ด - test.luac > luac.cgi
๋๋ ํ์ค lua ์ ธ์ ์ฌ์ฉํ์ฌ ์ ์ฒด ์น ์ฌ์ดํธ๋ฅผ ๊ฐ๋ฐํ ์ ์์ต๋๋ค.
๊ทธ๋ฐ ๋ค์ 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
๋ฃจ์ -s -o ํ ์คํธ.๋ฃจ์ ํ ์คํธ.๋ฃจ์
echo '#!/usr/bin/haserl --shell=luac' | ๊ณ ์์ด - test.luac > luac.cgi
onworks.net ์๋น์ค๋ฅผ ์ฌ์ฉํ์ฌ ์จ๋ผ์ธ์์ haserl ์ฌ์ฉ