EnglishFrenchSpanyol

Jalankan pelayan | Ubuntu > | Fedora > |


Favicon OnWorks

haserl - Dalam talian di Awan

Jalankan haserl dalam penyedia pengehosan percuma OnWorks melalui Ubuntu Online, Fedora Online, emulator dalam talian Windows atau emulator dalam talian MAC OS

Ini ialah arahan haserl yang boleh dijalankan dalam penyedia pengehosan percuma OnWorks menggunakan salah satu daripada berbilang stesen kerja dalam talian percuma kami seperti Ubuntu Online, Fedora Online, emulator dalam talian Windows atau emulator dalam talian MAC OS.

JADUAL:

NAMA


haserl - Program penskripan cgi untuk persekitaran terbenam

SINOPSIS


#!/usr/bin/haserl [--shell=pathspec] [--upload-dir=dirspec] [--upload-handler=pengendali]
[--upload-limit=menghadkan] [--terima semua] [--terima-tiada] [--senyap] [--debug]

[ teks ] [ <% skrip shell %> ] [ teks ] ...

DESCRIPTION


Haserl ialah pembalut cgi kecil yang membenarkan pengaturcaraan cgi gaya "PHP", tetapi menggunakan UNIX
shell seperti bash atau Lua sebagai bahasa pengaturcaraan. Ia sangat kecil, jadi ia boleh digunakan
dalam persekitaran terbenam, atau di mana sesuatu seperti PHP terlalu besar.

Ia menggabungkan tiga ciri ke dalam enjin cgi kecil:

Ia menghuraikan permintaan POST dan GET, meletakkan elemen bentuk sebagai pasangan nama=nilai ke dalam
persekitaran untuk skrip CGI digunakan. Ini agak seperti uncgi pembalut.

Ia membuka cangkerang, dan menterjemah semua teks ke dalam pernyataan boleh dicetak. Semua teks
dalam <% ... %> binaan dihantar secara verbatim ke shell. Ini agaknya
seperti menulis PHP skrip.

Ia boleh dipasang secara pilihan untuk menggugurkan kebenarannya kepada pemilik skrip,
memberikannya beberapa ciri keselamatan suexec or cgiwrapper.

PILIHAN RINGKASAN


Ini adalah ringkasan pilihan baris arahan. Sila lihat PILIHAN bahagian di bawah
nama pilihan panjang untuk penerangan lengkap.

-a --terima-semua
-n --terima-tiada
-d --debug
-s, --shell
-S, --senyap
-U, --upload-dir
-u, --upload-had
-H, --pengendali muat naik

PILIHAN


--terima semua
Program ini biasanya menerima data POST hanya apabila REQUEST_METHOD ialah POST dan
hanya menerima data pada data URL apabila REQUEST_METHOD adalah GET. Pilihan ini
membenarkan kedua-dua data POST dan URL diterima tanpa mengira REQUEST_METHOD.
Apabila pilihan ini ditetapkan, REQUEST_METHOD diutamakan (cth. jika kaedah
ialah POST, FORM_variables diambil daripada data COOKIE, GET data dan data POST, dalam
perintah itu. Jika kaedahnya GET, FORM_variables diambil daripada data COOKIE, POST
data, dan DAPATKAN data.) Lalainya bukan untuk menerima semua kaedah input - hanya kaedah
Data COOKIE dan REQUEST_METHOD.

--terima-tiada
Jika diberikan, haserl tidak akan menghuraikan input standard sebagai kandungan http sebelum diproses
skrip. Ini berguna jika memanggil skrip haserl daripada skrip haserl yang lain.

--nyahpepijat
Daripada melaksanakan skrip, cetak skrip yang akan dilaksanakan. Jika
pembolehubah persekitaran 'REQUEST_METHOD' ditetapkan, data dihantar dengan
jenis kandungan biasa/teks. Jika tidak, skrip shell dicetak secara verbatim.

--shell=pathspec
Tentukan shell seperti bash alternatif untuk digunakan. Lalai kepada "/ Bin / sh"

Untuk memasukkan parameter shell jangan gunakan --shell=/ Bin / sh format. Sebaliknya, gunakan
format alternatif tanpa "=", seperti dalam --shell "/ bin / bash --norc". Pastikan anda
petikan rentetan pilihan untuk melindungi sebarang aksara khas.

