Como você configura o uso de cookies HttpOnly em PHP

93

Como posso definir os cookies no meu PHP appsAS HttpOnly cookies?

Scott Warren
fonte
stackoverflow.com/questions/528405/… Possui as informações de suporte do navegador.
Kzqai de
2
@Tchalvak Não, as respostas atuais ainda são oficiais. Nada mudou desde 2008 em relação à configuração de cookies somente HTTP no PHP. Quais navegadores suportam cookies somente HTTP é uma pergunta diferente, com uma resposta diferente.
lanzz
Você pode usar $cookie->setHttpOnly(true);com github.com/delight-im/PHP-Cookie
caw

Respostas:

92
  • Para seus cookies , veja esta resposta.
  • Para o cookie de sessão do próprio PHP ( PHPSESSIDpor padrão), veja a resposta de @ richie

O setcookie()e setrawcookie()funções, introduziu o httponlyparâmetro, de volta na idade das trevas do PHP 5.2.0, tornando este agradável e fácil. Basta definir o sétimo parâmetro como verdadeiro, de acordo com a sintaxe

Sintaxe da função simplificada para brevidade

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

Insira os NULLparâmetros que deseja manter como padrão. Você também pode querer considerar se deve definir o secureparâmetro.

Também é possível usar a função mais antiga de nível inferior header():

header( "Set-Cookie: name=value; httpOnly" );
Cheekysoft
fonte
119

Para cookies de sessão do próprio PHP no Apache:
adicione isso à sua configuração do Apache ou.htaccess

<IfModule php5_module>
    php_flag session.cookie_httponly on
</IfModule>

Isso também pode ser definido em um script, desde que seja chamado antes session_start().

ini_set( 'session.cookie_httponly', 1 );
rico
fonte
9
+1, pois é uma coisa boa (para segurança) ter em vigor em todo o servidor, mas em vez disso adicionado ao php.ini.
Anthony Hatzopoulos
10
Observe que php_flag deve ser usado em seu lugar: "Não use php_value para definir valores booleanos. Php_flag deve ser usado em seu lugar." php.net/manual/en/configuration.changes.php
Ondrej Machulda
@OndrejMachulda A mudança php_valuepara php_flagnão funciona. Acabei de experimentar no meu servidor ..
Nate
6
@Nate: Ao alterar para php_flag, você também deve alterar o valor - para onou off- consulte o manual.
Ondrej Machulda
14

Observe que os cookies de sessão PHP não são usados httponlypor padrão.

Fazer isso:

$sess_name = session_name();
if (session_start()) {
    setcookie($sess_name, session_id(), null, '/', null, null, true);
}

Alguns itens importantes aqui:

  • Você tem que ligar session_name() antessession_start()
  • Isso também define o caminho padrão para '/', que é necessário para o Opera, mas que os cookies de sessão PHP também não fazem por padrão.

fonte
11
php.net/manual/en/function.session-set-cookie-params.php Isso pode ser feito automaticamente por meio da função PHP acima, em vez de codificação personalizada.
Ryaner
13

Esteja ciente de que o HttpOnly não interrompe o script entre sites; em vez disso, ele neutraliza um possível ataque e, atualmente, faz isso apenas no IE (o FireFox expõe cookies HttpOnly em XmlHttpRequest, e o Safari não o honra de forma alguma). Certamente, ative o HttpOnly, mas não perca nem uma hora de filtragem de saída e teste de difusão para trocá-lo.

tqbf
fonte
13
Esta situação pode ter mudado desde '08, agora. Aqui está uma lista mais atual / atualizada: stackoverflow.com/questions/528405/…
Kzqai
7
<?php
//None HttpOnly cookie:
setcookie("abc", "test", NULL, NULL, NULL, NULL, FALSE); 

//HttpOnly cookie:
setcookie("abc", "test", NULL, NULL, NULL, NULL, TRUE); 

?>

Fonte

Marius
fonte
5

Explicação aqui de Ilia ... embora apenas 5,2

Suporte para sinalizador de cookie httpOnly no PHP 5.2

Conforme declarado naquele artigo, você mesmo pode definir o cabeçalho nas versões anteriores do PHP

header("Set-Cookie: hidden=value; httpOnly");
Polsonby
fonte
5

Você pode especificá-lo na função definir cookie, consulte o manual do php

setcookie('Foo','Bar',0,'/', 'www.sample.com'  , FALSE, TRUE);
Re0sless
fonte
4

Você pode usar isso em um arquivo de cabeçalho.

// setup session enviroment
ini_set('session.cookie_httponly',1);
ini_set('session.use_only_cookies',1);

Dessa forma, todos os cookies de sessão futura usarão httponly.

  • Atualizada.
Marius
fonte
2
Apenas para sua informação, session.use_only_cookies está ativado por padrão no PHP> 5.3
Nic Cottrell
1
e correto é "todos os cookies de sessão futura " usarão httponly, não personalizados ...
qdev 01 de
2

A sintaxe certa do comando php_flag é

php_flag  session.cookie_httponly On

E esteja ciente, basta primeiro responder do servidor definir o cookie e aqui (por exemplo, você pode ver a diretiva "HttpOnly". Portanto, para testar, exclua os cookies do navegador após cada solicitação de teste.

Mareg
fonte
0

Uma solução mais elegante desde PHP> = 7.0

session_start(['cookie_lifetime' => 43200,'cookie_secure' => true,'cookie_httponly' => true]);

session_start

opções de início de sessão

Hein
fonte