CryptographicException: Дополнение недопустимо и не может быть удалено и Проверка состояния отображения отказавший MAC

Контроль моего глобального исключения регистрируется, эта ошибка, кажется, невозможна удалить то независимо от того, что я делаю, я думал, что наконец избавился от него, но это вернулось снова. Вы видите strack трассировку ошибки на подобном сообщении здесь.

Примечания о среде:

IIS 6.0.NET 3,5 единственных сервера SP1 приложение ASP.NET

Шаги уже сделаны:

  
    

В моей Базе Страницы для всех моих страниц

  protected override void OnInit(EventArgs e)
  {
    const string viewStateKey = "big key value";

    Page.ViewStateUserKey = viewStateKey;
  }

Также в источнике страницы I видят, что все сгенерированные скрытые поля ASP.NET правильно в верхней части страницы.

9
задан Community 23 May 2017 в 11:55
поделиться

3 ответа

Прежде всего, начнем с того, что эта ошибка состояния просмотра происходит на PostBack .

Также я должен сказать , что я сделал все, что каждый предлагает сделать, чтобы избежать этой проблемы. И у меня одна машина, но 2 пула, на которых работают одни и те же страницы.

Итак кто-то выполняет действие , эфир человека, эфир какой-то другой поисковой машины, "щелкая" по вашим страницам, или какой-то хакер пытается проверить вашу систему на наличие проблем ...

У меня есть подобные проблемы (редкие, но существующие), и я наконец обнаружил, что люди пытаются взломать мои страницы. (с того же IP-адреса, который у меня есть, и атаки dos)

Я модифицирую функцию LoadPageStateFromPersistenceMedium () , которая переводит состояние просмотра, и с помощью регистрации вижу, что именно было введено и с каких IP-адресов. ... затем я начал отслеживать эти результаты и видеть, что состояние просмотра было изменено вручную или было полностью пустым.

В случае ошибки я просто перенаправляю его на ту же страницу ...

Вот что я сделал ...

public abstract class BasePage : System.Web.UI.Page
{
    protected override object LoadPageStateFromPersistenceMedium()
    {
        try
        {
            .. return the base, or make here your decompress, or what ever...
            return base.LoadPageStateFromPersistenceMedium();            
        }
        catch (Exception x)
        {
            string vsString = Request.Form[__VIEWSTATE];
            string cThePage = Request.RawUrl;

            ...log the x.ToString() error...
            ...log the vsString...
            ...log the ip coming from...
            ...log the cThePage...

        // check by your self for local errors
            Debug.Fail("Fail to load view state ! Reason:" + x.ToString());
        }

        // if reach here, then have fail, so I reload the page - maybe here you
        // can place somthing like ?rnd=RandomNumber&ErrorId=1 and show a message
        Responce.Redirect(Request.RawUrl, true);        

        // the return is not used after the redirect
        return string.Empty;
    }    
}

Вторая причина

Теперь есть еще одна причина, почему это может произойти, и причина в том, что потому что кто-то щелкнет вашу страницу до загрузки __EVENTVALIDATION.

Это eventValidation размещается на последней кнопке - даже на найденном asp.net, и если у вас есть некоторые из них во многих местах на странице или рядом с кнопкой, то они идут в конец страницы.

Итак, даже если вы видите состояние просмотра вверху страницы, где же проверка ??? возможно, он никогда не загружался - страница повреждена?, слишком быстро пользователь нажимает на страницу?

<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" ... >

Чтобы избежать такого рода проблем, я сделал простой javascript, который не позволял ему нажимать кнопку, пока этот вход не был загружен !!!.

Еще один комментарий, __EVENTVALIDATION не всегда присутствует! поэтому, возможно, безопаснее не искать это поле, если вы принимаете общее решение, а использовать трюк с javascript, чтобы просто проверить, загружена ли полная страница, или что-то еще, что вы думаете.

Вот мое окончательное решение с jQuery: (обратите внимание, что я проверяю на PageLoad, существует ли проверка событий!). Я поместил это на свои мастер-страницы.

<script language="javascript" type="text/javascript">
    function AllowFormToRun()
    {
        var MyEventValidation = $("#__EVENTVALIDATION");

        if(MyEventValidation.length == 0 || MyEventValidation.val() == ""){
            alert("Please wait for the page to fully loaded.");
            return false;
        }

        return true; 
    }       
</script>

protected void Page_Load(object sender, EventArgs e)
{
    // I do not know if Page can be null - just in case I place it.
    if (Page != null && Page.EnableEventValidation)
    {
        Form.Attributes["onsubmit"] = "return AllowFormToRun();";
    }
}

Вы можете протестировать, поставив рядом с кнопкой вашей страницы задержку.

<% System.Threading.Thread.Sleep(5000); %>

Обновление

Сегодня я снова вижу в журнале это сообщение для WebResource и обнаружил, что бот получает страницы и переводит все символы в ссылках в нижний регистр , включая параметры, так что это была еще одна причина, по которой не удалось получить правильную закодированную строку и выдать сообщение типа Заполнение недопустимо и не может быть удалено.

Надеюсь, это поможет вам больше.

22
ответ дан 4 December 2019 в 07:47
поделиться

Вы уверены, что ваша проблема связана с криптографией, а не вызвана слишком большим ViewState? Если ViewState - проблема, вы можете разбить ее на части - измените значение pages / MaxPageStateFieldLength в web.config

2
ответ дан 4 December 2019 в 07:47
поделиться

Обзор веб-страниц, обнаруженных с несколькими ключевыми словами из сообщения об ошибке, показывает, что этот тип ошибки является относительно распространенным, обычно случайным (по крайней мере, по внешнему виду) и, к сожалению, редко включает явные обходной путь или объяснение ...

Существование множества похожих, но разных ситуаций, вероятно, связано с очень большим количеством различных архитектур и базовых конфигураций, которые могут каким-то образом привести к неспособности криптослоя утверждать подлинность MAC (коды аутентификации сообщений) на страницах запроса:

  • Настройка фермы серверов
  • Междоменные / объединенные страницы
  • сторонние библиотеки виджетов и тому подобное
  • Фактическая логика программы ASP (конечно)

Один относительно частым «маркером» этих отчетов об ошибках является упоминание запросов ресурсов (например, WebResource.axd ).
Обратите внимание, что такие запросы часто не регистрируются (чтобы не увеличивать размер файлов журнала из-за относительно небольшого интереса). Это отсутствие в файле журнала и тот факт, что они часто кэшируются (и, следовательно, относительно случайное и нечастое появление ошибки) может объяснить, как это возможное происхождение ошибки остается «незамеченным». Это также говорит о том, что при попытке воссоздать ошибку (при отслеживании в журналах, в реальном времени и т. Д.) Может быть полезно предотвратить кеширование веб-браузера (или, по крайней мере, сначала очистить его кеш).

Вкратце, вот несколько идей и вещей, на которые следует обратить внимание:

  • начать регистрацию *.Запросы axd
  • пытаются связать такие запросы axd с событиями ошибок в журнале исключений
  • искать страницы со ссылками на ресурсы
  • , если в настройке фермы, убедитесь, что все экземпляры используют один и тот же ключ (очевидно, фрагмент, приведенный в вопросе, указывает на несколько серверов IIS)
  • С подозрением относитесь к страницам со сторонними приложениями (поисковые службы, партнерские программы ...)

Надеюсь, это поможет; -)

{{1} }
4
ответ дан 4 December 2019 в 07:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: