У меня есть текстовое поле в приложении mvc, которое помечено как readonly (с использованием JavaScript). Однако, если пользователь знает JavaScript, он может нажать F12 и выполнить $("#AmountBox").prop('readonly', false);
и ввести какое-то значение в текстовое поле и нажать кнопку «Отправить» и изменить значение суммы в базе данных. Как я могу запретить пользователям вводить значение в текстовые окна, только для чтения или отключенные? есть ли способ выполнить проверку сервера?Проверка сервера для текстовых полей только для чтения - prevevt введите значение
ответ
Вы можете предотвратить переполнение, добавив черный список (или белый список) в действие вашего контроллера, которое принимает POST.
[HttpPost]
public ActionResult Edit([Bind(Exclude = "AmountBox")] SomeClass model)
{
//
}
Если вы на самом деле нужно, что только для чтения значение, но не хотите его изменить, я думаю, вы должны либо:
A) Сохранение значения на сервере до того, как данные формы отправляются в браузере и сравнить, когда писал (несколько способов сделать это)
или
B) Если вы можете извлечь соответствующее значение только при размещении и вам не нужно, чтобы отправить его клиенту в все.
Значение сохраняется в базе данных, если сумма (свойство) равна нулю (нет значения), текстовое поле доступно для редактирования, и пользователь может ввести в него значение, но если пользователь уже назначил значение для суммы, у него нет возможности редактировать но он должен это видеть. – user217648
О, хорошо, тогда исключение из привязки в этом случае не будет работать. Вот что я буду делать: в post, я бы перечитал значение из БД перед сохранением и, если он отличен от нуля, затем проигнорирует опубликованное значение (или перезапишет значение от клиента с выбранным значением перед обновлением), в противном случае обновить стандартным образом. Я думаю, что это должно гарантировать, что измененные данные будут проигнорированы. На самом деле вы даже можете поймать эту ситуацию, когда это произойдет, и зарегистрировать попытку взлома. –
Согласно вашему описанию в комментарии, вы хотите, чтобы эти данные суммирования отправлялись от клиента к серверу, если оно равно нулю раньше. В противном случае сумма будет показана. Таким образом, чтобы проверять данные с клиента, сервер должен проверить, нет ли в базе данных значения суммы и отклонять или игнорировать любые данные, отправленные в этом случае. Так что-то вроде
public void onDataReceived(Data data)
{
if(db.GetAmountOfUserFromDB(data.userID) != null && data.AmountBox != null)
{
//just ignore the data.AmountBox value here or react with a message like "It is not allowed to change the amount"
}
else
{
//add data.AmountBox to db or whatever
}
}
Все, что клиент, отправивший на сервер, может быть обработан клиентом раньше. Даже не нужно быть JavaScript. Таким образом, вам необходимо выполнить проверку сервера данных клиента на сервере, чтобы предотвратить их. Но без знания вашего контекста трудно сказать, как это сделать в этом случае –
Я согласен, что у меня странная ситуация, и я должен показать пользователю сумму. если он равен нулю, пользователь может ввести в него значение и отправить его, но если в базе данных уже есть значение, оно должно отображаться, но не редактироваться. – user217648