PDA

View Full Version : دور زدن قابلیت requier یک فرم



ali_72
شنبه 07 شهریور 1394, 08:44 صبح
سلام

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

connection string من هم در فایل webconfig نیست

به نظرتون چطور تونسته این کار رو انجام بده
البته ایمیلش تو ثبت نامش هست ولی نمیدونم کار درستی هست بهش میل بدم یا نه :لبخند:

دوستان راهنمایی کنید که چطور میشه فرم های ثبت نام رو این مدلی دور زد رو اون قسمت کار کنم برطرف شه



دوستان ببخشید که عنوان تاپیک اشتباه تایپی داره تازه دیدمش :افسرده:

ممنون

HOSSEINONLINE7
شنبه 07 شهریور 1394, 09:09 صبح
سلام

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

connection string من هم در فایل webconfig نیست

به نظرتون چطور تونسته این کار رو انجام بده
البته ایمیلش تو ثبت نامش هست ولی نمیدونم کار درستی هست بهش میل بدم یا نه :لبخند:

دوستان راهنمایی کنید که چطور میشه فرم های ثبت نام رو این مدلی دور زد رو اون قسمت کار کنم برطرف شه



دوستان ببخشید که عنوان تاپیک اشتباه تایپی داره تازه دیدمش :افسرده:

ممنون

سلام حتما شما سمت سرور Validation را چک نکردید طرف هم جاوا اسکریپت مرورگرش را غیر فعال کرده و تونسته دور بزنه .

hakim22
شنبه 07 شهریور 1394, 14:07 عصر
شما حتما باید Validation رو روی مدل هم تنظیم کنید. همچنین

یا استفاده از سایت رو بدون javascript غیر ممکن کنید یا قبل از ثبت اطلاعات در دیتابیس ولیدیشن سمت سرور هم انجام بدید.

ali_72
یک شنبه 08 شهریور 1394, 07:05 صبح
سلام حتما شما سمت سرور Validation را چک نکردید طرف هم جاوا اسکریپت مرورگرش را غیر فعال کرده و تونسته دور بزنه .

رو مدل ولیدیشن ست شده
اصلا جاوا اسکریپت استفاده نمیکنم برای ولیدیشن . دیگه اینقدرها هم تازه کار نیستم :افسرده:
من از jquery validation برای اعتبارسنجی بدون پست بک استفاده میکنم

ali_72
یک شنبه 08 شهریور 1394, 07:07 صبح
اینم از کدهایی که استفاده کردم
لطفا راهنمایی کنید ممنون


// // GET: /Account/Register
[AllowAnonymous]
public virtual ActionResult Register()
{
ViewBag.Ostan_Id = new SelectList(db.Ostans.OrderBy(o => o.Nam), "Id", "Nam");
return View();
}


//
// POST: /Account/Register
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public virtual async Task<ActionResult> Register(RegisterViewModel model)
{
if (Session["Captcha"] == null || Session["Captcha"].ToString() != model.Captcha)
{
ModelState.AddModelError("Captcha", "حاصل جمع عدد امنیتی اشتباه است");
}
if (ModelState.IsValid)
{
model.Ip = _Ip;
model.Tarikh = DateTime.Now;
model.Faal = true;


var user = new ApplicationUser();
Shared_Function.SetProperties(model, user);
var result = await UserManager.CreateAsync(user, model.Password);

if (result.Succeeded)
{
var UserManager2 = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(db));
UserManager2.AddToRole(user.Id, "User");


await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false);

// For more information on how to enable account confirmation and password reset please visit http://go.microsoft.com/fwlink/?LinkID=320771
// Send an email with this link
//string code = await UserManager.GenerateEmailConfirmationTokenAsync(us er.Id);
//var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
//await UserManager.SendEmailAsync(user.Id, "Confirm your account", "Please confirm your account by clicking <a href=\"" + callbackUrl + "\">here</a>");

return RedirectToAction("Index", "Home");
}
AddErrors(result);
}


// If we got this far, something failed, redisplay form
ViewBag.Ostan_Id = new SelectList(db.Ostans.OrderBy(o => o.Nam), "Id", "Nam");
return View(model);
}