Jika disusun dengan perpustakaan Lua, maka rentetan "lua" digunakan untuk menggunakan bersepadu
Lua vm. Rentetan ini sensitif huruf besar-besaran. Contoh: --shell=bulan

Alternatifnya ialah "luac". Ini menyebabkan penghurai haserl dan lua dilumpuhkan,
dan skrip diandaikan sebagai ketulan lua yang telah disusun sebelumnya. Lihat LUAC di bawah untuk lebih lanjut
maklumat.

--senyap
Haserl biasanya mencetak mesej maklumat mengenai keadaan ralat. ini
menyekat mesej ralat, supaya penggunaan haserl tidak diiklankan.

--upload-dir=dirspec
Lalai kepada "/ tmp". Semua fail yang dimuat naik dicipta dengan nama fail sementara dalam ini
direktori HASERL_xxx_path mengandungi nama fail sementara. FORM_xxx_name
mengandungi nama asal fail, seperti yang ditentukan oleh klien.

--pengendali muat naik=pathspec
Apabila dinyatakan, muat naik fail dikendalikan oleh pengendali ini, bukannya ditulis kepada
fail-fail sementara. Spesifikasi laluan penuh mesti diberikan (PATH tidak dicari), dan
pengendali muat naik diberikan satu parameter baris perintah: Nama FIFO dihidupkan
yang mana fail muat naik akan dihantar. Di samping itu, pengendali boleh menerima 3
pembolehubah persekitaran: JENIS KANDUNGAN, NAMA FAIL, dan NAMA. Ini mencerminkan MIME
pengepala pelupusan kandungan untuk kandungan. Haserl akan garpu pengendali untuk setiap satu
fail dimuat naik, dan akan menghantar kandungan fail muat naik ke FIFO yang ditentukan.
Haserl kemudiannya akan menyekat sehingga pengendali ditamatkan. Kaedah ini adalah untuk pakar
sahaja.

--upload-limit=menghadkan
Benarkan fail berkod mime sehingga menghadkan KB untuk dimuat naik. Lalainya ialah 0KB (no
muat naik dibenarkan). Ambil perhatian bahawa pengekodan mime menambah 33% pada saiz data.

TINJAUAN OF OPERASI


Secara umum, pelayan web menyediakan beberapa pembolehubah persekitaran, dan kemudian menggunakan garpu or
kaedah lain untuk menjalankan skrip CGI. Jika skrip menggunakan haserl jurubahasa, yang
berikut berlaku:

If haserl telah dipasang suid root, kemudian uid/gid ditetapkan kepada pemilik skrip.

Persekitaran diimbas untuk HTTP_COOKIE, yang mungkin telah ditetapkan oleh web
pelayan. Jika ia wujud, kandungan yang dihuraikan diletakkan dalam persekitaran setempat.

Persekitaran diimbas untuk REQUEST_METHOD, yang telah ditetapkan oleh pelayan web.
Berdasarkan kaedah permintaan, input standard dibaca dan dihuraikan. Yang dihuraikan
kandungan diletakkan dalam persekitaran tempatan.

Skrip ditandakan, dihuraikan haserl blok kod daripada teks mentah. Teks mentah ialah
ditukar kepada penyataan "gema", dan kemudian semua token dihantar ke subkulit.

haserl garpu dan subkulit (biasanya / Bin / sh) dimulakan.

Semua token dihantar ke STDIN subkulit, dengan mengekor keluar perintah.

Apabila sub-cangkang ditamatkan, yang haserl jurubahasa melakukan pembersihan akhir dan
kemudian tamat.

CLIENT SIDE INPUT


. haserl jurubahasa akan menyahkod data yang dihantar melalui pembolehubah persekitaran HTTP_COOKIE, dan
kaedah GET atau POST daripada klien, dan simpannya sebagai pembolehubah persekitaran yang boleh
boleh diakses oleh haserl. Nama pembolehubah mengikut nama yang diberikan dalam sumber,
kecuali awalan ( BORANG_) disediakan. Sebagai contoh, jika pelanggan menghantar "foo=bar",
pembolehubah persekitaran ialah FORM_foo=bar.

