PDA

View Full Version : سوال: ایجاد لینک فعال سازی در asp.net



masoudshirzadi
یک شنبه 23 خرداد 1389, 13:46 عصر
با سلام خدمت تمام برنامه نویسان ایرانی

یه سوال داشتم. میخواستم ببینم کسی میدونه چطور میشه لینک فعال سازی برای کاربری که تازه ثبت نام کرده ایجاد و به میلش فرستاد؟
حالا به میل فرستادنش مشکل نیست فقط در رابطه با لینک یه ایده ای که توی ذهنمه اینه که مثلا من بیام userid تولید شده برای اون کاربر رو به عنوان querystring به لینک اضافه کنم و براش بفرستم. بعد که روش کلیک کرد با توجه به اون userid فیلد مربوط به فعال شدن کاربر رو true کنم.
اگه ایدم درسته بگین!
با تشکر

hamedsabzian
یک شنبه 23 خرداد 1389, 14:07 عصر
خوبه!
ID هم طبیعتا باید Unique باشه.

maxpayn2
یک شنبه 23 خرداد 1389, 14:09 عصر
اگه هر دفعه لینک ثابتی رو بفرستید و فقط user id به اون اضافه بشه ، هر کسی با دونستن user id نفر دیگه میتونه بجاش فعال سازی رو انجام بده و ...

profnami
یک شنبه 23 خرداد 1389, 14:14 عصر
بله . براي ID ميتونيد از Guid استفاده كنيد . كسي UserId ديگري رو نميدونه . چون UserId به ايميل اون شخص ارسال ميشه . و يا ميتونيد خودتون QueryString هايي رو خودتون با كدنويسي هاي پيشرفته ايجاد كنيد و از اون استفاده كنيد . در ضمن كنترل كنيد كه براي هر كاربر فقط يك بار عمل فعالسازي انجام بشه . اگه براي كاربري كد اشتباه ثبت شد ميتونيد كاربر رو غير فعال كنيد . اين هم اقدامات امنيتي .

hamedsabzian
یک شنبه 23 خرداد 1389, 14:28 عصر
چون عمل فعال سازی ممکنه در مواقع مختلفی ( البته بسته به مورد استفاده شما) انجام بپذیرد، بهتر است هر گاه یک کاربر نیاز به فعال سازی داشت، یک کلید رمزنگاری متقارن ایجاد شود و در پایگاه داده ذخیره شود. سپس پارامتر های لینک فعال سازی اینطوری ساخته بشن.
1. UserID
2. رمز شده ی UserID
کاملا امنه.

profnami
یک شنبه 23 خرداد 1389, 14:37 عصر
ببينيد شما برنامه نويس هستيد و همه چيز تحت كنترل شماست . هر وقت كاربرتون غير فعال شد يك ID جديد توليد كنيد و اون رو در قسمت ID مربوط به كاربرتون ثبت كنيد و يك Email براي فعالسازي مجددش بفرستيد . همه چيز تحت كنترل شماست و ميتونيد هر كاري انجام بديد ....

اوبالیت به بو
یک شنبه 23 خرداد 1389, 20:19 عصر
یه سوال:

آیا میشه به این صورت لینک فعال سازی رو ساخت: بگیم ما که User_ID رو داریم و از Email شخص توسط QueryString می خونیم. بیایم یه صفحه aspx بسازیم و یه متد توش طراحی کنیم که در Page_Load اجرا بشه. چی کار می کنه User_ID رو می گیره و می ره تو جدول Users مثلا فیلد State یا Status رو True می کنه. بعد Redirect بشه به یک صفحه دیگه.

این روش خوبه یا بد؟

hamedsabzian
یک شنبه 23 خرداد 1389, 21:54 عصر
در کنار User_ID یه ID یکتای فعال سازی یک بار مصرف هم باید باشه. اون رو ذخیزه کنیم و توی QueryString هم قرار بدیم.
چون User_ID معمولا ثابته و ممکنه افراد دیگه به دستش بیارن. پس نباید بتونن کاربر رو فعال کنن.
میتونید یه جدول بسازید که حاوی User_ID (کلید خارجی از جدول Users و کلید اصلی همین جدول) و یک Activation_ID که کد فعال سازی باشه.
کاربر که غیر فعال شد یه رکورد توی این جدول اضافه می شه، فعال هم که شد، حذف می شه.

iman_ad
یک شنبه 23 خرداد 1389, 23:16 عصر
من باشم از guide استفاده می کنم