@using (Html.BeginForm("Register", "Account", FormMethod.Post, new { role = "form" })) {
@Html.AntiForgeryToken()
@Html.ValidationSummary()
<div class="row">
<div class="content col-sm-6">
<table class="form">
<tbody>
<tr>
<td><span class="required">*</span>@Html.DisplayNameFor(m => m.UserName)</td>
</tr>
<tr>
<td>
@Html.TextBoxFor(m => m.UserName, new { @class = "neda-form-control" })
@Html.ValidationMessageFor(model => model.UserName, String.Empty, new { @class = "required" })
</td>
<td></td>
</tr>
<tr>
<td>
<span class="required">*</span>
@Html.DisplayNameFor(m => m.Password)
</td>
<td>
<span class="required">*</span>
@Html.DisplayNameFor(m => m.ConfirmPassword)
</td>
</tr>
<tr>
<td>
@Html.PasswordFor(m => m.Password, new { @class = "neda-form-control" })
@Html.ValidationMessageFor(model => model.Password, String.Empty, new { @class = "required" })
</td>
<td>
@Html.PasswordFor(m => m.ConfirmPassword, new { @class = "neda-form-control" })
@Html.ValidationMessageFor(model => model.ConfirmPassword, String.Empty, new { @class = "required" })
</td>
</tr>
<tr>
<td><span class="required">*</span>@Html.DisplayNameFor(m => m.Email)</td>
<td><span class="required">*</span>@Html.DisplayNameFor(m => m.Mobile)</td>
</tr>
<tr>
<td>
@Html.TextBoxFor(m => m.Email, new { @class = "neda-form-control" })
@Html.ValidationMessageFor(model => model.Email, String.Empty, new { @class = "required", @type = "Email" })
</td>
<td>
@Html.TextBoxFor(m => m.Mobile, new { @class = "neda-form-control" })
@Html.ValidationMessageFor(model => model.Mobile, String.Empty, new { @class = "required" })
</td>
</tr>
<tr>
<td>
<span class="required">*</span>@Html.DisplayNameFor(m => m.Ostan_Id)
</td>
<td>
<span class="required">*</span>
@Html.DisplayNameFor(m => m.Shahrestan)
</td>
</tr>
<tr>
<td>
@Html.DropDownList("Ostan_Id", (IEnumerable<SelectListItem>)ViewBag.Ostan_Id, new { @class = "neda-form-control" })
@Html.ValidationMessageFor(model => model.Ostan_Id, String.Empty, new { @class = "required" })
</td>
<td>
@Html.TextBoxFor(m => m.Shahrestan, new { @class = "neda-form-control" })
@Html.ValidationMessageFor(model => model.Shahrestan, String.Empty, new { @class = "required" })
</td>
</tr>
<tr>
<td>
<span class="required">*</span>
@Html.DisplayNameFor(m => m.Captcha)
</td>
</tr>
<tr>
<td>
<img id="imgcpatcha" src="@Url.Action("CaptchaImage","Captcha")" width="180" height="50">
<a id="refresh" title="عکس جدید">عکس جدید</a>
</td>
</tr>
<tr>
<td>
@Html.TextBoxFor(m => m.Captcha, new { @class = "neda-form-control" })
@Html.ValidationMessageFor(m => m.Captcha, String.Empty, new { @class = "required" })
</td>
<td>
<input value="ثبت نام" class="button btn btn-theme-default" type="submit">
</td>
</tr>
</tbody>
</table>
</div>
</div>
}


@section Scripts { @Scripts.Render("~/bundles/jqueryval")
<script type="text/javascript">
$('#refresh').click(function () {
var d = new Date();
$("#imgcpatcha").attr("src", "/Captcha/CaptchaImage?" + d.getTime());
});
</script>
}

ali_72
یک شنبه 08 شهریور 1394, 13:18 عصر
در ضمن کاربر ثبت شده فعال نیود - تاریخ و آیپی هم براش ثبت نشده بود

hakim22
یک شنبه 08 شهریور 1394, 15:21 عصر
رو مدل ولیدیشن ست شده


یعنی شما ادعا میکنید در SQL تنظیم شده یک فیلد نمیتونه Null باشه ولی الان مقدار Null داره !!؟



اصلا جاوا اسکریپت استفاده نمیکنم برای ولیدیشن . دیگه اینقدرها هم تازه کار نیستم :افسرده:
من از jquery validation برای اعتبارسنجی بدون پست بک استفاده میکنم