Untuk kaedah HTTP_COOKIE, pembolehubah juga disimpan dengan awalan ( COOKIE_) ditambah.
Contohnya, jika HTTP_COOKIE menyertakan "foo=bar", pembolehubah persekitaran ialah
COOKIE_foo=bar.

Untuk kaedah GET, data yang dihantar dalam bentuk %xx diterjemahkan ke dalam aksara mereka
mewakili, dan pembolehubah juga disimpan dengan awalan ( GET_) ditambah. Sebagai contoh, jika
QUERY_STRING termasuk "foo=bar", pembolehubah persekitaran ialah GET_foo=bar.

Untuk kaedah POST, pembolehubah juga disimpan dengan awalan ( SELEPAS_) ditambah. Untuk
contoh, jika strim siaran termasuk "foo=bar", pembolehubah persekitaran ialah POST_foo=bar.

Juga, untuk kaedah POST, jika data dihantar menggunakan berbilang bahagian/data-bentuk pengekodan, yang
data dinyahkod secara automatik. Ini biasanya digunakan apabila fail dimuat naik dari web
pelanggan menggunakan .

NOTA Apabila fail dimuat naik ke pelayan web, ia disimpan dalam upload-dir
direktori. FORM_variable_name= mengandungi nama fail yang dimuat naik (as
ditentukan oleh pelanggan.) HASERL_variable_path= mengandungi nama fail dalam
upload-dir yang memegang kandungan yang dimuat naik. Untuk mengelakkan pelanggan berniat jahat daripada
mengisi upload-dir pada pelayan web anda, muat naik fail hanya dibenarkan apabila
--had-muat naik pilihan digunakan untuk menentukan saiz fail boleh dimuat naik. Haserl
secara automatik memadam fail sementara apabila skrip selesai. Untuk mengekalkan
fail, alihkannya atau namakan semula di suatu tempat dalam skrip.

Ambil perhatian bahawa nama fail disimpan dalam HASERL_laluan_bolehubah Ini kerana FORM_,
Pembolehubah GET_, dan POST_ boleh diubah suai oleh pelanggan, dan pelanggan berniat jahat boleh
tetapkan pembolehubah kedua dengan nama variable_path=/ etc / passwd. Versi terdahulu
tidak menyimpan pathspec dalam HASERL ruang nama. Untuk mengekalkan ke belakang
keserasian, yang nama of yang sementara fail is Juga disimpan in FORM_variable= dan
POST_variable=. ini is dianggap tidak selamat dan Sekiranya tidak be terpakai.

Jika pelanggan menghantar data kedua-dua dengan kaedah POST dan GET, kemudian haserl hanya akan menghuraikan
data yang sepadan dengan REQUEST_METHOD pembolehubah yang ditetapkan oleh pelayan web, melainkan jika
terima semua pilihan telah ditetapkan. Sebagai contoh, borang yang dipanggil melalui kaedah POST, tetapi mempunyai a
URI some.cgi?foo=bar&otherdata=something akan mempunyai data POST dihuraikan dan foo
dan data lain pembolehubah diabaikan.

Jika pelayan web mentakrifkan a HTTP_COOKIE pembolehubah persekitaran, data kuki dihuraikan.
Data kuki dihuraikan sebelum data GET atau POST, jadi sekiranya terdapat dua pembolehubah
nama yang sama, data GET atau POST menimpa maklumat kuki.

Apabila berbilang contoh pembolehubah yang sama dihantar daripada sumber yang berbeza, the
FORM_variable akan ditetapkan mengikut susunan pembolehubah diproses.
HTTP_COOKIE sentiasa diproses dahulu, diikuti dengan REQUEST_METHOD. Jika terima-semua
pilihan telah ditetapkan, kemudian HTTP_COOKIE diproses terlebih dahulu, diikuti dengan kaedah tidak
ditentukan oleh REQUEST_METHOD, diikuti dengan REQUEST_METHOD. Contoh terakhir bagi
pembolehubah akan digunakan untuk menetapkan FORM_variable. Ambil perhatian bahawa pembolehubah juga berasingan
mencipta sebagai COOKIE_variable, GET_variable dan POST_variable. Ini membolehkan penggunaan
bertindih nama daripada setiap sumber.

