قدم دوم :
در ادامه مطلب قبلی باید این نکته رو بگم که حالا وقت این رسیده یک صفحه ورود خوب و امن داشته باشین . اصولا قاعده ای که در اکثر سیستم های ورود رعایت میشه اینه که یوزرنیم + پسورد از مراجعه کننده خواسته میشه . بعد میره توی دیتابیس و صحت پسورد تایید میشه . session تشکیل میشه . به صفحه اصلی مدیریت ارجاع داده میشه .
حالا ممکنه یوزرنیم و پسورد همیشه با یک عبارت ثابت سنجیده بشه . یعنی کار به دیتابیس کشیده نشه .
if request("username") = "admin" and request("password")="myadmin" then
session("admin")=true
response.redirect "admin.asp"
else
session("admin")=false
response.redirect "login.asp?msg=error"
end if
اما قضیه بغرنج قضیه همون وارد شدن ورودی کاربر به دیتابیس بدون هیچ گونه عملی رو داده هست . که اگه این قسمت رو رعایت کنید تا حد زیادی امنیت برنامه تون رو تامین کردید .
اینجا درباره تاریخچه و اصول sql injection یا همون تزریق اطلاعات نمی خوام وارد بشم . مقالات بسیار زیاد و توضیحات فراوانی در این زمینه هست . ما فقط میخوام راه مقابله باهاش رو یاد بدیم دیگه بقیه توضیحات "در این مقال نمی گنجد" . اما از اونجایی که ندانسته کار کردن خطاست چندتا منبع میذارم که مطالعه کنید .
http://kapda.ir/pedia/SQL_Injection
http://en.wikipedia.org/wiki/Sql_injection
خب برگردیم به کار خودمون . تامین امنیت برنامه های وب که با asp نوشته شدن .
اما اگه قرار هست که یوزرنیم و پسوردی که وارد می کنیم همین طوری یه دفعه بره تو دیتابیس و جواب بیرون بیاد در یک کلام میشه گفت یک حرکت "هکر شاد کن" .
مهم نیست که دستورات sql ما چطور کار می کنند و به چه روشی به تعیین هویت می پردازن مهم اینه که در همه اونها هر عبارتی که داخل query قرار میگیره یه فیلترینگ کوچیکی بشه .
حداقل برای دوستانی که با access کار می کنن بگم که فیلتر کردن کوتیشن تکی لازم هست .
برای کسانی هم که با sql کار میکنن -- و ; و " لازم هست . البته کاراکترهای دیگه هم هستن مثل تمامی اون چیزهایی که روی دکمه های اعداد درج شدن . مثل !@#$%^&*)(=
پس یک نمونه ضعیف از Query
"SELECT * FROM users WHERE name = '" & userName & "'" & " and pass = '" & password & "'"
و نمونه قابل قبول برای اکسس :
"SELECT * FROM users WHERE name = '" & replace(userName,"'","''") & "'" & " and pass = '" & replace(password,"'","''") & "'"
توضیح : replace برای امن کردن و تبدیل تک کوتیشن به دو کوتیشن به کار رفت .
اما این نکته رو هم یادتون نره که در این الگوریتم session فراموش نشه . چون فرض کنید بدون session بخواین صفحه رو منتقل کنید به admin.asp . خب حالا فرض کنید هکر شانسی مستقیم url رو http://site.com/admin/admin.asp زد . بعد هم میره صفحه ادمین . فردا میاین میبینین سایتتون توسط یه گروه هک شده . پس این وسط نقش login.asp چیه ؟ بعد از صحت رمز ورودی ایجاد یک session که در بقیه صفحات مثل admin.asp بدین ترتیب استفاده بشه :
if session("admin") <> true then
response.redirect "login.asp?msg=sorry you must login"
response.end
end if
خلاصه : یک صفحه ورود نسبتا خوب که معمولا الگوریتم مشخصی هم داره اینه که -->
1)گرفتن یوزرنیم و پسورد از بازدید کننده و فیلتر کردن ' و ; و " و -- و دیگر کاراکترها به وسیله تابع replace
2)تعیین اینکه آیا یوزر نیم و پسورد گرفته شده از بازدید کننده (که صد البته منظورم یوزرنیم و پسورد بعد از اجرای فیلتر و محدود کردن اون) صحیح هست یا نه به وسیله sql و asp .
3)اگه صحیح بود تشکیل session و ارجاع به صفحه اصلی مدیریت و چک شدن session در اون صفحه اصلی و سایر صفحات مدیر برای اینکه یه موقع خدای نکرده هکر مستقیم url رو وارد نکرده باشه .