jquery همون جاوا اسکریپته.

شما اگه مدل و ویو مدل مربوط به ثبت نام رو بزارید فکر میکنم بشه بهتر بررسی کرد.

ali_72
دوشنبه 09 شهریور 1394, 07:14 صبح
یعنی شما ادعا میکنید در SQL تنظیم شده یک فیلد نمیتونه Null باشه ولی الان مقدار Null داره !!؟



jquery همون جاوا اسکریپته.

شما اگه مدل و ویو مدل مربوط به ثبت نام رو بزارید فکر میکنم بشه بهتر بررسی کرد.

ممنون از لطف و توجه شما
نه منظورم این بود که از viewmodelدر صفحه استفاده کردم و فقط به جاوااسکریپت اکتفا نکردم و از jquery validation فقط برای اعتبارسنجی بدون پست بک استفاده کردم
ببخشید کامل ننوشتم روی viewmodel ولیدیشن ست کردم
نه فیلدها allow null بودن ولی با توجه به viewmodel ای که من نوشته بودم کاربر نباید بتونه بدون پرکردن فیلدهای مشخص شده از طرف من ثبت نام کنه
میدونم که الان ممکنه بگید که خوب چرا allow null گذاشتی که اینطوری ثبت نام شه. این برام مهم نیست برام مهم اینه که بدونم چطور با اینکه من در viewmodel تنظیم کرده بودم و طبق کد من نباید میتونست بدون خالی گذاشتن این موارد ثبت نام شه
و بدونم که شرط های viewmodel جای دور زدن این مدلی دارند یا نه

اینم کد viewmodel من:


public class RegisterViewModel {
[Required(ErrorMessage = "لطفا نام کاربری را وارد نمایید")]
[Display(Name = "نام کاربری")]
[StringLength(30, ErrorMessage = "لطفا نام کاربری را بیشتر از 6 کاراکتر و کمتر از 30 کاراکتر وارد کنید", MinimumLength = 4)]
[RegularExpression(@"^[a-zA-Z]+$", ErrorMessage = "لطفا فقط از حروف انگلیسی برای نام کاربری استفاده کنید")]
//[System.Web.Mvc.Remote("doesUserNameExist", "Account", HttpMethod = "POST", ErrorMessage = "نام کاربری انتخاب شده تکراری است")]
public string UserName { get; set; }


[Required(ErrorMessage = "لطفا کلمه عبور را وارد نمایید")]
[StringLength(100, ErrorMessage = "حداقل تعداد کارکتر کلمه عبور {2} است.", MinimumLength = 6)]
[DataType(DataType.Password)]


[Display(Name = "کلمه عبور")]
public string Password { get; set; }


[DataType(DataType.Password)]
[Required(ErrorMessage = "لطفا تکرار کلمه عبور را وارد نمایید")]
[Display(Name = "تکرار کلمه عبور")]
[System.Web.Mvc.Compare("Password", ErrorMessage = "کلمه عبور و تکرار آن با هم مطابقت ندارند")]
public string ConfirmPassword { get; set; }


[Required(ErrorMessage = "لطفا استان محل زندگی را انتخاب نمایید")]
[Display(Name = "استان")]
public Guid Ostan_Id { get; set; }


[Required(ErrorMessage = "لطفا شهرستان را وارد نمایید")]
[Display(Name = "شهر")]
public string Shahrestan { get; set; }


[Display(Name = "تلفن همراه")]
[Required(ErrorMessage = "لطفا تلفن همراه را وارد نمایید")]
[UIHint("Number")]
[RegularExpression(@"^[0-9]+$", ErrorMessage = "برای تلفن همراه فقط اعداد مجاز می باشند")]
public string Mobile { get; set; }

[EmailAddress]
[Required(ErrorMessage = "لطفا ایمیل را وارد نمایید")]
[Display(Name = "آدرس الکترونیکی")]
[DataType(DataType.EmailAddress, ErrorMessage = "ایمیل را به درستی وارد کنید")]
public string Email { get; set; }


[Required(ErrorMessage = "لطفا حاصل جمع عدد امنیتی را وارد کنید")]
[Display(Name = "لطفا حاصل جمع عدد امنیتی را وارد کنید")]
public string Captcha { get; set; }
}




اینم مدل:

