احراز هویت بدون ترس php. HTTP نصب امنیت در صفحه با استفاده از MySQL و PHP. کاربرد. متن های منبع اسکریپت

برای ارسال پیام "Authentication Required" به مرورگر مشتری، که به نوبه خود یک کادر محاوره ای برای وارد کردن نام کاربری و رمز عبور ایجاد می کند. پس از اینکه مشتری نام و رمز عبور خود را وارد کرد، اسکریپت دوباره فراخوانی می شود، اما با متغیرهای از پیش تعریف شده PHP_AUTH_USER، PHP_AUTH_PW و AUTH_TYPE که به ترتیب شامل نام کاربری، رمز عبور و نوع احراز هویت هستند. این متغیرها را می توان در آرایه های $_SERVER و $HTTP_SERVER_VARS یافت. در حال حاضر فقط احراز هویت "Basic" پشتیبانی می شود. همچنین می توانید توضیحات دقیق تری از عملکرد را بخوانید سرتیتر() .

نمونه ای از قطعه اسکریپت که مشتری را مجبور می کند برای مشاهده صفحه وارد سیستم شود:

نمونه احراز هویت HTTP

if (!isset($_SERVER [ "PHP_AUTH_USER" ])) (
سرتیتر( "WWW-Authenticate: Basic Realm="My Realm"");

اکو "متن برای ارسال اگر
اگر کاربر روی دکمه لغو کلیک کرد"
;
خروج؛
) دیگر (
اکو
"

سلام ($_SERVER["PHP_AUTH_USER"]).

" ;
اکو "

شما یک رمز عبور ($_SERVER["PHP_AUTH_PW"]) وارد کرده اید.

"
;
}
?>

نکته سازگاری:هنگام تعیین هدرهای HTTP به ویژه مراقب باشید. برای تضمین حداکثر سازگاری با بیشترین تعداد کلاینت های مختلف، کلمه "Basic" باید با حروف بزرگ "B" باشد، منطقه (قلمرو) باید در گیومه های دوتایی (نه تکی!) محصور شود و دقیقاً یک فاصله باید قبل از علامت باشد. کد 401 در عنوان HTTP/1.0 401 .

به جای اینکه فقط متغیرهای PHP_AUTH_USER و PHP_AUTH_PW را روی صفحه نمایش دهید، ممکن است لازم باشد درستی آنها را بررسی کنید. برای این کار از پرس و جو استفاده کنید پایگاه دادهیا کاربر را در فایل dbm جستجو کنید.

می توانید ویژگی های مرورگر را مشاهده کنید اینترنت اکسپلورر. در مورد پارامتر هدرهای ارسالی بسیار خواستار است. مشخصات هدر WWW-Authenticateقبل از ارسال HTTP/1.0 وضعیت 401 یک ترفند کوچک است.

از PHP 4.3.0، به منظور جلوگیری از نوشتن اسکریپتی که رمز عبور را برای صفحه‌ای که از احراز هویت خارجی استفاده می‌کند، نشان می‌دهد، متغیرهای PHP_AUTH تنظیم نمی‌شوند. این صفحهاز احراز هویت خارجی استفاده می کند و روی حالت امن تنظیم شده است. صرف نظر از این، متغیر REMOTE_USER می تواند برای احراز هویت یک کاربر تأیید شده خارجی استفاده شود. بنابراین همیشه می توانید از متغیر $_SERVER["REMOTE_USER"] استفاده کنید.

توجه داشته باشید: PHP از دستورالعمل AuthType برای تعیین اینکه آیا احراز هویت خارجی استفاده می شود یا خیر استفاده می کند.

لازم به ذکر است که تمامی موارد فوق مانع از سرقت رمزهای عبور صفحاتی که نیاز به مجوز دارند توسط افرادی که صفحات بدون مجوز واقع در همان سرور را کنترل می کنند، نمی شود.

هر دو Netscape Navigator و Internet Explorer پس از دریافت از سرور، کش احراز هویت پنجره فعلی را برای قلمرو داده شده پاک می کنند. این می تواند برای وادار کردن کاربر به خروج از سیستم و نمایش مجدد کادر محاوره ای نام کاربری و رمز عبور استفاده شود. برخی از توسعه دهندگان از این برای محدود کردن ورود به سیستم یا ارائه دکمه خروج استفاده می کنند.

نمونه ای از احراز هویت HTTP با ورود اجباری یک جفت ورود/گذرواژه جدید

تابع authenticate()(
سرتیتر( "WWW-Authenticate: Basic realm="Test Authentication System"");
header ("HTTP/1.0 401 غیر مجاز");
اکو "برای دسترسی به منبع باید یک نام کاربری و رمز عبور معتبر وارد کنید \n";
خروج؛
}

اگر (!isset($_SERVER [ "PHP_AUTH_USER" ]) ||
($_POST [ "SeenBefore" ] == 1 && $_POST [ "OldAuth" ] == $_SERVER [ "PHP_AUTH_USER" ])) (
تصدیق کردن ();
}
دیگر(
اکو
"

خوش آمدید: ($_SERVER["PHP_AUTH_USER"])
" ;
اکو "ورود به سیستم قبلی: ($_REQUEST["OldAuth"])";
اکو "

\n";
اکو "\n";
اکو "\n";
اکو "\n";
پژواک"

\n"
}
?>