hamedsabzian
یک شنبه 23 خرداد 1389, 23:43 عصر
من باشم از guide استفاده می کنم
مهم اینه که یکتا و کاملا تصادفی باشه. 32 کاراکتر طولش باشه بد نیست.

shirin_sh1024
دوشنبه 24 خرداد 1389, 00:07 صبح
میتونیم یه جدول Requset بسازیم که 4 تا فیلد ID,User_ID,Type,vertify رو داشته باشه(user_ID :آیدی کاربر ، ID :آیدی درخواست ، Type:نوع درخواست، vertify:برای تایید درخواست از طرف کابر یعنی وقتی رو لینکی که فرستادیم به ایمیلش کلیک کنه true بشه)
اینجوری به هر درخواستی که از طرف کاربر میاد که بستگی به نوعش(فیلد Type) میتونه مختلف باشه مثله درخواست فعال شدن اکانت یا درخواست تعویض رمز و ... یه آیدی(یعنی فیلد ID در جدول Rquest) نسبت بدیم(که میشه تصادفی هم ایجادش کرد) و توسط Querystring اون آیدی رو بفرستیم و دوباره همون رو پس بگیریم و در صورت trueبودن vertify تغییرات رو اعمال کنیم.

hamedsabzian
دوشنبه 24 خرداد 1389, 00:21 صبح
ID ها رو نباید نگه داشت. یک باید یک بار مصرف باشه. هرچه بیشتر نگه دارید احتمال لو رفتنش بیشتر میشه! به راه حل پست شماره 9 Type و LifeTime رو هم اضافه کنید، خیلی خوب میشه!

profnami
دوشنبه 24 خرداد 1389, 01:23 صبح
ببینید من که میگم خیلی ساده تر میشه حلش کرد . ببینید قرار نیست UserID رو به کسی نشون بدیم . توسط Guid یا چند تا Guid یک رشته ی تصادفی تولید میکنیم و اون رو تو جدول کاربران برای کاربر ذخیره میکنیم . یه ایمیل هم با همون QueryString و Guid تولید شده به ایمیل کاربر میفرستیم . خوب با کلیک بر روی اون کاربر با یه QueryString به سایت برمیگرده و ما با اون QueryString کاربر مورد نظر رو فعال میکنیم .
آیا این روش مشکلی داره ؟

hamedsabzian
دوشنبه 24 خرداد 1389, 01:44 صبح
البته چیزی که میگید مشکلی نداره! ولی دوستان دنبال بهترین و جامع ترین راه اند، نه ساده ترین راه.
افزودن تمهیدات امنیتی بسته گی به مورد استفاده داره و اهمیت موضوع داره.

shirin_sh1024
دوشنبه 24 خرداد 1389, 01:46 صبح
مشکل که نداره ولی این راه حل زیاد اصولی به نظر نمیاد میشه گفت یه جورایی شاید کار راه انداز باشه ولی راه خوبی ام نیست


اون رو تو جدول کاربران برای کاربر ذخیره میکنیم

مثلا به چه عنوانی میخواید تو جدول کاربر اون رو ذخیره کنید؟ کوئری استرینگ واسه فعالسازی اکانت؟!
شاید به نظر راه ساده ای بیاد ولی همیشه ساده بودن ملاک نیست به نظر من روشی که استفاده میشه باید اولا اصولی باشه دوما واسه موارد مشابه هم کاربرد داشته باشه
البته شاید تو پروژه های کوچیک و کم اهمیت مشکل خاصی نداشته باشه ولی من شخصا نظرم اینه که باید عادت کنیم زیبا و اصولی کد بزنیم تا به این کار عادت کنیم حتی تو پروژه های کوچک و یا حتی تمرینی.

shirin_sh1024
دوشنبه 24 خرداد 1389, 01:49 صبح
ID ها رو نباید نگه داشت. یک باید یک بار مصرف باشه. هرچه بیشتر نگه دارید احتمال لو رفتنش بیشتر میشه!

این که مشکلی نیست میشه به راحتی بعد از اتمام کار اون سطر رو از جدول پاک کرد

profnami
دوشنبه 24 خرداد 1389, 08:20 صبح
میخوام بدونم که این روش چه مشکل امنیتی داره ؟

یه فیلد میزاریم با اسم ActivationCode و در اون کدفعالسازی رو ذخیره میکنیم .

hamedsabzian
دوشنبه 24 خرداد 1389, 10:09 صبح
میخوام بدونم که این روش چه مشکل امنیتی داره ؟

