CryptographicException: Preenchimento é inválido e não pode ser removido e validação do viewstate MAC falhou
-
10-07-2019 - |
Pergunta
Monitoramento minha exceção mundial registra este erro parece ser impossível de remover, não importa o que eu faço, eu pensei que finalmente se livrou dele, mas ele está de volta novamente. Você pode ver um traço Strack do erro em uma post semelhante aqui .
Notas sobre o meio ambiente:
O IIS 6.0, .NET 3.5 SP1 único servidor aplicação ASP.NET
medidas já tomadas:
<system.web>
<machineKey validationKey="big encryption key"
decryptionKey="big decryption key"
validation="SHA1" decryption="AES" />
Na minha Base de página para todas as minhas páginas
protected override void OnInit(EventArgs e)
{
const string viewStateKey = "big key value";
Page.ViewStateUserKey = viewStateKey;
}
Também na fonte da página que eu posso ver que todo o ASP.NET gerado campos ocultos são corretamente no topo da página.
Solução
Primeiro de tudo vamos começar a partir do fato de que este erro de estado de exibição acontece no PostBack .
Também devo dizer que tenho feito todas as coisas que cada um sugerem que fazer para evitar este problema. E eu tenho uma única máquina, mas 2 piscinas que funcionam as mesmas páginas.
Assim alguém fazer uma ação , éter um homem, éter alguma outra máquina pesquisa por 'clique' em suas páginas, ou alguma tentativa hacker para verificar o seu sistema para problemas ...
Eu tenho problemas semelhantes (raras, mas os já existentes), e eu finalmente descobriu que as pessoas tentam cortar-test minhas páginas. (A partir do mesmo IP que tenho e ataques DoS)
I Modificar a função LoadPageStateFromPersistenceMedium () que traduzir o estado de visualização, e ver registrando o que exatamente era a entrada, e pelo que IPs ... então eu comecei monitor de estes resultados e ver que o estado de exibição foi alterado com a mão -. ou foi totalmente vazio
Em caso de erro Eu apenas redirecioná-lo para a mesma página ...
Aqui está o que eu fiz ...
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;
}
}
segunda razão
Agora há mais uma razão pela qual isso pode acontecer, ea razão é porque alguns um clique na sua página antes da __EVENTVALIDATION é carregado.
Esta eventValidation é colocada sobre o último botão, mesmo que asp.net encontrado, e se você tem alguns deles em muitos lugar na página, ou perto do botão, então este ir para o final da página.
Assim, mesmo se você ver o estado de visualização no topo da página, onde é a validação ??? talvez isso nunca carregado? - página corrupto, o usuário clicar muito rápido na página
<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" ... >
Para evitar este tipo de problema eu fiz um javascript simples que eu não deixá-lo, pressione o botão a menos que esta entrada ter sido carregado !!!.
Mais um comentário, o __EVENTVALIDATION não é sempre presentes! por isso é talvez mais seguro não procurar este campo se você fizer uma solução geral, mas para fazer um truque javascript apenas para verificar se a página inteira é carregada, ou qualquer outra coisa que você pensa.
Aqui está a minha solução final com jQuery: (! Nota que eu verifico PageLoad se existir eventvalidation). Tenho este colocado em minhas MasterPages.
<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();";
}
}
Você pode testar colocando perto do botão de sua página um atraso.
<% System.Threading.Thread.Sleep(5000); %>
Atualização
Hoje eu vejo no log esta mensagem novamente para WebResource eo que eu descobri é que um bot recebendo as páginas e fazer tudo o personagem nos links em minúsculas , incluindo os parâmetros, de modo que este foi mais uma razão para não conseguir o string codificada correta, e lançar uma mensagem como Preenchimento é inválido e não pode ser removida.
Espero que isso ajuda-lo mais.
Outras dicas
Uma pesquisa das páginas da web encontrados com várias das palavras-chave da mensagem de erro indicam que este tipo de erro é relativamente comum, geralmente aleatória (pelo menos na aparência) e, infelizmente, raramente inclusive de um explícita de contornar ou explicação ...
A existência de muitas situações semelhantes ainda sem diferentes provavelmente está ligada às muitas arquiteturas diferentes e configurações subjacentes que podem de alguma forma levar à incapacidade da camada de criptografia para afirmar a autenticidade dos (códigos de autenticação de mensagens) MAC no páginas de solicitação:
- configuração do farm de servidores
- domínio Cross / páginas sindicalizados
- bibliotecas de widgets de terceiros e tal
- Actual lógica do programa ASP (é claro)
Um "marcador" relativamente freqüente em torno desses relatórios de bugs é a menção de solicitações de recursos (por exemplo. WebResource.axd ).
Note-se que tais pedidos são muitas vezes Não autenticado (para que não inflar o tamanho arquivos de log com o evento de interesse pouco relativa). Esta ausência do arquivo de log e o fato de que muitas vezes são armazenados em cache (e, portanto, a ocorrência aleatória e pouco frequente relativa do bug) pode explicar como isso possível origem do bug ir "sob o radar". Isso também sugere que, ao tentar recriar o erro, (enquanto o rastreamento nos logs, em tempo real, etc) pode ser útil para evitar que o navegador web a partir de cache (ou pelo menos para limpá-la armazenar em cache inicialmente).
Em suma, aqui estão algumas idéias e coisas para olhar para:
- começar a registrar o * .axd solicitações
- tentar e co-relacionar tais pedidos AXD com os eventos de erro no registo de exceção
- Procure por páginas com referências de recursos
- se num Exploração agrícola, garantir que todas as instâncias usam a mesma chave (aparentemente o trecho fornecido na dica questão em múltiplos servidores IIS)
- Suspeite de páginas com 3rd party tie-ins (serviços de pesquisa, programas afiliados ...)
Espero que isso ajude; -)
Tem certeza que seu problema é criptografia relacionados, e não causado por ViewState de grandes dimensões? Se ViewState é o problema, você pode pedaço ele - alterar o valor de páginas / MaxPageStateFieldLength em web.config