این رفتار توسط استانداردهای HTTP Basic Authentication تعریف نشده است، بنابراین نباید به آن وابسته باشید. همانطور که آزمایش‌ها نشان داده است، مرورگر Lynx هنگام دریافت وضعیت 401 از سرور، حافظه پنهان مجوز را پاک نمی‌کند و با کلیک بر روی «Back» و سپس «Forward» به ترتیب، می‌توان چنین صفحه‌ای را باز کرد. ویژگی های مجوز تغییر نکرده است. با این حال، کاربر می تواند کلید "_" را برای پاک کردن کش احراز هویت فشار دهد.

همچنین توجه داشته باشید که قبل از PHP 4.3.3، اگر PHP به عنوان یک ماژول CGI نصب شده بود، به دلیل برخی محدودیت‌های IIS، احراز هویت HTTP روی سرورهایی که مایکروسافت IIS را اجرا می‌کردند، کار نمی‌کرد. برای به دست آوردن عملکرد صحیحدر PHP 4.3.3+، باید تنظیمات پیکربندی IIS به نام "Directory Security" را ویرایش کنید. روی برچسب "Edit" کلیک کنید و گزینه "Anonymous Access" را علامت بزنید، تمام فیلدهای دیگر باید بدون علامت باقی بمانند.

محدودیت دیگر اگر از IIS از طریق ISAPI استفاده می کنید: متغیرهای PHP_AUTH_* تعریف نشده اند، اما متغیر HTTP_AUTHORIZATION در دسترس است. کد مثالی که می توانید استفاده کنید: list($user, $pw) = explode(":", base64_decode(substr($_SERVER["HTTP_AUTHORIZATION"], 6)));

نکته در مورد IIS:برای اینکه احراز هویت HTTP در IIS به درستی کار کند، گزینه cgi.rfc2616_headers در پیکربندی PHP باید روی 0 (مقدار پیش فرض) تنظیم شود.

توجه:در صورت استفاده از حالت محافظت شده، UID اسکریپت فعلی به قسمت قلمرو هدر WWW-Authenticate اضافه خواهد شد.



<<< Назад محتوا جلو >>>
اگر سؤالات بیشتری دارید یا چیزی روشن نیست - به ما خوش آمدید

محدود کردن دسترسی به برخی از مناطق سایت معمولاً به نظر می رسد
یکنواخت: به هر کاربر یک لاگین و رمز عبور داده می شود یا خودش
آنها را انتخاب می کند و برای ورود به قسمت امن سایت باید آنها را وارد کنید. از نقطه نظر فنی، تأیید رمز عبور استفاده می کند
روش های مختلف برای وارد کردن نام کاربری و رمز عبور می توان از فرم HTML استفاده کرد.
در این صورت رمز عبور به صورت متن واضح در درخواست POST به سرور ارسال می شود.
اگر کاربر در صورت امکان در شبکه LAN باشد، این غیر قابل قبول است
با استفاده از یک اسنایفر برای حل این مشکل، روشی ایجاد شده است
احراز هویت هش، که در آن رمز عبور منتقل نمی شود، اما
یک رشته هش بسته به رمز عبور، یکبار ارسال می شود
پارامتر و احتمالاً از هر پارامتر دیگری. این روش هنوز هست
چالش/پاسخ نامیده می شود زیرا وقتی از آن استفاده می کنید، مشتری
یک درخواست با یک پارامتر یک بار دریافت می کند و یک پاسخ حاوی هش ارسال می کند. در سطح پروتکل HTTP 1.1، احراز هویت با استفاده از روش امکان پذیر است
اساسی که چیزی نیست استفاده بهترفرم های HTML و Digest که
ما به تفصیل در نظر خواهیم گرفت.

هنگام استفاده از روش Digest، همانطور که قبلا ذکر شد، رمز عبور
منتقل نمی شود و نمی توان آن را استشمام کرد، اما یک طرف دیگر وجود دارد
چالش ها و مسائل. برای تایید رمز عبور، سرور باید محاسبه کند
پاسخ دهید و آن را با پاسخ مشتری مقایسه کنید، بنابراین سرور باید
ذخیره رمز عبور یا داده های وابسته به آن، لازم برای
عبور از احراز هویت نتیجه می شود که شخصی که حقوق دریافت کرده است
برای خواندن حساب ها (به عنوان مثال، با استفاده از SQL-injection)، قادر به دریافت خواهید بود
دسترسی به صفحات محافظت شده توسط روش Digest. هنگام استفاده از روش
اساساً امکان ذخیره هش به جای رمزهای عبور وجود دارد که اجازه افزایش حقوق را نمی دهد.
پس از خواندن این هش ها (در زیر خواهیم دید که Digest می تواند هش ها را نیز ذخیره کند،
اما به گونه ای که دانش آنها برای محاسبه پاسخ کافی باشد). بنابراین، ما با یک دوراهی روبرو هستیم: یا رمز عبور ما بو داده می شود،
یا آنها آن را از طریق یک آسیب پذیری وب دریافت می کنند که کسی قطعاً آن را پیدا خواهد کرد،
زیرا هر که جستجو کند همیشه خواهد یافت. آیا روش احراز هویت بدون وجود دارد
هر دوی این کاستی ها - روش احراز هویت کلید عمومی:
شما به یک کلید عمومی برای تأیید و یک کلید مخفی برای تأیید نیاز دارید،
با این حال، HTTP 1.1 چنین روشی را ارائه نمی دهد. RFC 2069
اگر امنیت بسیار مهم است، استفاده از SSL را توصیه می کند. فقط انتقال رمز عبور محافظت می شود و محتوا رمزگذاری نشده است، بنابراین
که حفاظت از منابع با این روش، از جایی که کاربر از کجاست، معنی ندارد
دریافت می کند اطلاعات طبقه بندی شده. آنها به SSL نیاز دارند. و منطقی است
برای محافظت، به عنوان مثال، یک انجمن یا آپلود محتوا در یک سایت. بنابراین، اگر هاست از SSL پشتیبانی نمی کند، باید احراز هویت انجام شود
برای ایمن بودن، از Digest استفاده خواهیم کرد. آپاچی دارای یک ماژول mod_digest است. برای استفاده از آن
در پیکربندی (یا در htaccess.) می نویسیم:

خلاصه AuthType
AuthUserFile<файл>
AuthName<название защищаемой области>
نیاز به valid_user

فایل های کاربر توسط ابزار ایجاد می شوند
htdigest. Mod_digest برای مدتی آسیب پذیر گزارش شده است، بنابراین،
شاید هنوز مشکلاتی وجود داشته باشد. علاوه بر این، زمانی که
من سعی کردم از آن در خانه استفاده کنم، یک خطا دریافت کردم
خطای داخلی سرور 500. علاوه بر این، اگر اضافه کردن حساب ها باید رخ دهد
به طور خودکار، و باید تعداد زیادی از آنها وجود داشته باشد، آنها باید
نه در پیکربندی آپاچی، بلکه در MySQL ذخیره شود. راه حل -
php استفاده کنید PHP پشتیبانی داخلی برای این ندارد.
روش، بنابراین باید اجرا شود. برای این کار مطالعه لازم است
این روش به تفصیل من بلافاصله توجه می کنم که مقاله ارائه شده در این مقاله
پیاده سازی فقط روی آپاچی کار می کند زیرا دسترسی کامل به هدرها وجود دارد
درخواست (تابع apache_request_headers) فقط در آپاچی کار می کند، اما روشن است
سرورهای دیگر ممکن است در دسترس نباشند. فقط باید بخونیم
سرصفحه مجوز.

شرح روش

شرح کامل روش را می توان در RFC 2069 یافت، و اگر
به طور خلاصه، روش به این صورت عمل می کند. هنگامی که سرور درخواستی مربوط به یک منطقه محافظت شده دریافت می کند،
یک خطای 401 Authorization Required و یک هدر درخواست می اندازد
احراز هویت به این صورت:

WWW-Authenticate: Digest realm="منطقه امن"، nonce="123456123456"

قلمرو نام منطقه حفاظت شده و nonce یک بار است
معنی پارامترهای اختیاری بیشتری وجود دارد که در مورد آنها بحث می کنیم
ما نخواهیم. مشتری درخواست را با هدر مانند زیر تکرار می کند:

مجوز: Digest realm="منطقه امن"، username="123", uri="/index.php", nonce="123456123456", answer="1234567890abcdef1234567890abcdef"

پارامتر uri باید با URI موجود در درخواست مطابقت داشته باشد و پاسخ آن است
پاسخ که به صورت زیر محاسبه می شود:

پاسخ = H(H(A1) + ":" + nonce + ":" + H(A2))
H - تابع هش، پیش فرض MD5
A1 = ورود + ":" + قلمرو + ":" + رمز عبور
A2 = روش درخواست + ":" + URI
روش درخواست GET، POST و غیره است.

همانطور که می بینید، A1 به پرس و جو یا یکبار مصرف بستگی ندارد
مقادیر، بنابراین سرور ممکن است رمز عبور را ذخیره نکند، اما
H(A1). به این صورت است که در mod_digest در آپاچی پیاده سازی می شود.
با این حال، همان داده ها برای مشتری کافی است. مهاجم، با دریافت
این هش، می تواند پاسخ را با فرمول های بالا محاسبه کند و
برای مثال با استفاده از برنامه یک درخواست HTTP ایجاد کنید
AccessDriver و ابزار HTTP آن
اشکال زدا این فرآیند با جزئیات بیشتر در زیر نشان داده خواهد شد. سرور باید بررسی کند که آیا مقدار یک nonce است یا خیر
موردی که قبلاً برای مشتری صادر شده است و اینکه آیا تاریخ گذشته است یا خیر.
اگر پاسخ با پارامتر nonce، اما با مقدار این پارامتر مطابقت داشته باشد
مربوط نیست، پاسخی که در بالا با کد 401 توضیح داده شد تنها با کد 401 صادر می شود
تفاوت این است که هدر WWW-Authenticate با پارامتر اضافه می شود
stale=true نشان می دهد که دسترسی تنها به این دلیل ممنوع است،
و باید بدون درخواست از کاربر برای رمز عبور جدید دوباره امتحان کنید. این، IMHO، ناخوشایند است، زیرا اگر چنین وضعیتی ایجاد شود
هنگام درخواست یک POST یا PUT با یک بلوک بزرگ از داده، مشتری باید این کار را انجام دهد
همه داده ها را دوبار انتقال دهید برای جلوگیری از این امر، استاندارد ارائه می دهد
هدر Authentication-Info، که سرور هنگام پاسخ دادن به آن ممکن است
یک درخواست موفق، مشتری را از درخواست بعدی مطلع می کند.
سینتکس مانند WWW-Authenticate است، به جز nonce
با nextnonce جایگزین می شود. با این حال، با قضاوت بر اساس نتایج من
آزمایش‌ها، Opera این هدر را نادیده می‌گیرد. راه حل دیگر: با توجه به
RFC 2068 (HTTP/1.1)، سرور ممکن است قبل از تکمیل درخواست پاسخ دهد،
به طوری که مشتری انتقال داده های غیر ضروری را قطع می کند، اما در Apache+PHP این
اجرا نمی شود، زیرا اسکریپت تنها پس از آن شروع به اجرا می کند
چگونه آپاچی درخواست را به طور کامل دریافت و تجزیه می کند.

ذخیره سازی داده ها بین درخواست ها

نکته ظریفی در پیاده سازی روش چالش/پاسخ توسط PHP وجود دارد.
پارامتر یک بار در یک پاسخ تشکیل و برای مشتری صادر می شود و
قبلاً در جلسه دیگری از اسکریپت بررسی شده است.
یعنی باید از یک فراخوانی به اسکریپت دیگر ذخیره شود و برای این کار باید
از فایل ها یا پایگاه داده استفاده کنید مثال من از فایل هایی با نام،
مقادیر یکبار مصرف مربوطه، و خود فایلها حاوی
آدرس IP مشتریانی که برای آنها صادر شده است. مجموعه در مثال اجرا نشده است
زباله: شما باید به طور دوره ای فایل های قدیمی را حذف کنید.

تجزیه کد

این اسکریپت فقط رمز عبور را بررسی می کند و بدون توجه به آن کار می کند
وارد شدن. بسته به موفقیت چک، پاسخ های ساده صادر می شود.

$realm = "منطقه امن"; // نام منطقه حفاظت شده
$pass = "گذر"; // کلمه عبور
$fileprefix = "./"; // مسیر برای فایل های برچسب که اعتبار nonce را نشان می دهد

/* بیایید یک پارامتر یکبار مصرف را همانطور که در RFC2069 توصیه شده است بسازیم، هرچند که به روش دیگری امکان پذیر است. پارامتر، طبق توصیه، باید به آدرس مشتری، زمان فعلی و رشته مخفی بستگی داشته باشد. */
$nonce = md5($_SERVER["REMOTE_ADDR"] . ":" . time() . ":MyCooolPrivateKey");

// گرفتن سرصفحه
$headers = apache_request_headers();

// پرچم گذاری کنید که در تأیید موفقیت آمیز آن را روی TRUE تنظیم می کنیم
$auth_success = FALSE;
$stale = "";

