PDA

View Full Version : حرفه ای: جلوگیری از ورود به آزمون آنلاین با مرورگر دیگر



saeid6366
چهارشنبه 27 بهمن 1395, 11:50 صبح
سلام دوستان مهندس
من یه وب سایت با قابلیت آزمون آنلاین طراحی کردم. مشکلم اینه که وقتی کاربر وارد صفحه آزمون میشه میتونه از طریق مرورگرهای دیگه نیز وارد بشه.
نمیتونم با ست کردن یه متغیری تو دیتابیس ورود رو ببندم چون از من خواسته شده کاربر به اندازه مدت آزمون از زمان شروع آزمون فرصت داشته باشه که اگه برق رفت یا مرورگر رو بست بتونه مجددا وارد بشه و ادامه بده.
چطوری میشه فهمید که همزمان دو مرورگر در حال کار روی این آزمون برای این شخص هستند؟
چه راهی به ذهنتون میرسه تا این مشکل حل بشه
لطفا کمک کنید:قلب:

saeid6366
چهارشنبه 27 بهمن 1395, 14:38 عصر
یعنی هیچ کس در این زمینه کار نکرده. دوستان اگه چیزی به ذهنتون میرسه لطفا راهنمایی کنید.

Mag-Mag
پنج شنبه 28 بهمن 1395, 08:39 صبح
یک راهش اینه که
شماره کاربری (UserId) و به همراه اسم مرورگرش ذخیره کنی

HttpBrowserCapabilitiesBase browser = baseRequest.Browser;
string b = browser.Browser + " " + browser.Version;


بعد چک کنی که اگر این کاربر ، ازمون شماره 5 رو با این مرورگر باز کرده (کد بالا بهت مرورگر کاربر رو میده)
بهش اجازه ندی با مرورگر دیگه باز بکنه

Mag-Mag
پنج شنبه 28 بهمن 1395, 08:41 صبح
ولی در کل ، به نظر میاد مهم اینه که هر کاربر یک بار در یک آزمون شرکت کنه
شما میتونی در زمان لود ازمون ، و قبل از ذخیره نتیجه ازمون چک کنی ، اگر این کاربر قبلا در ازمون مثلا شماره 5 شرکت کرده
بهش پیغام بدی
که شما قبلا با این کد پیگیری در این ازمون شرکت کرده اید ، لطفا تقلب ننماییید !! :لبخندساده:

saeid6366
پنج شنبه 28 بهمن 1395, 10:26 صبح
یک راهش اینه که
شماره کاربری (UserId) و به همراه اسم مرورگرش ذخیره کنی

HttpBrowserCapabilitiesBase browser = baseRequest.Browser;
string b = browser.Browser + " " + browser.Version;


بعد چک کنی که اگر این کاربر ، ازمون شماره 5 رو با این مرورگر باز کرده (کد بالا بهت مرورگر کاربر رو میده)
بهش اجازه ندی با مرورگر دیگه باز بکنه

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

Mag-Mag
پنج شنبه 28 بهمن 1395, 11:29 صبح
باید این کار رو با event های فایل global.asax انجام بدی
Session_Start و Session_End و Application_Start و Application_End

زمانی که کاربر برای اولین بار میاد توی Session_Start مقدار یوزر ای دی رو با مرورگرش ذخیره کن
توی Session_End این مقادیر رو جذف کن


اگر من درست متوجه شده باشم
شما میخواید یک کاربر بتونه در طول روز در ازمون شرکت کنه
ولی همزمان از دو مرورگر این کار رو انجام نده

من اگر میخواستم این کد رو بنویسم
در Session_Start مقدار شماره کاربری و نام مرورگرش رو ذخیره میکردم
در Session_End هم این مقادیر رو حذف میکردم
اینطوری میفهمم چه کاربری با چه مرورگری انلاین هست

بعد وقتی روی ازمون کلیک میکرد

1-زمان لود اطلاعات ازمون چک میکردم ، ایا این کاربر قبلا با مرورگر دیگری سایت رو باز کرده ؟ (اگر نه که هیچی ، اگر اره بهش پیغام میدادم شما سشن فعالی در مرورگر فایر فاکس دارید ، لطفا ابتدا از اون خارج شوید) - با همون مقادیری که در سشن استارت ذخیره کردم
2-هر چند ثانیه یک بار (مثلا یک دقیقه) به صورت اتومات اطلاعات ازمون رو ذخیره میکردم - موقع بستن مرورگر هم با یک event جاوا بهش مثلا پیغام میدادم ایا مطمئنی؟

window.addEventListener("beforeunload", function (e) {
var confirmationMessage = "\o/";

(e || window.event).returnValue = confirmationMessage; //Gecko + IE
return confirmationMessage; //Webkit, Safari, Chrome
});