public class ApplicationUser : IdentityUser {

public string Shahrestan { get; set; }
public string Mobile { get; set; }
public bool Faal { get; set; }
public string IP { get; set; }
public DateTime? Tarikh { get; set; }
public Guid? Ostan_Id { get; set; }
[ForeignKey("Ostan_Id")]
public virtual Ostan Ostan { get; set; }
public ICollection<Factor> Factor { get; set; }
public ICollection<Hesabdari> Hesabdari { get; set; }
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
{
// Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
// Add custom user claims here
return userIdentity;
}
}

hakim22
دوشنبه 09 شهریور 1394, 08:14 صبح
علتش اینه که ModelState.IsValid فقط شیی که مقدار داره رو چک میکنه یعنی اگر به هر دلیلی registerViewModel کلا Null باشه. این شرط مقدار true برمیگردونه.

حالا چطور میشه که مقدار Null وارد متد بشه : ASP MVC از Model Binding برای مپ کردن اطلاعات دریافتی از http به کلاس سی شارپ استفاده میکنه.
اگر به هر دلیلی این مپ کردن طبق انتظارات ASP MVC نباشه مقدار null از توش در میاد.

یکی میتونه با شبیه سازی متد Post و ارسال یک فرم خالی مقدار null به سرور بفرسته. به همین خاطر شما باید برای مقادیر null خود ویو مدل هم چک کنید و همینطور باید در Modelو البته در SQL
هم شرطهای لازم رو بزارید.

HOSSEINONLINE7
دوشنبه 09 شهریور 1394, 09:39 صبح
علتش اینه که ModelState.IsValid فقط شیی که مقدار داره رو چک میکنه یعنی اگر به هر دلیلی registerViewModel کلا Null باشه. این شرط مقدار true برمیگردونه.

حالا چطور میشه که مقدار Null وارد متد بشه : ASP MVC از Model Binding برای مپ کردن اطلاعات دریافتی از http به کلاس سی شارپ استفاده میکنه.
اگر به هر دلیلی این مپ کردن طبق انتظارات ASP MVC نباشه مقدار null از توش در میاد.

یکی میتونه با شبیه سازی متد Post و ارسال یک فرم خالی مقدار null به سرور بفرسته. به همین خاطر شما باید برای مقادیر null خود ویو مدل هم چک کنید و همینطور باید در Modelو البته در SQL
هم شرطهای لازم رو بزارید.

بحث جالب شد . حالا سوال : مپ کردن چطور میشه که طبق انتظارات ASP MVC نیست و مدل Null میشه ؟

اگر میشه یکم بیشتر توضیح بدید ...

ali_72
دوشنبه 09 شهریور 1394, 10:14 صبح
علتش اینه که ModelState.IsValid فقط شیی که مقدار داره رو چک میکنه یعنی اگر به هر دلیلی registerViewModel کلا Null باشه. این شرط مقدار true برمیگردونه.

حالا چطور میشه که مقدار Null وارد متد بشه : ASP MVC از Model Binding برای مپ کردن اطلاعات دریافتی از http به کلاس سی شارپ استفاده میکنه.
اگر به هر دلیلی این مپ کردن طبق انتظارات ASP MVC نباشه مقدار null از توش در میاد.

یکی میتونه با شبیه سازی متد Post و ارسال یک فرم خالی مقدار null به سرور بفرسته. به همین خاطر شما باید برای مقادیر null خود ویو مدل هم چک کنید و همینطور باید در Modelو البته در SQL
هم شرطهای لازم رو بزارید.

خیلی خیلی ممنونم
ایمیل خودشو وارد کرده بود و در ثبت نامش اومده پس اگه اگه از طریق فرم ثبت نام اقدام کرده باشه ایمیل در ویو مدل وجود داشته
شبیه سازی متد پست چطوری انجام میشه؟

hakim22
دوشنبه 09 شهریور 1394, 10:33 صبح
اول اینکه این تحلیل شخصی منه ، شما میتوانید سورس ASP MVC رو دانلود کنید که من کردم و کد مربوط به ModelBinder نزدیک به 55 تا کلاسه
عمل Bind کردن یک معجره نیست. http یک سری داده رو با استفاده از xml یا json یا هر چیزی که contenttype باشه به سرور ارسال میکنه. ModelBinder این داده ها رو تحلیل میکنه و Provider متناسب با داده پیدا میکنه و بعد عمل مپ رو انجام میده.




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