Apabila berbilang kejadian pembolehubah yang sama dihantar dari sumber yang sama, hanya yang terakhir
satu diselamatkan. Untuk menyimpan semua salinan (untuk berbilang pilihan, misalnya), tambah "[]" pada penghujung
daripada nama pembolehubah. Semua keputusan akan dikembalikan, dipisahkan oleh baris baharu. Sebagai contoh,
host=Enoch&host=Esther&host=Joshua menghasilkan "FORM_host=Joshua".
hos[]=Enoch&host[]Esther&host[]=Joshua menghasilkan "FORM_host=Enoch\nEsther\nJoshua"

BAHASA


Struktur bahasa berikut diiktiraf oleh haserl.

RUN
<% [skrip shell] %>

Apa-apa sahaja yang dilampirkan oleh tag <% %> dihantar ke sub-kulit untuk dilaksanakan. Teks
dihantar secara verbatim.

TERMASUK
<%in pathspec %>

Sertakan satu lagi fail verbatim dalam skrip ini. Fail disertakan apabila skrip
pada mulanya dihuraikan.

EVAL
<%= ungkapan %>

mencetak ungkapan shell. Gula sintaksis untuk "echo expr".

BAGAIMANA
<%# ulasan %>

Blok ulasan. Apa-apa sahaja dalam blok ulasan tidak dihuraikan. Komen boleh bersarang
dan boleh mengandungi elemen haserl lain.

CONTOH


BERKHATAN :
Contoh di bawah dipermudahkan untuk menunjukkan cara menggunakan haserl. Anda perlu
biasa dengan keselamatan skrip web asas sebelum menggunakan haserl (atau mana-mana skrip
bahasa) dalam persekitaran pengeluaran.

Mudah Perintah
#!/usr/local/bin/haserl
jenis kandungan: teks/biasa

<%# Ini ialah contoh skrip "env" %>
<% env %>

Mencetak hasil daripada env arahan sebagai dokumen "teks/plain" jenis mime. Ini adalah
yang haserl versi biasa printenv cgi.

Looping dengan dinamik output
#!/usr/local/bin/haserl
Jenis kandungan: teks/html




<% untuk a dalam Merah Biru Kuning Cyan; lakukan %>
"><% echo -n "$a" %>
<% selesai %>




Menghantar dokumen "teks/html" jenis mime kepada klien, dengan jadual html dengan
elemen yang dilabelkan dengan warna latar belakang.

Penggunaan Shell ditakrifkan fungsi.
#!/usr/local/bin/haserl
jenis kandungan: teks/html

<% # mentakrifkan fungsi pengguna
elemen_jadual() {
bergema" $1 "
}
%>



<% untuk a dalam Merah Biru Kuning Cyan; lakukan %>
<% table_element $a %>
<% selesai %>




Sama seperti di atas, tetapi menggunakan fungsi shell dan bukannya html terbenam.

Sendiri Rujukan CGI dengan a bentuk
#!/usr/local/bin/haserl
jenis kandungan: teks/html


Contoh Borang
" method="GET">
<% # Lakukan beberapa pengesahan asas FORM_textfield
# Untuk mengelakkan serangan web biasa
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>




Mencetak borang. Jika pelanggan memasukkan teks dalam borang, CGI dimuat semula (ditakrifkan
by $SCRIPT_NAME) dan medan teks dibersihkan untuk mengelakkan serangan web, kemudian
borang dipaparkan semula dengan teks yang dimasukkan pengguna. Teks adalah huruf besar.

Memuat naik a File
#!/usr/local/bin/haserl --upload-limit=4096 --upload-dir=/ tmp
jenis kandungan: teks/html


" method=POST enctype="multipart/form-data" >



<% jika ujian -n "$HASERL_uploadfile_path"; kemudian %>

Anda memuat naik fail bernama <% echo -n $FORM_uploadfile_name %> , dan ia adalah
. disimpan sementara pada pelayan sebagai . The
fail ialah <% cat $HASERL_uploadfile_path | wc -c %> bait panjang.
<% rm -f $HASERL_uploadfile_path %> Jangan risau, fail itu baru sahaja dipadamkan
daripada pelayan web.
<% lain %>
Anda belum memuat naik fail lagi.
<% fi %>