3-زمان لود کردن اطلاعات ازمون چک میکردم ، اگر این کاربر اطلاعاتی از این ازمون رو قبلا جواب داده (با اون ذخیره اتوماته) اونا رو لود میکردم
4-موقع زدن دکمه ثبت نهایی ازمون ، یک فیلد توی جدول ازمون این کاربر ست میکردم ، که این دیگه ازمون رو نهایی کرده ، و دیگه بهش اجازه ویرایش نده

ولی در کل درک نمی کنم ، چرا نمی خواید اجازه بدید ، کاربر ازمون رو با دوتا مرورگر باز نکنه؟
مهم اینه که با هرکدوم زوتر دکمه ثبت نهایی ازمون رو بزنه (دکمه ذخیره) همون اطلاعات ذخیره میشه

و با مرورگر بعدی که ذخیره بزنه
چون قبل از ذخیره چک میکنید این کاربر در این ازمون شرکت کرده یا نه (اینو موقع لود آزمون هم باید چک کنید) اطلاعاتی ذخیره نمیشه

Mag-Mag
پنج شنبه 28 بهمن 1395, 11:35 صبح
وقتی داری اطلاعات مرورگر و یوزر رو چک میکنی

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

saeid6366
شنبه 30 بهمن 1395, 10:06 صبح
خیلی خیلی ممنونم از وقتی که گذاشتی. یه مسئله: نوع مرورگر برام مهم نیست. میخوام کاربر در یک زمان روی یک آزمون فقط یک صفحه باز کنه چون من با هربار زدن دکمه های بعدی و قبلی سوالات جوابشو در پایگاه داده ذخیره می کنم که اگه مرورگر رو بست و هنوز 20 دقیقه از زمان آزمونش مونده بود بتونه توی این 20 دقیقه دوباره وارد شه و ادامه بده و وقتی وارد شد جوابهای قبلی که داده بود دوباره لود میشه. اگه دو تا صفحه از آزمون باز کنه یکم کار رو خراب می کنه.
تو این راه حل شما اگه دوتا مثلا کروم باز کرده بود بهش خطا نمیده و میذاره این کارو بکنه در حالیکه باید جلوشو بگیرم. چیکار کنم به نظرتون؟
راهی هست که اطلاعاتی تو پایگاه داده ذخیره کنم و موقع بستن مرورگر حذف کنم؟

Mag-Mag
شنبه 30 بهمن 1395, 11:56 صبح
چون کلا باز کردن سایت در تب های مختلف یک عمل سمت کلاینت هست ، باید یکسری طرفند توی کدت بزنی که بتونی جلوش رو بگیری
به نظرم
موقع لاگین کردنش یک سشن ست کن


protected void Page_Load(object sender, EventArgs e)
{
if (Session["PageOpened"] != null)
{
// The page is already opened in another tab.
}
else { Session["PageOpened"] = true; }
}


بعد بالای صفحه ازمونت چک کن ، اگر این سشن مقدار داره ، یعنی صفحه در تب دیگه ای بازه
البته برای اینکه کارت راحت تر بشه ، میشه اون سشنت به جای مقدار TRUE یک شمارنده باشه
و هر وقت 1 هست ، یعنی یک بار لاگین کرده

حالا اگر یک تب جدید باز کنه
و از اول بیاد توی صفحه لاگین (معمولا اینجا چون سش ها مقدار دارن ، مستقیم میره به صفحه بعدی) ، اما اون کد بالا چون توی پیج لود هست ، در هر صورت اجرا میشه و کانتر ما میشه 2
(میتونی به جای صفحه لاگین توی یک صفحه ای بزاری ، که کاربر قبل از ازمون حتما توش میره)

ولی زمانی که مرورگر رو میبنده (اون کد قبلی که برات گذاشتم)
باید سشن رو خالی کنی

چک های اضافی تر هم باید بکنی
مثلا کاربر میتونه ادرس ازمون رو کپی کنه توی یک تب دیگه
خوب در این صورت مقدار (Request.UrlReferrer) نال هست و می تونی جلوش رو بگیری


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

چون به نظرم راهی نداره ، که به فهمی این کاربر الان چنتا تب از سایت تو رو باز داره
چون سشن ها بین تب های یک مرورگر مشترکه

و باید با ست کردن یکسری موارد
جلوش رو بگیری

مثلا مثل همین راه حل
مجبورش کنی ، حتما قبل از ازمون بره توی یک صفحه و از اونجا بره توی صفحه ازمون
و توی اون صفحه parent یک مقدار ست کنی
و توی صفحه ازمون چک کنی اون مقدار ست شده باشه
و Request.UrlReferrer هم مساوی اون Parent باشه

saeid6366
شنبه 30 بهمن 1395, 17:32 عصر
واقعا لطف کردی. فقط چه طوری سشن رو حذف کنم موقع بستن مرورگر؟