خب فیلد مربوط به Email در دیتابیس SQL به صورت Nullable نیست. پس در هر صورت باید مقدار داشته باشه.

شما مثلا با کلاس WebClient در #C میتوانید به هر سایتی اطلاعات یک فرم را شبیه سازی و ارسال کنید یا اطلاعات یک صفحه را دانلود کنید.
نرم افزارهای جانبی زیادی هم هستن که مخصوص تحلیل داده های Http و ارسال و دریافت اطلاعات به اونها ساخته شدن.
هر اطلاعاتی که مرورگر میتونه به سایت شما بفرسته هر نرم افزار دست ساز دیگه ای هم میتونه بفرسته و دریافت کنه.

ضمن اینکه شما نمیدونید کاربر چندبار سعی کرده اطلاعاتشو در سیستم ثبت کنه. لوگ فعالیت های کاربر اهمیت زیادی داره.

HOSSEINONLINE7
دوشنبه 09 شهریور 1394, 11:15 صبح
اول اینکه این تحلیل شخصی منه ، شما میتوانید سورس ASP MVC رو دانلود کنید که من کردم و کد مربوط به ModelBinder نزدیک به 55 تا کلاسه
عمل Bind کردن یک معجره نیست. http یک سری داده رو با استفاده از xml یا json یا هر چیزی که contenttype باشه به سرور ارسال میکنه. ModelBinder این داده ها رو تحلیل میکنه و Provider متناسب با داده پیدا میکنه و بعد عمل مپ رو انجام میده.



خب فیلد مربوط به Email در دیتابیس SQL به صورت Nullable نیست. پس در هر صورت باید مقدار داشته باشه.

شما مثلا با کلاس WebClient در #C میتوانید به هر سایتی اطلاعات یک فرم را شبیه سازی و ارسال کنید یا اطلاعات یک صفحه را دانلود کنید.
نرم افزارهای جانبی زیادی هم هستن که مخصوص تحلیل داده های Http و ارسال و دریافت اطلاعات به اونها ساخته شدن.
هر اطلاعاتی که مرورگر میتونه به سایت شما بفرسته هر نرم افزار دست ساز دیگه ای هم میتونه بفرسته و دریافت کنه.

ضمن اینکه شما نمیدونید کاربر چندبار سعی کرده اطلاعاتشو در سیستم ثبت کنه. لوگ فعالیت های کاربر اهمیت زیادی داره.

خوب پس این جعل درخواست یا csrf میشه درسته ؟ اگر اینطور باشه که با AntiForeignToken میشه جلوش را گرفت .

ali_72
دوشنبه 09 شهریور 1394, 11:32 صبح
اول اینکه این تحلیل شخصی منه ، شما میتوانید سورس ASP MVC رو دانلود کنید که من کردم و کد مربوط به ModelBinder نزدیک به 55 تا کلاسه
عمل Bind کردن یک معجره نیست. http یک سری داده رو با استفاده از xml یا json یا هر چیزی که contenttype باشه به سرور ارسال میکنه. ModelBinder این داده ها رو تحلیل میکنه و Provider متناسب با داده پیدا میکنه و بعد عمل مپ رو انجام میده.



خب فیلد مربوط به Email در دیتابیس SQL به صورت Nullable نیست. پس در هر صورت باید مقدار داشته باشه.

شما مثلا با کلاس WebClient در #C میتوانید به هر سایتی اطلاعات یک فرم را شبیه سازی و ارسال کنید یا اطلاعات یک صفحه را دانلود کنید.
نرم افزارهای جانبی زیادی هم هستن که مخصوص تحلیل داده های Http و ارسال و دریافت اطلاعات به اونها ساخته شدن.
هر اطلاعاتی که مرورگر میتونه به سایت شما بفرسته هر نرم افزار دست ساز دیگه ای هم میتونه بفرسته و دریافت کنه.

ضمن اینکه شما نمیدونید کاربر چندبار سعی کرده اطلاعاتشو در سیستم ثبت کنه. لوگ فعالیت های کاربر اهمیت زیادی داره.

خیلی خیلی از راهنمایی و توضیحات شما ممنونم
من همه جا سایت logگذاشته بودم الا همین ثبت نام
که حتما از الان بهش اضافه میکنم
ممنون