PDA

View Full Version : کوکی و لاگین



mina_ghorbani
سه شنبه 22 آذر 1390, 21:30 عصر
سلام
می خوام قسمت ورود به سایت (به خاطر سپردن ) داشته باشد
برای این یه کوکی ساختم که هر موقع کاربر میاد تو سایت اگر اون کوکی باشه وارد شده باشه و نخواد user pass وارد کنه
این کار مشکلی از نظر امنیت نداره؟مثلا یکی کوکی رو دست بزنه من userID کاربر رو نگه داشتم توش ممکنه یکی UserID شخص دیگری رو بزنه توش و موقعی که میاد تو سایت و اون کوکی خونده می شه با ID شخص دیگه ای لاگین بشه؟
(لطفا به سوال من نخندید ;) )

aminghaderi
سه شنبه 22 آذر 1390, 22:08 عصر
این کار مشکلی از نظر امنیت نداره؟
حمله XSS Clint : سرقت کوکی کلاینت و استفاده از آن.

mina_ghorbani
سه شنبه 22 آذر 1390, 22:21 عصر
برای حل مشکل چه کنم؟

aminghaderi
سه شنبه 22 آذر 1390, 22:25 عصر
کد کاربری و رمز عبور را داخل کوکی قرار ندید و ، کمی در سایت جستجو کنید.:لبخندساده:

moslem68
سه شنبه 22 آذر 1390, 22:31 عصر
برای امنیت از Session استفاده کنید

aminghaderi
سه شنبه 22 آذر 1390, 22:36 عصر
برای امنیت از Session استفاده کنید
آخه برادر من وقتی کاربر کامپیوترش رو خاموش کرده رفته 3 روز دیگه اومده کامپیوترش رو روشن کرده ، سشن کجا بوده....
اون موقع فقط کوکی می تونه اطلاعات ره به سرور یاداوری کنه....

A.Yousefi
سه شنبه 22 آذر 1390, 23:25 عصر
کد کاربری و رمز عبور را داخل کوکی قرار ندید
میشه بگین کجا باید قرار داد؟

aminghaderi
سه شنبه 22 آذر 1390, 23:37 عصر
میشه بگین کجا باید قرار داد؟
بله ، دیتابیس!

mina_ghorbani
چهارشنبه 23 آذر 1390, 05:28 صبح
باید چه چیزی در Data Base ذخیره کنیم مثلا آی پی طرف که اگر لاگین شد از اون بشناسه؟؟؟

moferferi
چهارشنبه 23 آذر 1390, 10:22 صبح
باید چه چیزی در Data Base ذخیره کنیم مثلا آی پی طرف که اگر لاگین شد از اون بشناسه؟؟؟

عزیز من مگه کاربرا از ip static استفاده میکنن که ip را ذخیره کنیم.هر دفعه که به اینترنت وصل میشی یه ip جدید میگیری

در جواب شما هم بگم که اگه امنیت براتون در درجه اول قرار داره هیچ گاه سعی نکنید پسورد را ذخیره کنید و یا اطلاعاتی را در کوکی ذخیره کنید.

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

این را هم بگم session صد در صد امن نیست.
پسورد ها را هم همیشه با الگوریتم های یکطرفه کد کنید و در دیتابیس ذخیره کنید.

rahmatr
چهارشنبه 23 آذر 1390, 17:27 عصر
حمله XSS Clint : سرقت کوکی کلاینت و استفاده از آن.

برای امنیت از Session استفاده کنید

این را هم بگم session صد در صد امن نیست.

استفاده از session فرقی زیادی با استفاده از cookie ندارد، چون session هم از cookie استفاده می کند.

متغییرهای session در حافظه سرور ذخیره می شوند و هر بار که کلاینتی صفحه ای را از سرور درخواست می کند، سرور برای اینکه بفهمد که کدام session مربوط به این کلاینت است، از یک cookie (به اسم ASP.NET_SessionId) که قبلا در کامپیوتر کلاینت ذخیره کرده است استفاده می کند.

خوبی session این است که شما احتیاجی به بررسی cookie ندارید و همچنین اطلاعات کاربر مثل نام و گروه کاربری و ... را می توانید در آن ذخیره کنید.
اما برای cookie باید هر بار کاربر صفحه ای را درخواست می کند، برنامه نویس cookie را چک کند که آیا login کرده است یا نه و همچنین باید از روی cookie ها بفهمد که کدام کاربر است.

بدی session این است که معمولا در هاست های اشتراکی زودتر از زمان تعیین شده از بین می رود و حتی در بعضی از هاست ها کمتر از 3 دقیقه (به همین خاطر من هیچ وقت از session برای login استفاده نمی کنم).

بنابراین به نظر من همیشه از cookie استفاده کنید. اما برای شناسایی کاربر از روی cookie باید حداقل دو مقدار در cookie داشته باشید یکی ID کاربر و دیگری یک مقدار hash شده که نشان دهد آیا کاربر login کرده است یا نه.

اما برای امنیت cookie ها که کسی نتواند آنها را از کامپیوتر کاربری بدزدد، باید خاصیت HttpOnly کوکی ها را true کنید تا مرورگر به اسکریپت ها اجازه دستیابی به cookie ها را ندهد.

یک نمونه کد ساده برای login:

SHA256CryptoServiceProvider sha256 = new SHA256CryptoServiceProvider();

byte[] hashBytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(userID + userSalt));
string hash = BitConverter.ToString(hashBytes).Replace("-", string.Empty);

HttpContext.Current.Response.Cookies.Add(new HttpCookie("userID", userID) { HttpOnly = true });
HttpContext.Current.Response.Cookies.Add(new HttpCookie("hash", hash) { HttpOnly = true });


و هنگام logOut هم باید cookie ها را حذف کرد:

HttpContext.Current.Response.Cookies.Add(new HttpCookie("userID", "0") { HttpOnly = true });
HttpContext.Current.Response.Cookies.Add(new HttpCookie("hash", "0") { HttpOnly = true });