Memaparkan borang yang membenarkan muat naik fail. Ini dicapai dengan menggunakan
--had-muat naik dan dengan menetapkan borang enctype kepada multipart / bentuk-data. Jika
klien menghantar fail, kemudian beberapa maklumat mengenai fail dicetak, dan kemudian
dipadamkan. Jika tidak, borang menyatakan bahawa klien belum memuat naik fail.

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

...


Untuk mematuhi sepenuhnya spesifikasi HTTP, pengepala harus ditamatkan menggunakan
CR+LF, bukannya penamatan talian unix LF biasa sahaja. Sintaks di atas boleh
digunakan untuk menghasilkan pengepala yang mematuhi RFC 2616.

ALAM


Sebagai tambahan kepada pembolehubah persekitaran yang diwarisi daripada pelayan web, perkara berikut
pembolehubah persekitaran sentiasa ditakrifkan pada permulaan:

HASERLVER
haserl versi - tag maklumat.

SESSIONID
Tag heksadesimal yang unik untuk hayat CGI (ia dijana apabila
cgi bermula; dan tidak berubah sehingga pertanyaan POST atau GET yang lain dijana.)

HASERL_ACCEPT_ALL
Jika --terima semua bendera dipasang, -1, Jika tidak 0.

HASERL_SHELL
Nama shell haserl mula menjalankan perintah sub-shell masuk.

HASERL_UPLOAD_DIR
Direktori haserl akan digunakan untuk menyimpan fail yang dimuat naik.

HASERL_UPLOAD_LIMIT
Bilangan KB yang dibenarkan dihantar dari klien ke pelayan.

Pembolehubah ini boleh diubah suai atau ditimpa dalam skrip, walaupun yang
bermula dengan "HASERL_" adalah maklumat sahaja dan tidak menjejaskan skrip yang sedang berjalan.

KESELAMATAN CIRI-CIRI


Terdapat banyak literatur mengenai bahaya menggunakan shell untuk memprogram skrip CGI.
haserl mengandungi beberapa perlindungan untuk mengurangkan risiko ini.

alam Sekitar Pembolehubah
Kod untuk mengisi pembolehubah persekitaran adalah di luar skop sub-
cangkerang. Ia menghuraikan pada watak-watak ? dan &, jadi lebih sukar untuk pelanggan lakukan
serangan "suntikan". Sebagai contoh, foo.cgi?a=test;cat / etc / passwd boleh mengakibatkan
pembolehubah yang diberi nilai ujian dan kemudian hasil larian kucing
/ etc / passwd dihantar kepada pelanggan. Haserl akan memberikan pembolehubah sebagai lengkap
nilai: ujian;kucing / etc / passwd

Adalah selamat untuk menggunakan pembolehubah "berbahaya" ini dalam skrip shell dengan melampirkannya
petikan; walaupun pengesahan harus dilakukan pada semua medan input.

Privilege Menurun
Jika dipasang sebagai skrip suid, haserl akan menetapkan uid/gidnya kepada pemiliknya
skrip. Ini boleh digunakan untuk mempunyai satu set skrip CGI yang mempunyai pelbagai
keistimewaan. Sekiranya haserl binari tidak dipasang suid, maka skrip CGI akan
dijalankan dengan uid/gid pelayan web.

Tolak arahan selaras parameter diberikan on yang URL
Jika URL tidak mengandungi "=" yang tidak dikodkan, maka spesifikasi CGI menyatakan pilihan
akan digunakan sebagai parameter baris arahan kepada program. Sebagai contoh, mengikut
kepada spesifikasi CGI: http://192.168.0.1/test.cgi?--upload-limit%3d2000&foo%3dbar
Harus menetapkan had muat naik kepada 2000KB sebagai tambahan kepada menetapkan "Foo=bar". Untuk melindungi
terhadap pelanggan yang membolehkan muat naik mereka sendiri, haserl menolak sebarang pilihan baris arahan
melampaui argv[2]. Jika dipanggil sebagai #! skrip, penterjemah ialah argv[0], semua
pilihan baris arahan yang disenaraikan dalam #! baris digabungkan menjadi argv[1], dan
nama skrip ialah argv[2].

LUA


