Pergunta

Eu estou tentando armazenar um xml objeto serializado em um cookie, mas eu recebo um erro como este:

A potentially dangerous Request.Cookies value was detected from the client (KundeContextCookie="<?xml version="1.0" ...")

Eu sei que o problema a partir de casos similiar quando você tenta armazenar algo que se parece com o código javascript em um campo de entrada de formulário.

O que é a melhor prática aqui? Existe uma maneira (como o problema forma i descrito) para suprimir este aviso do quadro asp.net, ou devo JSON serialize vez ou talvez eu deveria binário serializá-lo? O que é prática comum quando o armazenamento de dados serializado em um cookie?

EDIT: Obrigado pelo feedback. A razão que eu quero para armazenar mais dados no cookie que o ID é porque o objeto que eu realmente preciso leva cerca de 2 segundos para recuperar a partir de um serviço que eu não tenho controle sobre. Fiz um objeto leve 'KundeContext' que contenha algumas das propriedades do objeto completo, mas estes são utilizados 90% do tempo. Desta forma, eu só tenho que chamar o serviço lento em 10% das minhas páginas. Se eu só guardou o Id eu ainda teria que chamar o serviço em quase todas as minhas páginas.

Eu poderia armazenar todas as strings e ints separadamente, mas o objeto tem outros objetos leves como 'ContactInformation' e 'endereço', que seria tedioso para armazenar manualmente para cada uma das suas propriedades.

Foi útil?

Solução

Eu não armazenar dados em XML no cookie - há um limite no tamanho de cookie para entradas (costumava ser 4K para todas cabeçalhos incluindo o cookie). Escolher uma estratégia menos extenso que codifica tais como delimitadores em vez disso, por exemplo, a | b | c ou valores de cookies separados. codificação Delimitado o torna especialmente fácil e rápido para decodificar os valores.

O erro que você vê é ASP.NET reclamando que os cabeçalhos parecido com um ataque XSS.

Outras dicas

Armazenamento serializado dados em um cookie é um muito, muito má ideia. Como os usuários têm controle total sobre os dados do cookie, é simplesmente muito fácil para eles para usar esse mecanismo para alimentá-lo dados maliciosos. Em outras palavras: qualquer fraqueza em seu código desserialização se torna instantaneamente exploráveis ??(ou pelo menos uma forma de acidente de algo)

.

Em vez disso, só manter o identificador mais simples possível em seus cookies, de um tipo de que o formato pode ser facilmente validada (por exemplo, um GUID). Em seguida, guarde o seu server-side serializada dados (em um banco de dados, arquivo XML no sistema de arquivos, ou qualquer outro) e recuperá-lo usando esse identificador.

Edit: Também, neste cenário, certifique-se de que o seu identificador é suficiente aleatório para torná-lo inviável para os usuários de adivinhar um do outro identificadores, e passar uns aos outros simplesmente mudando seu próprio identificador um pouco. Mais uma vez, GUIDs (ou identificadores de sessão ASP.NET) funcionam muito bem para esta finalidade.

Segundo editar após clarificação cenário pelo proprietário pergunta: por que usar seus próprios cookies em todo este caso? Se você manter uma referência, quer ao objeto original ou o seu objeto leve na (objeto de sessão) o estado da sessão, ASP.NET irá cuidar de todos os detalhes de implementação para você de uma maneira eficiente bonita.

Olhe para a Ver Estado . Talvez você gostaria de manter os dados em todo post-backs no ViewState em vez de usar cookies. Caso contrário, você provavelmente deve armazenar o XML no servidor e um identificador exclusivo para que os dados no cookie, em vez disso.

Você pode olhar em usar estado da sessão para armazenar o valor . Você pode configurá-lo para usar um cookie para armazenar o ID de sessão. Isso também é mais seguro, porque o valor que não é visível ou mutável by-side usuário a.

Outra alternativa é a utilização de um mecanismo de cache distribuído para armazenar o valor. Meu favorito é Memcached .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top