ОК, вот что я считаю решением: Page.IsPostBack уже достаточно достаточно безопасно, если включена проверка событий.Позвольте мне объяснить мои рассуждения ниже, и я буду рад, если кто-нибудь добавит комментарий, если я что-то не так сделал.
Для того, чтобы фальшбэк постбека был опубликован на ASP.net и активировал элемент управления OnClick
событие, с включенной проверкой события, клиент должен отправить поле формы __EVENTVALIDATION
.Это поле содержит уникально сгенерированную строку, которая, в основном, сообщает ASP.net, который управляет событием обратной передачи для этой страницы.Если вы попытаетесь подменить постбэк для кнопки, для которой установлена .Visibility = false
, вы увидите сообщение об ошибке проверки события.Таким образом, похоже, что вы не можете напрямую подделать щелчок на скрытом элементе управления.
Как насчет подмены постбэка одной из существующих кнопок на странице, которую вы обработали (т.е. у вас есть разрешение на просмотр / клик по нему)?Ну, вы можете отправить постбэк на страницу, но вам нужно отправить действительный __VIEWSTATE
, или вы просто получите ошибку «информация о состоянии неверна».Для того, чтобы иметь действительный __VIEWSTATE
, вам уже нужно было загрузить страницу как без обратной передачи, верно?Это означает, что код проверки безопасности будет выполнен хотя бы один раз, скрывая соответствующие элементы управления и записывая его в __VIEWSTATE
.Таким образом, когда вы публикуете постфок-постбек, да, это приведет к тому, что Page.IsPostBack
будет иметь значение true, но это не имеет значения, потому что отправленный __VIEWSTATE
уже будет сгенерирован при предыдущей загрузке страницы без обратной передачи, чтобы скрыть содержимоеу вас не должно быть доступа к ... так что вы можете подделать обратную передачу, но только передав __VIEWSTATE
, который был ранее сгенерирован при загрузке страницы без обратной передачи.
Итак, из-за этихНа самом деле, должно быть безопасно размещать код проверки безопасности только внутри блока Page.IsPostBack == false
.Это всегда должно выполняться один раз, прежде чем на сервер ASP.net может быть отправлена допустимая обратная передача.Или я что-то упустил?