ساخت یک اینترفیس تحت وب برای کارهای سیستمی با php و python

by Ahmed on ۲۴/۰۵/۱۳۸۹

مدتها پیش مقاله ای نوشته بودم در باب اجرای دستورات خط فرمان درphp تو اون اشاره کرده بودم که در php توابعی وجود داره که میشه دستورات سیستمی مثل ls,pwd,.. رو اجرا کرد .
اما امروز بر اون شدم که با راهنمایی های استادم، اقای مقدم یه رابط کاربری تحت وب برای کارهای سیستمی بسازم!
اول رفتم سراغ php که مثلا بلدمش!و از اونجایی که حسو حال ساختن فرم ورود اطلاعات رو نداشتم از سایت http://www.phpform.org استفاده کردم و یه اینترفیس برای یه دیوار اتش ساده ساختم به شکل زیر:

و بعد از اون امدم خروجی فرم بالا رو گرفتم و تبدیل کردم به دستور موردنظر با کمک آرایه های انجمنی:

$query=”iptables “;

foreach($_POST as $name=>$value){

if($name!=”form_id” && $name!=”submit”)

if($value!=”")

$query.=”-”.$name.” “.$value.” “;

}

file_put_contents(“query”, $query);

?>

اما چرا تو این کد من به جای ریختن دستور ساخته شده درون یک فایل از همون توابع exec یا system استفاده نکردم؟ خوب بخاطر اینکه در این توابع، برد دستوراتی که میتونن اجرا کنن مساوی با برد کاربری که php و apache رو اجرا میکنه و ایشونم جناب nobody هست که کمترین مجوز ها رو داره و نمیتونه دستور iptabels رو اجرا کنه پس ما دستور ساخته شده رو میریزیم تو یک فایل و بعد با یک روش دیگه و سطح دسترسی بالاتر اونو اجرا میکنیم!
برا این کار بنده میام به فایل query مجوز اجرایی میدم بعد این فایل رو با استفاده از crontab مدام، مثلا هر یک دقیقه اجرا میکنم!

crontab -e
*/1 * * * * /var/www/web_interface/query 2&1>/cron.log

برای آشنایی با cron به لینک زیر مراجعه کنید:

http://adminschoice.com/crontab-quick-reference

اما خدا روز بد نده که اجرا نشدنشو دنبال ارور گشتنو کد ۱۲۷ ما بقی چیز میزاو این مرجع:

http://www.linuxtopia.org/online_books/advanced_bash_scripting_guide/exitcodes.html

ما رو بد جور سر کار گزاشت، نگو باید مسیر کامل دستور رو بنویسیم که در توزیعی که من استفاده میکنم به این صورته:

/sbin/iptables

و می باید کد بالا رو تصحیح کنم شما هم با دستور whereis میتونید بفهمید این دستورتون تو کدوم مسیره!
خلاصش این شد که پس از کلی تحقیق و آزمون خطا که شما خیلی خلاصه دارید میبینید تونستم با تاخیر حداکثر یک دقیقه ای هر دستوری رو که بخوام با رابط کاربری سمت وب بسازمو اجرا کنم!
ولی خوب اینجا چند تا بحث هست!
چه طور میشه این تاخیر یک دقیقه ای رو بر داشت؟
چطور میشه امنیت کل موضوع رو تضمین کرد؟
اصلا چرا از اول، کاربر آپاچی رو root نکنیمو راحت با توابعی مثل exec کارمونو نکنیم؟

از آخر شروع میکنم ! بخاطر اینکه اگه یه باگ تو آپاچی و php و … باشه، یه هکر با استفاده از اون باگ و سطح دسترسی root دخل سرورو میاره!
اینکه چطور میشه امنیت رو تضمین کرد؟ ! جواب هیچطوره، ولی میشه محکم کاری کرد با جدا کردن اینترفیس و قسمت اجرایی کد و چک کردن کد ها قبل از اجرا و یا مثلا به جای استفاده از apache که برای این کار یه غول بیابونی حساب میشه از lighttpd استفاده کینم و برای محکم کاری بیشتر حتی اونو توjail اجرا کنیم یا مثلا با drop root privilege اجراش کنیم!
و میرسیم به جواب اولین سوال: میشه بجای کرون از یه برنامه پرل یا پایتون یا .. استفاده کنه که یه daemon مستقر کنه و همیشه در حال مانیتور باشه. اینجوری اگه وب سرورو اینترفیس ما هک شد این daemon میتونه ایزوله بمونه!
حالا ممکنه سوال پیش بیاد این daemon با وب اینترفیس چطور ارتباط برقرار میکنه؟
میتونه یه فیلدو مثلا هر ۵ ثانیه تو دیتابیش چک کنه که اگه یک بود بره دستورو اجرا کنه و اون فیلدو صفر کنه.
یا مثلا از unix socket استفاده کنه یا یه پورت رو ۱۲۷٫۰٫۰٫۱ باز کنه و اینطوری ارتباط برقرار کنه.
البته شاید بشه از stored procedure در بعضی پایگاه داده ها برای این کارا استفاده کردو دیگه اینهمه کار نخواد!
خوب برای دیدن خروجی که با php ساخته شده به لینک زیر مراجعه کنید وحتما اضافه کردن کرون یادتون نره.

دریافت اینترفیس تحت php

در مرحله بعد فکر کردم آیا میشه این کارو آسونتر و به صورت مجتمع انجام داد که فکرم رفت سراغ پایتون و توفیقی شد که با این زبان زیبا و آسونم آشنا بشم.
اول دنبال یه وب سرور با زبان پایتون گشتم که به لینک زیر رسیدم:

http://fragments.turtlemeat.com/pythonwebserver.php

که از کتابخونه BaseHTTPServer ایتفاده میکنه و خیلی زیباس:

http://docs.python.org/library/basehttpserver.html

http://wiki.python.org/moin/BaseHttpServer

http://docs.python.org/release/2.5.2/lib/module-BaseHTTPServer.html

http://docs.python.org/library/simplehttpserver.html

http://www.pylearn.com/fa/wiki/index.php/Tricks:web_server

و کار اون بخش قبلی رو که با آرایه های انجمنی انجام میدادم تو این قسمت به صورت زیر انجام دادم :

myquery=”/sbin/iptables “

for key, value in query.items():

if value[0] “” :

if key “j” :

myquery=myquery+”-”+key+” “

myquery=myquery+value[0]+” “

else:

temp=value[0]

myquery=myquery+” -j “+temp

و در کل برای اجرای کدهای python به چند نکته اشاره میکنم اول اینکه

myquery=”/sbin/iptables “

بر اساس جایی که در توضیع شما هست تنظیم کنید و بعد با sudo python webserver.py
وب سرورو اجرا کنن و با ادرس

http://127.0.0.1:8080

اونو ببنید!
این برنامه هم هنوز خیلی ناقصه و خیلی جاهاش باید تصحیح بشه ولی در حد نشون دادن ایدش هست:

اینترفیس تحت وب با python

شاید استفاده از CGI به صلاح تر باشه ! یه سری لینک مفید دیگه :

http://wiki.python.org/moin/CgiScripts

http://wiki.python.org/moin/WebProgramming

http://wiki.python.org/moin/WebServers

http://wiki.python.org/moin/IntegratedDevelopmentEnvironments

پ .ن : این وردپرس بابامو در آودر بس که نتونست لینک کنه یا مثلا دایرکشنو درست کنه! خلاصه شما ببخشین من سعیمو کردم

پ  . ن .۲ : چون کل برنامه داره سعی میکنه فایروالو با اینترفیس پیاده کنه شما باید آشنایی خوبی با iptables داشته باشین ! البته وب اینترفیس باید کاری کنه که این علم لازم نباشه ولی فعلا که نتونسته برای آشنایی با این دستور دعوت میکنم مقاله دوستم آقای حبیبی رو مطالعه کنید .

مقاله آشنایی با iptables آقای حبیبی

[email protected]

There are 5 comments in this article:

  1. ۲۴/۰۵/۱۳۸۹فرید says:

    دوست خوبم آقای بهروز شعبانی لینک زیرو پیشنهاد داد حتما نگاه کنیم:http://www.suphp.org/Home.html

  2. ۲۶/۰۶/۱۳۸۹پسرک says:

    جالب بود فقط ۲ تا نکته
    ۱- یه syntaxhighliter اگر داشتی بهتر بود
    ۲- مگه پایتونم تو کار می کنی؟

    در کل جالب بود. خیلی وقت پیش که تو بیمارستان کار می کردم اونا یه همچین چیزایی ازم می خواستن که با بدبختی با c extension براشون نوشتم

  3. ۲۸/۰۶/۱۳۸۹فروشگاه اینترنتی says:

    سلام خسته نباشید
    من از طرف سایت فروشگاهی
    http://www.gostore.ir
    با شما تماس می گیرم.
    ما مایلیم با سایت شما تبادل لینک کنیم
    به این صورت که ما لینک شما را در لینک دوستان خودمان و شما لینک ما را در لینک دوستان خودتان قرار بدین اگر مایلید.
    ما را در لیست دوستان خود قرار بدهید
    و بعد در بخش تماس با مای سایتمان پیغام بگزارید
    تا ما هم همان روز شما را در لینک دوستانمان قرار بدهیم
    ما را با نام ” فروشگاه اینترنتی” و به آدرسه
    http://www.gostore.ir
    ثبت کنید

  4. ۲۸/۰۶/۱۳۸۹M0TRIX says:

    سلام. همشهری خوبی ؟

    دارمت ایول

  5. ۲۹/۰۶/۱۳۸۹فرید says:

    @پسرک:
    ۱. شرمنده
    ۲. همون روز کار کردم :)) یعنس اول با php نوشام بعد امدم با پایتونم سعی کردم پیاده کنم
    در کل لطف داری ایشالله همایش سال بعد اراده بدم ;)

    @MOTRIX
    سلام.ممنونم

Write a comment: