Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: ASP.NET MVC
Войти
Регистрация
Восстановить пароль
 
ORLENOK
89 / 88 / 37
Регистрация: 05.08.2011
Сообщений: 419
Завершенные тесты: 5
1

Где вы храните ID редактируемого элемента?

16.10.2016, 18:20. Просмотров 358. Ответов 12
Метки нет (Все метки)

Добрый день!

Недавно начал изучать MVC. В некоторых статьях встречал такой код:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[HttpGet]
public ActionResult Buy(int id)
{
    ViewBag.Id = id;
    return View();
}
 
[HttpPost]
public string Buy(Purchase purchase)
{
    // добавляем информацию о покупке в базу данных
    db.Purchases.Add(purchase);
    // сохраняем в бд все изменения
    db.SaveChanges();
    return "Спасибо за покупку!";
}
HTML5
1
2
3
4
5
6
7
8
9
10
<form method="post" action="">
            <input type="hidden" value="@ViewBag.Id" name="Id" />
            <table>
                <tr><td><p>Имя </p></td>
                    <td><input type="text" name="Person" /> </td></tr>
                <tr><td><p>Адрес :</p></td><td> 
                   <input type="text" name="Address" /> </td></tr>
                <tr><td><input type="submit" value="Отправить" /> </td><td></td></tr>
            </table>
</form>
Правильно ли я понимаю, что при такой записи, пользователь запросто может изменить id редактируемого элемента в HTML коде странице и в дальнейшем записать в БД?
Как от этого можно защититься? Где лучше хранить ID редактируемого элемента (Session, Cookies, ViewState... что-то ещё)?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.10.2016, 18:20
Ответы с готовыми решениями:

Где вы храните свои закладки браузера?
Сейчас пользуюсь Chrome - очень удобная у него синхронизация (закладки, пароли,...

[Опрос] Где Вы храните исходники своих приватных проектов?
Добрый день, раньше никогда не любил пихать чтолибо важное в облака, но после...

Узнать имя редактируемого поля
Доброго всем времени суток! Вопрос может и тривиальный, но времени нет на...

Текстовой редактор: как подогнать поля редактируемого текста
Добрый вечер! Пишу текстовой редактор на Qt совместно с QML. Задача...

Соседями элемента A ij в матрице назовем элементы А kl, где
Соседями элемента A ij в матрице назовем элементы А kl, где i-l&lt;k&lt;i+l ,...

12
sau
1994 / 1612 / 264
Регистрация: 22.07.2011
Сообщений: 6,085
Завершенные тесты: 1
16.10.2016, 18:29 2
В данном случае id не является каким то секретным ключем , с помощью которого можно набедакурить. , максимум купит не то что хотел.
0
ORLENOK
89 / 88 / 37
Регистрация: 05.08.2011
Сообщений: 419
Завершенные тесты: 5
16.10.2016, 18:36  [ТС] 3
sau,
Видимо, из-за того, что я хотел привести меньше кода, получилось всё сложнее.
Так, наверное, будет понятнее:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    public class Book
    {
        // ID книги
        public int Id { get; set; }
        public string Name { get; set; }
        public string Author { get; set; }
        public int Price { get; set; }
    }
    public class Purchase
    {
        // ID покупки
        public int PurchaseId { get; set; }
        // имя и фамилия покупателя
        public string Person { get; set; }
        public string Address { get; set; }
        public int BookId { get; set; }
    }
Код Get и Post:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[HttpGet]
public ActionResult Buy(int id)
{
    ViewBag.BookId = id;
    return View();
}
 
[HttpPost]
public string Buy(Purchase purchase)
{
    // добавляем информацию о покупке в базу данных
    db.Purchases.Add(purchase);
    // сохраняем в бд все изменения
    db.SaveChanges();
    return "Спасибо за покупку!";
}
И код формы:
HTML5
1
2
3
4
5
6
7
8
9
10
form method="post" action="">
            <input type="hidden" value="@ViewBag.BookId" name="BookId" />
            <table>
                <tr><td><p>Имя </p></td>
                    <td><input type="text" name="Person" /> </td></tr>
                <tr><td><p>Адрес :</p></td><td> 
                   <input type="text" name="Address" /> </td></tr>
                <tr><td><input type="submit" value="Отправить" /> </td><td></td></tr>
            </table>
</form>
а если заменить id то в бд запишется, что была совершена покупка другой вещи. Поэтому и возник вопрос
0
sau
1994 / 1612 / 264
Регистрация: 22.07.2011
Сообщений: 6,085
Завершенные тесты: 1
16.10.2016, 18:46 4
Ну и что ? - либо эта вещь не будет найдена , если id от фанаря . либо будет куплена другая вещь - которая не нужна пользователю , владельцу сайта всеравно за что он заплатит.
Строго говоря , id можно отображать на странице открыто вместо картинок с товарами , просто это будет не наглядно и не удобно для пользователя.
0
Usaga
Эксперт .NET
5128 / 3489 / 614
Регистрация: 21.01.2016
Сообщений: 13,839
Завершенные тесты: 2
16.10.2016, 18:51 5
ORLENOK, в чём вопрос? Как защититься от говно-хакера пытающегося через подмену идентификатора купить товар отличный от того, что ему было предложено на загруженной странице?

Это, вообще, проблема?
0
ORLENOK
89 / 88 / 37
Регистрация: 05.08.2011
Сообщений: 419
Завершенные тесты: 5
16.10.2016, 19:01  [ТС] 6
sau, А если будет происходить редактирование элемента, где Вы будете хранить его id?
Если в VS, сделать так: Добавить представление -> Шаблон: Edit, Выбрать модель, выбрать БД контекст.
Код будет содержать такие строки:
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    <div class="form-horizontal">
        <h4>Book</h4>
        <hr />
        @Html.ValidationSummary(true)
        @Html.HiddenFor(model => model.Id)
 
        <div class="form-group">
            @Html.LabelFor(model => model.Name, new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.Name)
                @Html.ValidationMessageFor(model => model.Name)
            </div>
        </div>
....
</div>
Соответственно в html коде странице будет находиться id редактируемого элемента.
И, я так понимаю, подразумевается, что в контроллере должно быть указано, что-то вроде этого:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
        public ActionResult Edit(int id)
        {
            return View(db.Books.Find(id));
        }
        
        [HttpPost]
        public string Edit(Models.Book book)
        {
            ///Код сохранения в БД
            ///...
            //////
            return "Данные успешно сохранены!";
        }
Но ведь это же не правильно.

Добавлено через 45 секунд
Usaga, Проблемы нет, есть вопрос: Где Вы храните ID редактируемого элемента?
0
Usaga
Эксперт .NET
5128 / 3489 / 614
Регистрация: 21.01.2016
Сообщений: 13,839
Завершенные тесты: 2
16.10.2016, 19:03 7
ORLENOK, тут всё правильно. Если пользователь имеет право на редактирование только некоторого подмножества элементов, то на стороне сервена обязательно нужно делать проверку. От этого никуда не деться. Но какой-то идентификатор, явно определяющий сущность, всё равно придётся "высовывать наружу".
0
ORLENOK
89 / 88 / 37
Регистрация: 05.08.2011
Сообщений: 419
Завершенные тесты: 5
16.10.2016, 19:09  [ТС] 8
Usaga, Если хранить ID в Session - это адекватное решение? Или есть что-то лучше?
0
Usaga
Эксперт .NET
5128 / 3489 / 614
Регистрация: 21.01.2016
Сообщений: 13,839
Завершенные тесты: 2
16.10.2016, 19:11 9
ORLENOK, эм... Ты можешь хранить в Session всё что угодно))) Как это соотносится с первоначальным вопросом?)
0
ORLENOK
89 / 88 / 37
Регистрация: 05.08.2011
Сообщений: 419
Завершенные тесты: 5
16.10.2016, 19:18  [ТС] 10
Usaga,
Цитата Сообщение от ORLENOK Посмотреть сообщение
Где лучше хранить ID редактируемого элемента (Session, Cookies, ViewState... что-то ещё)?
Название темы)
Я понимаю, что в Session можно хранить любые данные. Мне интересно, где Вы в своих проектах храните ID редактируемой сущности?
Код из сообщения выше не безопасный. И хранить ID, редактируемой сущности, на странице - не правильно. Поэтому и возникает этот вопрос. Где хранить этот ID?
0
Usaga
Эксперт .NET
5128 / 3489 / 614
Регистрация: 21.01.2016
Сообщений: 13,839
Завершенные тесты: 2
16.10.2016, 19:25 11
ORLENOK, лично я нигде не храню ID редактируемой сущности. Я её запизиваю напрямую в URL. Типа http://mysite.com/Items/Edit/12343.

На стороне сервера делаю проверку, имеет ли правой данный крендель (прошедший авторизацию) редактировать данный элемент или нет.

Вроде бы данная схема работает...

Добавлено через 2 минуты
Да и как повлияет сохранение ID чего-то куда-то на безопасноть? Ну сохранил ты ID в сессии и что?
1
lvlkoo
.NET C#,ASP.NET MVC
446 / 396 / 183
Регистрация: 16.10.2010
Сообщений: 1,615
Завершенные тесты: 2
16.10.2016, 19:29 12
Храню стандартно, при пост запросе обычное скрыто поле на странице. При гет запросе соостветвенно ид передается как парметр как написал выше Usaga

C#
1
@Html.HiddenFor(m=> m.Id);
Вообще не считаю это проблеммой. Так как в любом случа если валидация на стороне сервера нужна, то она нужна, и делается независимо от того скрыт у вас ид или нет
1
Metall_Version
2119 / 1256 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
Завершенные тесты: 2
16.10.2016, 19:45 13
идентифицировать некую сущность - это неизбежная необходимость.

по сути есть два вариант ее хранения:
1) в url как часть path, или как часть query string (rest подобный метод)
2) на самой странице (можно как скрытый html элемент, как атрибут html элемента, или в JS коде)

пользователь может подменить этот идентификатор прямо на странице, в случае покупки - это не страшно, так как пользователь просто купит другой товар
но в случае если это редактирование (удаление) какого либо ресурса - то тут нужно делать авторизацию - проверять имеет ли права, данный юзер, на редактирование этого ресурса.
2
16.10.2016, 19:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.10.2016, 19:45

Не пойму, где ошибка, веду поиск min элемента
Не пойму, где ошибка, веду поиск min элемента! Подскажите, кто знает!!! ...

Нахождение минимального элемента и номера строк и столбцов, где он расположен
Помогите пожалуйста с программой. Нужно создать две процедуры( одну...

Определить индекс элемента массива, наиболее близкого к К.Где ошибка?
Вводим число n-сколько чисел он нам должен показать и число K.Суть чтобы из...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru