PDA

View Full Version : علت پر نشدن خودکار فیلد پسورد موقعی که فرم لاگین مجددا از سمت سرور برگشت داده میشود



eshpilen
شنبه 07 دی 1392, 09:23 صبح
نام کاربری و پسورد رو در فرم لاگین میزنی میره، دوباره از سرور برگشت میکنه، فقط نام کاربری بطور خودکار توش پر شده و پسورد پر نشده، علتش چیه دقیقا؟ چه فلسفه ای داره؟
دقت کنید که خطا ممکنه مربوط به اشتباه بودن پسورد نبوده باشه و مثلا بخاطر اشتباه وارد شدن کپچا یا حتی نام کاربری بوده باشه.

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

مورد دیگر میتونه پرهیز از ارسال بی دلیل/بیش از حد پسورد در اینترنت باشه. چون خیلی از ارتباطات از SSL/TLS استفاده نمیکنن و ناامن هستن، بنابراین هرچه چنین اطلاعات حساسی کمتر از این مسیرهای ناامن عبور بکنه بهتر بنظر میاد (هرچند بهرصورت امنیت رو بصورت کامل و اصولی تامین نمیکنه).

مسئلهء دیگر میتونه این باشه که پسورد کاربر در کش مرورگر ثبت نشه و قابل بازیابی نباشه. چون اگر ما فرم رو با پسورد کاربر برگشت بدیم، این پسورد جزیی از صفحهء HTML خواهد بود و اگر صفحه کش بشه در کش مرورگر همراه با بقیهء کدهای صفحه درج خواهد شد.
(جالب اینکه این مورد همین الان به ذهن خودم هم رسید!)

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

خلاصه این چندتا دلیل که بنظر من میامدن.
شما هم اگر دلیلش رو میدونید یا ایده ای بنظرتون میرسه بگید.

راستی این پر نشدن خودکار پسورد در بخش لاگین هست که توسط تقریبا تمام برنامه ها و سایتها رعایت میشه، اما در بخشهای دیگر مثل فرمهای ثبت نام بعضا دیده میشه که در بعضی سیستمها فیلد پسورد هم با برگشت فرم بصورت خودکار پر میشه، ولی این پسوردهای برگشت داده شده تاجاییکه دیدم بصورت هش شده هستند (شاید هم در مواردی رمز (هم) شده باشن). من خودم در فرم ثبت نام پروژم این روش رو استفاده کردم؛ البته بنده علاوه بر هش از رمزگذاری با یک کلید محرمانه سمت سرور هم استفاده کردم که امنیت رو بیشتر هم میکنه (چون روی رمزگذاری درست و حسابی عملا نمیشه حدس یا Brute-force رو تست کرد ولی روی هش امکانش هست).

qartalonline
شنبه 07 دی 1392, 09:31 صبح
اصلی ترین عامل به نظر من همین هستش که هنگام بازگشت صفحه پسورد جز فایل html میشه و به راحتی میشه از سورس صفحه پسورد رو بدست آورد.

MMSHFE
شنبه 07 دی 1392, 09:54 صبح
مرورگر بطور خودکار عناصری که "type="password هستن رو کش نمیکنه. شاید بشه با ست کردن دستی "autocomplete="on فعالش کرد (امتحان نکردم) ولی اگه میخواین حتماً پر بشه، خودتون موقع برگشت با خاصیت value مقدار رو داخلش بنویسید.

eshpilen
شنبه 07 دی 1392, 11:19 صبح
مرورگر بطور خودکار عناصری که "type="password هستن رو کش نمیکنه.
مطمئنید؟
تمام مرورگرها تمام نسخه ها؟
البته باید دید مسئلهء کش شدن این پاسخها درجای دیگری غیر از مرورگر هم وجود داره یا نه.
البته فکر میکنم قبلا در پروتکل HTTP یا جای دیگه خونده بودم که پاسخ به درخواستهای POST نباید کش بشه (منظور در کش سرورها هم بود)؛ ولی مطمئن نیستم، و از اون طرف هم معلوم نیست همه چیز همه وقت از این استاندارد پیروی کنن.