یه فیلد میزاریم با اسم ActivationCode و در اون کدفعالسازی رو ذخیره میکنیم .

بنده صریحا مشکل امنیتی نمی بینم. اما ...
1. بهتره یک جدول جداگانه برای ذخیره ی این کدها در نظر بگیرید که بعد از انجام عمل، حذف بشه.
2. بهتره برای انجام عمل یه مهلت قرار بدید تا مجبور نباشید تا ابد منتظر فعال سازی کاربر بمونید.
3. شما که دارید یه جدول دیگه میسازید، پس یه فیلد Type هم بهش اضافه کنید که فقط مختص قعال سازی نباشه و بتونید توش کارای دیگه ای که بنابه منطق برنامتون ممکنه نیاز باشه، استفاده کنید.

HDDSoft2001
پنج شنبه 23 دی 1389, 17:47 عصر
با سلام
دوستان به نظر من خیلی خیلی ساده تر میتونیم این مسئله حل کنیم!!! فرض کنیم جدول کاربران ما شامل فیلدهای زیر باشه:

{ UserID, UserName, pass, Email, Status }بسیار خوب فیلد کد کاربر که خودکاره و برای هرکسی منحصر به فرده, از طرفی نام کاربری و ایمیل نیز خاصیت یکتایی دارند به صورت منطقی!! خب با این تفاسیر کد فعال سازی رو به صورت زیر درست می کنیم که احتمال هکش به صفر برسه.
در لینک ایجاد شده نام کاربری یا کد کاربری + یک هش تولید شده از ترکیب (کد کاربری + نام کاربری + ایمیل + رشته ی ثابت برای امنیت بیشتر ) ایجاد می کنیم. در این حالت فقط کد کاربری و این رشته ی هش شده نمایش داده میشود که فک نکنم کسی بفهمه چیه.
زمانی که هم این صفحه با این لینک درخواست شد, دقیقا عکس این عمل (کرک) را انجام می دهیم تا از صحت درخواست مطمئن شویم. بدین ترتیب که مثلا کد کاربری 1000 توسط لینک فرستاده شده است, این رکورد را در جدول کاربران یافته, و این مراحل هش را روی این رکورد مورد نظر انجام می دهیم, حال اگر رشته ی بدست آمده مطابقت داشت با رشته ی ارسال شده توسط لینک, نتیجه میگیریم که این درخواست, درخواست امن است و کاربر باید فعال شود, در غیر این صورت متوجه غیرقانونی بودن درخواست شده و جلوی آن را می گیریم. (مثلا ای پی آن را ذخیره و برای مدت زمانی مشخص درخواست های ارسال شده از طرف این ای پی را نادیده می گیریم و از این جور کارها البته اگه حوصلشو دارین!!!!!!!!!!!!:متفکر:)
به همین راحتی!!!!!!!!!
به عنوان مثال:


ActivationUser.aspx?ID=283&Code=hdbfjhvdSBDkjzdbvjzhdn,zmnbvmvb
برای امنیت بیشتر می توانید هنگام ساختن لینک به کد کاربری مقداری تعیین شده اضافه کنید که حتی شماره رکود شما هم فهمیده نشود. خلاصه خیلی مسائل میتونین پیاده سازی کنین.

موفق باشید

mehrdad201
جمعه 24 دی 1389, 22:18 عصر
در مورد این قضیه دوستان سمپلی پیدا کردند ؟ چه در این سایت چه در سایتهای خارجی

javad_r_85
جمعه 24 دی 1389, 22:42 عصر
میخوام بدونم که این روش چه مشکل امنیتی داره ؟

یه فیلد میزاریم با اسم ActivationCode و در اون کدفعالسازی رو ذخیره میکنیم .

به نظم منم این روش خوبه البته بهتره یه فیلد دیگه در همون جدول یا جدول دیگر به این فیلد اضافه بشه با نام Accepted و از نوع بولین باشه یعنی زمانی که فعال شد مقدارش true بشه و وقتی کاربر می خواد وارد شه اول اینا چک کنه اگر false بود با پیغامی به او نشان دهد که هنوز نام کاربری اون فعال نشده و از نظر امنیتی فکر نکنم مشکلی داشته باشه چون این قسمت که به وسیله کد هست و برای کد فعال سازی نیز همون طوری که اشاره شد بهتره Guid باشه چون هم منحصر به فرده و هم اینکه الگوریتم مشخصی نداره تا کسی بخواد از اون در کوئری استرینگ استفاده کنه.......