Jika disusun dengan sokongan lua, --shell=lua sebaliknya akan mendayakan lua sebagai bahasa skrip
daripada bash shell. Pembolehubah persekitaran (SCRIPT_NAME, SERVER_NAME, dll) diletakkan di dalamnya
jadual ENV, dan pembolehubah bentuk diletakkan dalam jadual FORM. Sebagai contoh, yang
Borang rujukan sendiri di atas boleh ditulis seperti ini:

#!/usr/local/bin/haserl --shell=lua
jenis kandungan: teks/html


Contoh Borang
" method="GET">
<% # Lakukan beberapa pengesahan asas FORM_textfield
# Untuk mengelakkan serangan web biasa
FORM.textfield=string.gsub(FORM.textfield, "[^%a%d]", "")
%>
<input type=text name=textfield
Value="<% io.write (string.upper(FORM.textfield)) %>" cols=20>




Operator <%= ialah gula sintaksis untuk io.tulis (menjalin( ... )) Jadi, sebagai contoh,
Value= baris di atas boleh ditulis: Nilai="<%= string.atas(FORM.textfield) %>" cols=20>

skrip haserl lua boleh menggunakan fungsi tersebut haserl.loadfile(nama fail) untuk memproses sasaran
skrip sebagai skrip haserl (lua). Fungsi mengembalikan jenis "fungsi".

Sebagai contoh,

bar.lsp
<% io.write ("Hello World") %>

Mesej anda ialah <%= gvar %>

-- Akhir Sertakan fail --

foo.haserl
#!/usr/local/bin/haserl --shell=lua
<% m = haserl.loadfile("bar.lsp")
gvar = "Jalankan sebagai m()"
m ()

gvar = "Muat dan jalankan dalam satu langkah"
haserl.loadfile("bar.lsp")()
%>

Berlari foo akan menghasilkan:

Hello World
Mesej anda Jalankan sebagai m()
-- Akhir Sertakan fail --
Hello World
Mesej anda Muatkan dan jalankan dalam satu langkah
-- Akhir Sertakan fail --

Fungsi ini memungkinkan untuk mempunyai halaman pelayan haserl bersarang - coretan halaman
yang diproses oleh tokenizer haserl.

LUAC


. luac "shell" ialah ketulan lua yang telah disusun terlebih dahulu, jadi pengeditan dan ujian skrip secara interaktif
tidak mungkin. Walau bagaimanapun, haserl boleh disusun dengan sokongan luac sahaja, dan ini membolehkan
sokongan lua walaupun dalam persekitaran memori yang kecil. Semua ciri haserl lua yang disenaraikan di atas adalah
masih ada. (Jika luac ialah satu-satunya shell yang dibina ke dalam haserl, haserl.loadfile ialah
dilumpuhkan, kerana penghurai haserl tidak dihimpun.)

Berikut ialah contoh skrip remeh, ditukar kepada skrip luac cgi:

Memandangkan ujian fail.lua:
print ("Jenis Kandungan: teks/plain0)
print ("UID anda untuk larian ini ialah: " .. ENV.SESSIONID)

Ia boleh disusun dengan luac:
luac -o test.luac -s test.lua

Dan kemudian tajuk haserl ditambahkan kepadanya:
echo '#!/usr/bin/haserl --shell=luac' | kucing - test.luac >luac.cgi

Sebagai alternatif, adalah mungkin untuk membangunkan keseluruhan tapak web menggunakan cangkang lua standard,
dan kemudian minta haserl sendiri memproses skrip untuk pengkompil luac sebagai sebahagian daripada a
proses membina. Untuk melakukan ini, gunakan --shell=lua, dan bangunkan tapak web. Apabila siap dibina
persekitaran masa jalan, tambah baris --debug pada skrip lua anda dan jalankan ia mengeluarkannya
keputusan ke fail sumber .lua. Sebagai contoh:

Memandangkan ujian skrip haserl.cgi:
#!/usr/bin/haserl --shell=lua --debug
Jenis Kandungan: teks/biasa

UUID anda untuk larian ini ialah <%= ENV.SESSIONID %>

Prakompil, susun dan tambah pengepala haserl luac:
./test.cgi > test.lua
luac -s -o test.luac test.lua
echo '#!/usr/bin/haserl --shell=luac' | kucing - test.luac >luac.cgi

Gunakan haserl dalam talian menggunakan perkhidmatan onworks.net


Ad


Ad