Tekyegah
شنبه 30 بهمن 1395, 21:25 عصر
سلام
به نظر من شما باید طرف مقابلتون رو متقاعد کنید که برگذاری آزمون آنلاین اینترنتی چهارچوبی داره که باید طبق اون برید جلو .
با این حالتی که تعریف کردید بطور مثال :
اگر فرض بر این باشه که کاربر هر بار فقط یک سوال رو میبینه و باید جواب بده که بره مرحله بعد . اگر کاربر شما بیاد تو صفحه آزمون و سوال رو بخونه ، اینترنت رو قطع کنه و مرورگر رو ببنده . بره و جواب رو پیدا کنه و باز بیاد Login کنه و مثلا پاسخ سوال 1 رو داد . چقدر زمان برای در نظر گرفته شده ! 5 ثانیه .
و همینطور سوالات رو یکی بعد از دیگری جواب بده !!!

به نظر من برای این موضوع شما باید قوانینی رو در نظر بگیرید .

بهترین حالت برای شما "زمان آزمون" هست . یعنی مثلا از ساعت 15:00 الی 15:45 برای ورود و پاسخ به سوالات وقت بدید .

موفق باشید...

saeid6366
شنبه 30 بهمن 1395, 21:47 عصر
سلام
به نظر من شما باید طرف مقابلتون رو متقاعد کنید که برگذاری آزمون آنلاین اینترنتی چهارچوبی داره که باید طبق اون برید جلو .
با این حالتی که تعریف کردید بطور مثال :
اگر فرض بر این باشه که کاربر هر بار فقط یک سوال رو میبینه و باید جواب بده که بره مرحله بعد . اگر کاربر شما بیاد تو صفحه آزمون و سوال رو بخونه ، اینترنت رو قطع کنه و مرورگر رو ببنده . بره و جواب رو پیدا کنه و باز بیاد Login کنه و مثلا پاسخ سوال 1 رو داد . چقدر زمان برای در نظر گرفته شده ! 5 ثانیه .
و همینطور سوالات رو یکی بعد از دیگری جواب بده !!!

به نظر من برای این موضوع شما باید قوانینی رو در نظر بگیرید .

بهترین حالت برای شما "زمان آزمون" هست . یعنی مثلا از ساعت 15:00 الی 15:45 برای ورود و پاسخ به سوالات وقت بدید .

موفق باشید...

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

Mag-Mag
یک شنبه 01 اسفند 1395, 08:21 صبح
واقعا لطف کردی. فقط چه طوری سشن رو حذف کنم موقع بستن مرورگر؟

توی اون کد بالا که موقع بسته شدن مرورگر پیام میده
باید با آزاکس یک تابع سمت سرور رو فراخونی کنی

مثلا اینطوری (https://www.codeproject.com/questions/268493/clear-session-using-javascript-function)

saeid6366
یک شنبه 01 اسفند 1395, 08:42 صبح
توی اون کد بالا که موقع بسته شدن مرورگر پیام میده
باید با آزاکس یک تابع سمت سرور رو فراخونی کنی

مثلا اینطوری (https://www.codeproject.com/questions/268493/clear-session-using-javascript-function)این تابعی که گفتید موقع بستن مرورگر پیغام میده برای من کار نمیکنه باید کد دیگری هم نوشت؟ (من داخل تگ script ودر هد صفحه گذاشتمش):

window.addEventListener("beforeunload", function (e) {
var confirmationMessage = "\o/";

(e || window.event).returnValue = confirmationMessage; //Gecko + IE
return confirmationMessage; //Webkit, Safari, Chrome
});

Mag-Mag
یک شنبه 01 اسفند 1395, 09:28 صبح
بهتره در انتهای صفحه بعد از جایی که Jquery.js رو به صفحه ات ادد کردی بنویسی


<script language="javascript" type="text/javascript" src="Scripts/jquery-1.8.2.js"></script>
<script language="JavaScript">
window.addEventListener("beforeunload", function (e) {
var confirmationMessage = "\o/";
(e || window.event).returnValue = confirmationMessage; //Gecko + IE
return confirmationMessage; //Webkit, Safari, Chrome

});
</script>

saeid6366
یک شنبه 01 اسفند 1395, 10:18 صبح
بهتره در انتهای صفحه بعد از جایی که Jquery.js رو به صفحه ات ادد کردی بنویسی


<script language="javascript" type="text/javascript" src="Scripts/jquery-1.8.2.js"></script>
<script language="JavaScript">
window.addEventListener("beforeunload", function (e) {
var confirmationMessage = "\o/";
(e || window.event).returnValue = confirmationMessage; //Gecko + IE
return confirmationMessage; //Webkit, Safari, Chrome

});
</script>
واقعاسپاسگزارم.فقط یه سوال دیگه (ببخشید که خیلی می پرسم:خجالت:) این تابع موقع رفرش صفحه هم اجزا میشه نمیشه کاری کرد که این طور نشه؟ (فقط موقع بستن اجرا شه)

Tekyegah
یک شنبه 01 اسفند 1395, 19:44 عصر
باید کاربرها با شرایط شما کنار بیان

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

میتونه هم اینترنت قطع شده باشه ، هم برق رفته باشد ... هم مرورگر رو بسته باشه ...

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