eshpilen
شنبه 07 دی 1392, 11:20 صبح
در ضمن اگر مسئله فقط کش باشه، میشه با هش و رمز کردن پسورد اون رو حل کرد.
از اون طرف هم میبینی مثلا سیستمهایی که پسورد (البته در اصل هش/رمز شدهء پسورد) رو در فرم ثبت نام بصورت خودکار پر میکنن، نظیر این کار رو در فرم لاگین انجام نمیدن. یعنی من تاجاییکه یادم میاد اینطور بوده!

MMSHFE
شنبه 07 دی 1392, 11:22 صبح
Form Auto Complete ارتباطی به سرور نداره و از ویژگیهای مرورگره که ذخیره میکنه. میتونید سورس صفحه رو بعد از Back چک کنید. چیزی از سرور برگردونده نمیشه. توی تمام مرورگرها همینطوره.

eshpilen
شنبه 07 دی 1392, 12:02 عصر
بابا من اصلا درمورد Auto Complete چیزی نگفتم و منظورم این نبود که.
مثل اینکه اشتباه متوجه شدی مهندس.
منظور من اون نوع پر کردن فیلدها هست که از سمت سرور انجام میشن.
یعنی مثلا وقتی کاربر فرم لاگین رو سابمیت میکنه بعد در سمت سرور ازش ایرادی میگیریم برگردونده میشه کاربر به همون فرم دوباره ولی نام کاربریش توسط سرور با مقداری که کاربر قبلا سابمیت کرده بوده پر شده.
مثلا این بخش از فرم لاگین بنده رو مشاهده میکنید:

<input type="text" name="username" <?php if(isset($_POST['username'])) echo 'value="', htmlspecialchars($_POST['username'], ENT_QUOTES, 'UTF-8'), '"'; ?> >
این در سمت سرور پر میشه.

MMSHFE
شنبه 07 دی 1392, 12:41 عصر
خوب الآن پسورد رو کامل نمیکنه؟ من چنین کدی گذاشتم کار کرد:


<form action="" method="post">
<input name="user" type="text"<?php if(isset($_POST['user'])) { echo ' value="' . $_POST['user'] . '"'; } ?> />
<input name="pass" type="password"<?php if(isset($_POST['pass'])) { echo ' value="' . $_POST['pass'] . '"'; } ?> />
<input type="submit" value="Send" />
</form>

eshpilen
شنبه 07 دی 1392, 12:51 عصر
خب همون دیگه من میگم از نظر امنیتی این کار (پر کردن خودکار فیلد پسورد) مشکل داره.
اما میخواستم بدونم دقیقا به چه دلایلی و چه موارد مشکل و ریسک امنیتی در این رفتار هست.
در واقعیت هم میبینید که تقریبا هیچ سایت و برنامه ای چنین کاری نمیکنه. واسه فیلد یوزرنیم میکنن ولی واسه پسورد نه.

MMSHFE
شنبه 07 دی 1392, 13:00 عصر
راستش دلیل خاصی براش نمیبینم بجز اینکه اگه کاربر بعد از واردکردن اشتباه اطلاعات، به فرم برگردونده شد (و مثلاً بجای رمز، نام کاربری رو اشتباه وارد کرده بود) یکی دیگه با خوندن سورس صفحه، نفهمه رمزش چی بوده وگرنه مواردی مثل امکان شنود ازطریق شبکه و... توی همون ارسال اولیه رمز هم امکان داره. البته توی ارسال اولیه از کلاینت به سرور میشه با JS رمز رو Hash کرد ولی در برگشت برای اینکه درست توی کادر رمز نوشته بشه، باید رمز خام رو بگذاریم که خطرش بیشتره.

eshpilen
شنبه 07 دی 1392, 13:12 عصر
ولی در برگشت برای اینکه درست توی کادر رمز نوشته بشه، باید رمز خام رو بگذاریم که خطرش بیشتره.
اتفاقا نیاز چندانی هم نیست که پسورد خام رو بذاریم.
اتفاقا سیستمهایی که مثلا در فرم ثبت نام پسورد رو اینطوری پر میکنن، هش شده یا رمز شدهء اون رو در value قرار میدن.
اونوقت موقعی هم که کاربر سعی میکنه این فیلدها رو ویرایش کنه، میتونیم با جاوااسکریپت این رو تشخیص بدیم و مقدار فیلدها رو پاک کنیم.
بنده این قضیه رو در فرم ثبت نام خودم به همین شکل پیاده کردم.