// اگر سرصفحه Authorization وجود نداشته باشد، چیزی برای بررسی وجود ندارد
if (isset($headers["Authorization"]))
{
$authorization = $headers["Authorization"];

/* عنوان را با استفاده از یک عبارت منظم تجزیه کنید. عنوان حاوی کلمه "Digest" و یک لیست است
پارامترهای فرم param="value" یا param=value که با کاما از هم جدا شده اند. این عبارت منظم با یکی از این پارامترها مطابقت دارد.
*/
preg_match_all("/(،|\s|^)(\w+)=("([^"]*)"|([\w\d]*))(،|$)/",
$authorization، $matches، PREG_SET_ORDER)؛

/* اکنون برای راحتی پردازش بیشتر، یک آرایه تشکیل می دهیم که در آن کلیدها نام پارامترها هستند و مقادیر عناصر آرایه عبارتند از
مقادیر پارامتر
*/
$auth_params = array();
برای ($i = 0؛ $i< count($matches); $i++)
{
$match = $matches[$i];

/* نام همیشه در گروه دوم پرانتز است، بسته به اینکه در گیومه باشد یا نه، می تواند
در گروه 4 یا 5 باشید. برای گروه هایی از براکت های گرفته شده
به یک شاخه محقق نشده، یک رشته خالی در آرایه،
بنابراین شما فقط می توانید مقادیر را اضافه کنید.
*/
$auth_params[$match] = $match. $match;
}

/* پاسخی که مطابقت دارد را محاسبه کنید
ورود به سیستم وارد شده توسط کاربر، رمز عبور ما و پارامتر یک بار مصرف شده توسط کاربر.
*/
$a1 = $auth_params["نام کاربری"]. ":" . $auth_params["قلمرو"]. ":" . $pass;
$a2 = $_SERVER["REQUEST_METHOD"]. ":" . $_SERVER["REQUEST_URI"];
$resp = md5(md5($a1) . ":" . $auth_params["nonce"] . ":" . md5($a2));

// ما پاسخ را بررسی می کنیم.
اگر ($resp == $auth_params["response"])
{
//
بررسی ارتباط یک پارامتر یک بار مصرف
$fn = $fileprefix . $auth_params["nonce"];
if (@file_get_contents($fn) == $_SERVER["REMOTE_ADDR"])
{
unlink($fn)؛ //
این گزینه دیگر مرتبط نیست.
$auth_success = TRUE; //
احراز هویت پاس شد
) دیگری
{
// پارامتر یکبار مصرف بی ربط است
$stale = ", stale=true";
}
}
}

اگر ($auth_success)
{
چاپ(" تست احراز هویت Digest

print("با موفقیت احراز هویت\n");
var_dump ($auth_params);

چاپ("");

) دیگری
{
file_put_contents($fileprefix . $nonce، $_SERVER["REMOTE_ADDR"]);

$proto = $_SERVER["SERVER_PROTOCOL"];
Header("$proto 401 Not Authorized");
Header("WWW-Authenticate: Digest realm=\"$realm\", nonce=\"$nonce\"$stale");

چاپ(" تست احراز هویت Digest

");
print("شما باید با روش Digest احراز هویت کنید");
چاپ("
");
}

تصویب خلاصه Auth با H(A1) شناخته شده

من به عنوان مثال نشان خواهم داد که چگونه در صورت ناشناخته بودن رمز عبور، تأیید صحت انجام شود،
اما H(A1) شناخته شده است. برای انجام این کار، همانطور که قبلا ذکر شد، شما نیاز دارید
AccessDriver. من محاسبات هش را با تماس از خط فرمان انجام خواهم داد
PHP CLI. اجازه دهید صفحه محافظت شده در واقع شود
http://mrblack.local/auth1.php و هش H(A1) "a8fb5b2d780a7bf0782207a51a013f04" است.

AccessDriver->Tools->HTTP Debugger را باز کرده و آدرس را وارد کنید
"http://mrblack.local/auth1.php". روی "اتصال" کلیک کنید. ما گرفتیم:

HTTP Header = مجوز HTTP/1.1 401 مورد نیاز است
سربرگ HTTP = تاریخ: دوشنبه، 04 ژوئیه 2005، 08:09:17 GMT
HTTP Header = سرور: Apache/1.3.31 (Win32) PHP/5.0.2
HTTP Header=X-Powered-By: PHP/5.0.2
HTTP Header = WWW-Authenticate: Digest realm="منطقه امن"، nonce="5925bea78552224abda11bfe318a8a03"
HTTP Header = اتصال: بستن
HTTP Header = نوع محتوا: text/html

کنسول را باز کنید، به پوشه با PHP بروید و با دستور زیر درایو کنید:

php -r "چاپ md5("a8fb5b2d780a7bf0782207a51a013f04:
: ".md5("GET:http://mrblack.local/auth1.php"));"

ما پاسخ Digest مورد نظر را دریافت می کنیم: c6d0af0db239d75c
3f59640a4896d096
اکنون در AccessDriver، کادر "Header Data" را علامت بزنید، آن را در قسمت ظاهر شده کپی کنید
سرفصل های فیلدهایی که در درخواست قبلی ارسال شده اند و به آن ها اضافه کنید
مجوز. این چیزی است که اتفاق می افتد:

http://mrblack.local/auth1.php HTTP/1.1 را دریافت کنید
پذیرش: image/gif، image/x-xbitmap، image/jpeg، image/pjpeg، application/x-shockwave-flash، */*
Accept-Language: en-us,en;q=0.5
عامل کاربر: سازگار با موزیلا
میزبان: mrblack.local
پراگما: بدون کش
مجوز: نام کاربری خلاصه = "mrblack"، realm = "منطقه امن"، nonce="5925bea78552224ab
da11bfe318a8a03"، uri="http://mrblack.local/auth1.php"، answer="c6d0af0db239d75c3f59
640a4896d096"

روی "اتصال" کلیک کنید. نتیجه را می گیریم:

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

شما می توانید چنین صفحه ای را به چندین روش تکمیلی ببندید:

  1. حفاظت از رمز عبور (ورود / رمز عبور) با استفاده از متغیرها $_SERVER["PHP_AUTH_USER"]و $_SERVER["PHP_AUTH_PW"].
  2. حفاظت توسط IPآدرس مشتری با استفاده از یک متغیر $_SERVER["REMOTE_ADDR"].
  3. حفاظت توسط مکآدرس در شبکه های محلی (علاوه بر محافظت توسط IP).

اجازه دهید ابتدا روش اول را تحلیل کنیم که روش اصلی است. این به شما امکان می دهد دسترسی به صفحه را با ورود و رمز عبور ببندید، بنابراین فقط افرادی که لاگین و رمز عبور را می دانند می توانند دسترسی داشته باشند. علاوه بر این، آنها را می توان با توجه به این ویژگی تقسیم کرد و به ترتیب اطلاعات متفاوتی برای هر کدام ارائه داد. با صدور فیلدهای خاص در سربرگ پروتکل پیاده سازی می شود HTTP. بیایید یک تابع ایجاد کنیم auth_send():

" ,"

خطا احراز هویت

" ,"

برای دریافت نام کاربری و رمز عبور با سرپرست خود تماس بگیرید.

" ""; exit; ); ?>

این عملکرد به مرورگر اطلاع می دهد که برای دسترسی به مجوز از طریق ورود و رمز عبور نیاز است. و همچنین صفحه را وارد می کند HTMLبرای کاربر

" ,"

خوش آمدی!

" ,"

شما با استفاده از نام کاربری ",$auth_user" و رمز عبور ",$auth_pass," وارد سیستم شده اید.

" ,""; ?>

کد تأیید ورود و رمز عبور در این مورد چندان پیچیده نیست، زیرا برای یک نفر پیاده سازی می شود. اگر متغیری وجود نداشته باشد، منطق عملیات ساده است $_SERVER["PHP_AUTH_USER"]و $_SERVER["PHP_AUTH_PW"]یا مقادیر آنها با مقادیر مورد نظر مطابقت ندارد، سپس تابع را فراخوانی کنید auth_send(). فراموش نکنید که در پایان تماس می گیرد خروج، بنابراین برنامه خاتمه می یابد.

سطح بعدی حفاظت با فیلتر کردن اجرا می شود IPاتصال آدرس مشتری البته، در اینترنت، بسیاری از ارائه دهندگان موضوع IPآدرس ها برای مدتی و استفاده از این محافظت بی فایده است، اما اگر در مورد شبکه های محلی شرکتی صحبت می کنیم، این بررسی محافظت اضافی را ارائه می دهد.

IP شما پیدا نشد!!!"; exit; ); ?>

اینجا در صف $allowed_ipsبا یک فاصله جدا شده است IPآدرس هایی که اجازه دسترسی دارند بعد، با استفاده از یک آرایه دریافت می کنیم انفجار ()و آدرس مشتری را از آن جستجو کنید $_SERVER["REMOTE_ADDR"]. من از تابع جستجو استفاده کردم array_search()، از آنجایی که بعید است کد پیاده سازی شده او در C تا حدودی سریعتر از آنچه می توانیم در آن بنویسیم اجرا شود. PHPبا استفاده از چرخه ها براییا برای هر. اما سرعت اینجا مهم نیست :)

و آخرین مرحله دفاع، بررسی است مکآدرس ها. این به دسته پارانوئیدها تعلق دارد و اگر از شبکه محلی دسترسی دارید و داده هایی که از آن محافظت می کنید واقعاً بسیار مهم است باید استفاده شود. تا الان این چک را فقط روی سیستم پیاده کرده ام لینوکسبه دلیل سهولت نسبی اجرا اما می توانید سعی کنید آن را برای هر پلتفرم دیگری پیاده سازی کنید. یک تابع می نویسیم:

همانطور که Linuxoids قبلاً فهمیده اند، بر اساس آن است ARPجدول سیستم که با استفاده از فایل قابل دسترسی است /proc/net/arp. تابع رشته های مورد نیاز را جستجو می کند IPآدرس و برگردانید مکنشانی:

IP شما=192.168.10.15 و MAC=00:04:31:E4:F8:37

در سیستم پنجره هاشاید راه های دیگری برای به دست آوردن وجود داشته باشد مکساده تر، اما از آنهایی که واقعا کار می کنند، این نتیجه است ARPجداول سیستم با دستور:

C:\WINDOWS\>arp -a واسط: 192.168.10.15 در رابط 0x1000003 آدرس IP آدرس فیزیکی نوع 192.168.10.1 00-50-22-b0-6a-a-a-a-192.160-192.160-192.168.168. e8 dynamic 192.168.10.3 00-04-61-9e-26-09 dynamic 192.168.10.5 00-0f-38-6a-b1-18 dynamic

اگر واقعاً به آن نیاز دارید، می‌توانید حفاظت را بر اساس این آدرس پیاده‌سازی کنید :) اما به خاطر داشته باشید که اگر تجهیزات مدیریت نشده‌ای در شبکه خود دارید بدون اینکه امکان اتصال وجود داشته باشد. مکآدرس های پورت، این حفاظت ممکن است کار نکند، زیرا امکان جعل تمام داده های شناسایی مورد استفاده برای محافظت (ورود، رمز عبور، IP و آدرس MAC) وجود دارد.

مقدمه

این آموزشی است که باید اصول اولیه ایمن سازی صفحات وب خود را با استفاده از احراز هویت HTTP به شما نشان دهد. به جای روش سنتی .htaccess (سرور آپاچی)، ما قصد داریم از MySQL برای ذخیره داده های کاربر و رمز عبور آنها استفاده کنیم. من سعی خواهم کرد تا جایی که ممکن است همه چیز را در مورد آنچه که به نظر من برای یک مبتدی برای یادگیری MySQL و PHP لازم است بجوم. در اصل شما می توانید از هر DBMS (سیستم مدیریت پایگاه داده) بر اساس این برنامه استفاده کنید. چرا این روش جالب است؟ خوب، به عنوان مثال، اگر فقط به این دلیل است که اگر از یک پایگاه داده استفاده می کنید، به راحتی می توانید فقط به یک گروه (فرد) خاص اجازه دهید که حقوق خاصی برای دسترسی به این یا آن اطلاعات داشته باشد. اگر از روش سنتی htaccess آپاچی استفاده می کنید، باید کاربران و رمز عبور را به صورت دستی در فایل رمز عبور اضافه کنید. یک مزیت این روشخوب .... خودت نگاه کن

نرم افزارکه لازم است:

*پلتفرم nix (لینوکس، یونیکس، *BSD) PHP 3.0.x یا PHP 4.x MySQL (هر نسخه)

مرحله شماره یک

ادامه دهید، اولین چیزی که باید بفهمیم این است که می خواهیم به کاربرانی که در پایگاه داده ما هستند اجازه دهیم به صفحه مشخص شده دسترسی داشته باشند؟ و چگونه قرار است این کار را انجام دهیم؟ (بسیاری از مردم واقعاً آن را دوست ندارند، اما شما باید عادت کنید قبل از برنامه نویسی یک تکه کاغذ بردارید و تمام الزاماتی را که می خواهیم از برنامه دریافت کنیم را یادداشت کنید، در آینده ساعت ها یا شاید روزها صرفه جویی کنید. ایجاد تغییرات در کد (تقریبا))

بررسی کنید که آیا کاربر قبلاً احراز هویت شده است.

اگر نه، با پیام و فرم دسترسی به مرورگر پیام ارسال کنید.

اگر کاربر روی دکمه لغو کلیک کرد، به او اجازه دسترسی ندهید و او را هدایت کنید تا به ... 403: دسترسی رد شد، یا یک پیام ساده (کوکی J) نشان دهید.

اگر کاربر ترکیب نام کاربری و رمز عبور را وارد کرده است، آنها را بررسی کنید پایگاه داده MySQLداده ها و مطمئن شوید که صحیح هستند، در صورت مثبت بودن، اجازه دسترسی را بدهید.

اگر همه چیز را متوجه نشدید، نگران نباشید، بعداً (یا شاید هرگز) روشن می شود!

مرحله دوم - ایجاد پایگاه داده ما

ما می خواهیم پایگاه داده نام کاربری (ورود به سیستم) و رمز عبور کاربران ما را ذخیره کند. فیلدهای مورد نیاز را می توان به راحتی به یک پایگاه داده موجود اضافه کرد، اما فعلاً فرض می کنیم که شما به یک پایگاه داده موجود اضافه نمی کنید بلکه یک پایگاه داده جدید ایجاد می کنید. کد زیر توضیحی در مورد نحوه انجام این کار است. فرض کنید اگر آپاچی روی رایانه خود دارید، می توانید بلافاصله شروع کنید :)

mysql> ایجاد اعضای پایگاه داده.
mysql> ایجاد جدول کاربران (
نام کاربری varchar(25) NOT NULL،
رمز عبور varchar(15) NOT NULL،
کلید اصلی (نام کاربری)،
نام کاربری منحصر به فرد (نام کاربری)
);

ما اکنون یک پایگاه داده برای ذخیره کاربران داریم که نام کاربری تا 25 کاراکتر و رمز عبور تا 15 کاراکتر را در نظر می گیرد. (اگر بنا به دلایلی برای شما مناسب نیست، آن را به دلخواه خود تنظیم کنید) نام کاربری باید "کلید اصلی" و "یکتا" باشد، زیرا ما نمی خواهیم 2 یا چند نفر نام کاربری مشابهی داشته باشند.

لطفاً توجه داشته باشید که نام‌های کاربری در موارد زیر حساس به حروف کوچک و بزرگ خواهند بود، کاربر «واسیا» متفاوت از کاربر «واسیا» و به عبارت دیگر به حروف بزرگ و کوچک شناسایی می‌شود. اکنون یک کاربر آزمایشی به MySQL اضافه می کنیم تا بتوانیم هنگام ایجاد صفحه PHP از آن برای آزمایش استفاده کنیم.

mysql> انتخاب را در users.users اعطا کنید
به [ایمیل محافظت شده]
شناسایی شده توسط "MyPassword"؛

این به این صورت است که وقتی می خواهیم نام کاربری و رمز عبور شخصی که وارد پایگاه داده ما شده است را بررسی کنیم، از کاربر "httpuser" با رمز عبور "MyPassword" استفاده می کنیم. در نهایت باید نام کاربری و رمز عبور شخصی را که می خواهیم به او اجازه دسترسی دهیم اضافه کنیم.

mysql> وارد مقدار کاربران ("john_doe", "eod_nhoj");

من عمداً داده های برنامه را رمزگذاری نکردم که در صورت گم شدن پسورد آن را رمزگشایی نکنید و آن را به حداقل برسانید :)) همین است، MySQL تمام شده است، حالا بیایید ادامه دهیم!

مرحله سوم - نوشتن کد پی اچ پی

قبل از شروع، من به طور مختصر توضیح خواهم داد که پاگا چه خواهد کرد. وقتی به صفحه ایمن می رسید، سرور درخواستی ارسال می کند و صفحه ای برای وارد کردن نام کاربری و رمز عبور نمایش می دهد. اگر روی دکمه لغو کلیک کنید یا داده‌های نادرست وارد کنید، سرور برای شما ارسال می‌کند (401 هدر غیر مجاز، و دسترسی را رد می‌کند.) - به این صورت است که درخواست معمولاً رشته را ترجمه می‌کند (401 سرصفحه غیرمجاز، و دسترسی را رد می‌کند) من نمی‌کنم توضیح بده به نظر من بهتر نمیشه گفت!!! در صورتی که همه چیز را همانطور که باید وارد کنید، معلوم می شود که به سادگی دسترسی خواهید داشت (که باید ثابت شود) اکنون سرگرم کننده ترین، این همان کد است. عمداً با شماره خطوط نوشته شده است، پس از توضیح کد (زیر) خطوط.

01 02
تابع 03 access_denied() (
04 echo "401 غیر مجاز: ترکیب نام کاربری / رمز عبوری که وارد کردید نامعتبر بود.n";
05 }
06
07 تابع auth_headers ($title) (
08 Header("WWW-Authenticate: Basic realm="$title"");
09 Header ("HTTP/1.0 401 غیر مجاز");
10 }
11
12 if(!isset($PHP_AUTH_USER)) (
13 auth_headers ("صفحه وب محافظت شده من");
14 access_denied();
15 خروجی;
16 }
17 دیگر(
18
19 $hostname = "localhost";
20 $username = "httpuser";
21 $password = "MyPassword";
22 $database = "اعضا";
23
24 $query = "انتخاب نام کاربری، رمز عبور از کاربرانی که نام کاربری = "$PHP_AUTH_USER" و رمز عبور "$PHP_AUTH_PW"";
25 $link = mysql_connect($localhost، $username، $password) or die("عدم اتصال به سرور پایگاه داده");
26
27 if (mysql_num_rows(mysql_db_query($database, $query)) == 0) (
28 auth_headers ("صفحه وب محافظت شده من");
29 access_denied();
خروجی 30;
31 }
32
33 mysql_close($link);
34 }
35 ?>

این کل ترفند است - pokus، به خوبی کار می‌کند، می‌توانید از آن در هر کجا که می‌خواهید، زمانی که می‌خواهید و هر طور که می‌خواهید استفاده کنید، تغییر دهید، بهبود ببخشید، اگر در حین ذخیره کردن موفق به کاهش کد به دو خط شوید. عملکردبرنامه پس حتما برام بفرست!

در این بخش، ما به سرعت هر خط را بررسی خواهیم کرد تا از تبادل داغ سوالات در نظرات این مقاله از قبل جلوگیری کنیم.

خط 3:
اگر "کاربر شرور" دائماً داده های اشتباه را وارد کند، این تابع پیامی را نشان می دهد. من این را به یک تابع تبدیل کردم زیرا ما دو بار و فقط برای کوتاه کردن کد منبع از آن استفاده می کنیم.

خط 7:
از آنجایی که ما نیز دو بار از این هدر استفاده می کنیم، من نیز آن را به یک تابع تبدیل کردم.

خط 8:
هدری را به مرورگر منتقل کنید که کاربر را مجبور به وارد کردن نام کاربری و رمز عبور کند. متغیر $title در گفتگوی ورود نشان داده خواهد شد.

خط 9:
در اولین درخواست، هدر نمایش داده می‌شود و پس از لغو مجدد، پیغامی مبنی بر عدم دسترسی را نشان می‌دهد.

خط 12:
$PHP_AUTH_USER حلقه‌ای است که پیامی را نشان می‌دهد که می‌گوید پاگا محافظت شده است، و خارج شوید!

خط 19-23:
این چیزی است که هیچ کس جز شما نمی داند، یعنی ابزار اتصال به پایگاه داده، نام میزبان، نام پایگاه داده، نام کاربری و رمز عبور. (برای اتصال MySQL)

خط 24:
پرس و جو MySQL که نام کاربری و رمز عبور را برمی گرداند.

خط 25:
با MySQL ارتباط برقرار کنید و در صورت عدم اتصال یک نفرین نمایش دهید !!! (این بدان معنی است که شما در خطوط 19-23 مشکل دارید یا اصلا MySQL وجود ندارد)

خط 27:
$query را پردازش کنید. اگر -0 را برگرداند، به این معنی است که ترکیب نامعتبر وارد شده است.

خط 33:
اتصال MySQL را قطع کنید.

من توصیه می‌کنم کد PHP را در فایلی با نام‌های user_auth.php، user_auth.php3 یا... ذخیره کنید (فانتزی شما اینجاست) بیایید فرض کنیم این کد را در فایل user_auth.php ذخیره کرده‌ایم. هر زمان که بخواهیم ناگهان از صفحه وب فوق محرمانه خود محافظت کنیم، به سادگی این فایل را اضافه می کنیم. تنها چیزی که می خواهم به آن توجه کنم این است که منطقاً باید آن را در بالای صفحه PHP محافظت شده خود وصل کنید، به شما توصیه می کنم موارد زیر را در خط شماره 1 صفحه خود بنویسید:

که در آن "user_auth.php" نام فایلی است که کد را در آن ذخیره کرده اید.

سوال شما این است - من از MySQL استفاده نمی کنم، چه کاری باید انجام دهم؟

با مدیر سرور خود مشورت کنید، اگر معلوم شد که مهربان است، به شما کمک می کند، برای او 5 دقیقه کار است، اگر شرور کمک نکرد، پس به انجمن مربوط به پایگاه داده که هستید بروید. استفاده کنید و برای کمک فریاد بزنید! یا اگر خود را یک برنامه نویس معمولی می دانید، پس ... اصلاً به این کد نیاز ندارید و «جلسات» ایجاد می کنید، با PGP رمزگذاری می کنید و به طور کلی انحراف می کنید که گویی در حال محافظت از amazon.com هستید.