می توان IP کاربر را هم در Hash تولید شده دخالت داد ولی به دو دلیل من اینکار را نمی کنم:
یکی اینکه IP یک کاربر ممکن در عرض چند دقیقه عوض شود. مثلا هنگام استفاده از GPRS مخابرات IP شما مرتبا تغییر می کند.
دیگر اینکه هکرها با روشهایی(IP address spoofing (http://en.wikipedia.org/wiki/IP_address_spoofing)) می توانند IP را هم دور بزنند و با هر IP که بخواهند به سایت وصل می شوند.

البته در اینترنت برای هیچ سایتی و هیچ روشی امنیت 100 درصد نداریم. سایتهای حساس و مهم باید حتما از https استفاده کنند.

A.Yousefi
چهارشنبه 23 آذر 1390, 22:41 عصر
بله ، دیتابیس!
ممنون میشم اگه توضیح بدین دقیقا چه چیزیو باید تو دیتابیس قرار بدیم؟!

mina_ghorbani
پنج شنبه 24 آذر 1390, 10:49 صبح
بنابراین به نظر من همیشه از cookie استفاده کنید. اما برای شناسایی کاربر از روی cookie باید حداقل دو مقدار در cookie داشته باشید یکی ID کاربر و دیگری یک مقدار hash شده که نشان دهد آیا کاربر login کرده است یا نه.


اين مقدار كه hash بايد كنيم چيست وقتي id رو ذخيره كرديم اون hash شده براي چه كاريه؟

بعد اينكه اين بار كاربر سايت رو بسته مي خوام دفعه ديگه كه مياد لاگين باشه تا سايت رو مي زنه اسمش بالاي صفحه باشه مثل همين سايتbarnamenevis

rahmatr
پنج شنبه 24 آذر 1390, 10:59 صبح
درسته. اون کلیت کار سیستم login بود.

برای گزینه "مرا به خاطر داشته باش" یا همان Remember me هم اگر کاربر تیک آنرا زد، باید برای کوکی هایی که تعریف کردیم تاریخ انقضا تعریف کنیم.

مثلا:
MyCookie.Expires = DateTime.Now.AddDays(3);


که در این صورت تا 3 روز کاربر احتیاجی به login ندارد.

rahmatr
پنج شنبه 24 آذر 1390, 11:13 صبح
اين مقدار كه hash بايد كنيم چيست وقتي id رو ذخيره كرديم اون hash شده براي چه كاريه؟


ذخیره فقط id بدرد نمی خورد. چون من سایت شما رو باز می کنم و تیک مرا به خاطر داشته باش رو می زنم. بعد میام و کوکی رو دستکاری میکنم و یه id دیگه داخل اون قرار میدم.
حالا چه اتفاقی می افته؟ سایت من رو به عنوان کاربر دیگه میشناسه!

پس باید یک کنترلی روی کوکی ها صورت بگیره. به همین خاطر از hash استفاده شده تا کسی نتونه کوکی ها رو دستکاری کنه و اگر دستکاری شد، تشخیص بدهیم.

mina_ghorbani
پنج شنبه 24 آذر 1390, 13:16 عصر
ممنون من دقيقا همين رو مي خواستم فكر مي كردم اگر كسي id رو تغيير بده چي مي شه

mina_ghorbani
پنج شنبه 24 آذر 1390, 16:39 عصر
ببخشید 1 چیزی
userSalt چیست؟

rahmatr
پنج شنبه 24 آذر 1390, 18:46 عصر
ببخشید 1 چیزی
userSalt چیست؟

به اینجا مراجعه کنید:
الگوریتم های غیر قابل بازگشت (http://barnamenevis.org/showthread.php?311403-%D8%A7%D9%84%DA%AF%D9%88%D8%B1%DB%8C%D8%AA%D9%85-%D9%87%D8%A7%DB%8C-%D8%BA%DB%8C%D8%B1-%D9%82%D8%A7%D8%A8%D9%84-%D8%A8%D8%A7%D8%B2%DA%AF%D8%B4%D8%AA)

mo.esmp
پنج شنبه 24 آذر 1390, 19:39 عصر
استفاده از کوکی که دارای خاصيت HttpOnly هست از حملات XSS صد در صد جلوگيری نميکنه و هنوز راه های ديگه ای هم برای دزديدن کوکی وجود داره از جمله استراق صمع شبکه يا کانال ارتباطی (http://msdn.microsoft.com/en-us/library/system.web.httpcookie.httponly.aspx). بهترين راه حل استفاده از SSL به همراه کوکی HttpOnly هست.
برای امنيت بيشتر کوکی رو از طريق Secure Flag (http://msdn.microsoft.com/en-us/library/system.web.httpcookie.secure.aspx) ست کنيد که مطمئن باشيد کوکی از طريق ارتباط انکريپت شده انتقال پيدا ميکنه.

mina_ghorbani
پنج شنبه 24 آذر 1390, 22:31 عصر
userSalt هر بار تغییر می کنه تو تاپیکی که گفتید خوندم که باید جایی ذخیره بشه این کار رو چه جوری باید انجام بدم یعنی مقدارشو کجا ذخیره کنم مقدار salt رو جداگونه توی کوکی بریزم و یه بارم Pass+hash رو؟

mmnoody2006
جمعه 25 آذر 1390, 12:08 عصر
در مورد امنیت کوکی ها در اینترنت زیاد بحث شده ولی بهترین روشی که من دیدم استفاده از روشی هست که در membership استفاده می شه

mehrdad_shahian
چهارشنبه 17 اسفند 1390, 13:37 عصر
سلام
جناب rahmatr عزیز،شما encrypt رو گفتید ولی decrypt رو نگفتید.منظورم اینه که مقدار hash رو چطوری بخونیم و مقایسه کنیم ببینیم درسته یا نه؟

مرسی

A.Yousefi
چهارشنبه 17 اسفند 1390, 18:03 عصر
سلام
جناب rahmatr عزیز،شما encrypt رو گفتید ولی decrypt رو نگفتید.منظورم اینه که مقدار hash رو چطوری بخونیم و مقایسه کنیم ببینیم درسته یا نه؟

مرسی

هش decrypt نداره،باید اونارو با هم مقایسه کنین.
یه ویژگی توابع هش اینه که خروجی های یکسان تولید میکنن.