Secure Sessions - Comunidade Portuguesa de PHP

Transcrição

Secure Sessions - Comunidade Portuguesa de PHP
Secure Sessions
Posted by msimoes - 2007/02/13 21:26
_____________________________________
Em seguida, disponibilizo uma class (em PHP5 mas possível de converter para PHP4 se quiserem) para sessões
totalmente seguras e, até ao momento, impossível de hijack.
Atenção contudo ao uso e parametros necessários.
PS: Favor manter copyrights nos códigos disponibilizados.
<?php
/***************************************************************************
* @version 0.8.0-RC1
*
* @author (Main Programmer) Miguel Simoes <[email protected]>
* @since Moday, 15th of September of 2006
* @package Session/User Control
* @version $Id$
* @access public
*
* @copyright Miguel Simoes <msimoes at gmail dot com>
* @link
http://xmanager.sf.net/
* @license http://www.gnu.org/copyleft/gpl.html GNU/GPL
*
* {@internal
* ***
* * CHANGELOG:
* ***
* }
***************************************************************************/
/***************************************************************************
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
***************************************************************************/
class Session {
private $check_browser;
private $check_ip;
public $name;
private $regeneration;
private $secure_word;
private $session;
/**
* Session::__construct()
*
* @param mixed $check_browser (bool) wheter to check or not the browser name
* @param integer $check_ip (int) number of blocks of the IP to check
* @param mixed $regeneration (bool) wheter to regen the session_id
* @param mixed $secure_word (string) unique string to use on fingerprint
**/
public function __construct($check_browser=TRUE, $check_ip=4, $regeneration=TRUE,
$secure_word=_X_SESSION_FINGERPRINT) {
$this->check_browser = $check_browser;
$this->check_ip
= (($check_ip > 4) ? 4 : $check_ip);
$this->name
= __CLASS__;
$this->regeneration = $regeneration;
$this->secure_word = $secure_word;
#
# Starting the session with secure method applied
PHP-PT.com Forum - Comunidade Portuguesa de PHP
Joomlaboard Forum Component version: 1.1.4 Stable
Generated: 1 October, 2016, 09:35
session_start();
self::«»SessionInit();
}
/**
* Session::__destruct()
**/
public function __destruct() {
unset($this);
}
/**
* Session::«»SessionCheck()
*
* @param mixed $field where NULL is the default
* @return true or false on validation of fingerprint
**/
public function SessionCheck($field=NULL) {
if($this->regeneration) self::«»SessionRegen();
return ((isset($_SESSION)) AND ($_SESSION == self::«»SessionFPrint()));
}
private function SessionInit() {
$_SESSION = self::«»SessionFPrint();
self::«»SessionRegen();
}
/**
* Session::«»SessionFPrint()
*
* @return md5 of fingerprint
**/
private function SessionFPrint() {
$fprint = $this->secure_word;
if($this->check_browser) $fprint .=
$_SERVER;
if($this->check_ip) {
$blocks = explode(".",$_SERVER );
foreach($blocks AS $block) {
$fprint .= $block;
}
}
return md5($fprint);
}
/**
* Session::«»SessionRegen()
*
* @return
**/
private function SessionRegen() {
if(($this->regeneration) AND (function_exists('session_regenerate_id')))
session_regenerate_id();
}
}
?>
Post edited by: miguelp, at: 2007/02/21 10:56
Post edited by: miguelp, at: 2007/02/21 10:59
============================================================================
Re:Secure Sessions
PHP-PT.com Forum - Comunidade Portuguesa de PHP
Joomlaboard Forum Component version: 1.1.4 Stable
Generated: 1 October, 2016, 09:35
Posted by mAiN_iNfEcTiOn - 2007/02/16 01:37
_____________________________________
Engraçado eu não fazia uso de classes... :unsure:
eu simplesmente passava um array para a variável global de sessão, e guardava o IP e o TIMESTAMP :/ Mas lá está,
eu nao digo que a minha seja impenetrável... (Até porque ninguém tentou :) )
$_SESSION=array("ID"=>$rst,"USERNAME"=>$rst);
$_SESSION=getenv("REMOTE_ADDR");
$_SESSION=time();
Depois posteriormente é que ao validar verificava se os dados na variável de sessão eram válidos e se o IP era o
mesmo e se o time()-TIMESTAMP eram menores que 300 segundos (que equivale a 5 minutos...)
Se algo nao estivesse bem , LOGOUT :) (com o respectivo erro)
Post edited by: mAiN_iNfEcTiOn, at: 2007/02/16 06:58
Post edited by: mAiN_iNfEcTiOn, at: 2007/02/17 08:32
============================================================================
Re:Secure Sessions
Posted by mAiN_iNfEcTiOn - 2007/02/17 08:31
_____________________________________
Ahm... caro msimoes... eu ja estive a procurar na net, mas nao encontro significado para o pedaço de código:
_X_SESSION_FINGERPRINT
O que é que isto representa?
Já agora tiro outra dúvida... No caso deste pedaço de código ser convertido para PHP4, o que é que mudaria?
A função session_regenerate_id? (Embora esta, exista a partir do 4.3.2)
Esta matéria interessa-me bastante :) e estou ansioso por aprender =)
============================================================================
Re:Secure Sessions
Posted by msimoes - 2007/02/18 05:04
_____________________________________
1.
_X_SESSION_FINGERPRINT é uma constante (que foi definida no XManager) como sendo uma string (formato
aleatório) que deverá ser substituída por qualquer outra constante (convêm que seja constante porque se o fingerprint
estiver errado a sessão será logo inválida).
2.
Para efectuar a alteração para PHP4 seria necessário:
2.1 Remover os privates/publics do início das funções e alterar nas variáveis para var
2.2 Remover a função __destruct()
2.3 Alterar a função __construct() para o nome da class
3.
Em relação a essa função que apenas surge mais tarde no PHP (como referes) é também um parametro opcional que
indica que existe ou não regeneração da sessão, pelo que em caso de PHP < 4.3.2 basta indicar que as sessões não têm
regen.
PHP-PT.com Forum - Comunidade Portuguesa de PHP
Joomlaboard Forum Component version: 1.1.4 Stable
Generated: 1 October, 2016, 09:35
Cumprimentos,
Miguel Simões
============================================================================
Re:Secure Sessions
Posted by mAiN_iNfEcTiOn - 2007/02/19 04:27
_____________________________________
_X_SESSION_FINGERPRINT é uma constante (que foi definida no XManager) como sendo uma string (formato
aleatório) que deverá ser substituída por qualquer outra constante (convêm que seja constante porque se o fingerprint
estiver errado a sessão será logo inválida).
Mas essa constante estará associada ao tipo de Sistema Operativo? É que eu procuro na Internet mas nao encontro
NADA sobre _X_SESSION_FINGERPRINT :S
Fiquei com uma noção que seria uma constante criada por si (e respectivamente definida no script em questão)... Será
isso?
2.1 Remover os privates/publics do início das funções e alterar nas variáveis para var
2.2 Remover a função __destruct()
2.3 Alterar a função __construct() para o nome da class
:/ Mais uma vez, devia ter pesquisado primeiro algumas coisinhas (como se pode ver ainda tenho MUITO para
aprender) mas ja pude ver que no PHP 5, as funções (k no caso das classes se chamam métodos) têm capacidades
mágicas (citando,e traduzindo, do site php.net)
Não conhecia a particularidade de se poder definir se uma variável é privada, ou não.
Muito interessante....
Noutro post dizia para eu não dar uso variáveis globais... Mas o PHP (actualmente e a partir do 4.2.0) não traz o
register_globals OFF no php.ini?
foi o k m pude aperceber aki: http://pt.php.net/register_globals
Desde já um MUITO obrigado pelo tempo desperdiçado :)
Post edited by: mAiN_iNfEcTiOn, at: 2007/02/19 04:28
============================================================================
Re:Secure Sessions
Posted by msimoes - 2007/02/19 20:34
_____________________________________
Efectivamente o _X_SESSION_FINGERPRINT é uma constante definida por mim, estando nesse caso definida no
ficheiro de configuração do XManager (de onde a class foi extraída).
Quanto à situação do register_globals estar OFF no php.ini por default, sinceramente penso que vem ON, contudo não
tenho a certeza neste momento. De qualquer forma, vir por defeito "OFF" não implica que os serviços de Hosting não a
coloquem "ON" para ser possível correr software como phpBB ou OSCommerce.
Com os melhores cumprimentos,
Miguel Simões
PHP-PT.com Forum - Comunidade Portuguesa de PHP
Joomlaboard Forum Component version: 1.1.4 Stable
Generated: 1 October, 2016, 09:35
============================================================================
Re:Secure Sessions
Posted by mAiN_iNfEcTiOn - 2007/02/21 20:18
_____________________________________
Quanto à situação do register_globals estar OFF no php.ini por default, sinceramente penso que vem ON, contudo não
tenho a certeza neste momento. De qualquer forma, vir por defeito "OFF" não implica que os serviços de Hosting não a
coloquem "ON" para ser possível correr software como phpBB ou OSCommerce.
citando a php.net:
Perhaps the most controversial change in PHP is when the default value for the PHP directive register_globals went from
ON to OFF in PHP » 4.2.0. Reliance on this directive was quite common and many people didn't even know it existed
and assumed it's just how PHP works. This page will explain how one can write insecure code with this directive but keep
in mind that the directive itself isn't insecure but rather it's the misuse of it.
Quanto ao caso das empresas de Hosting terem as register_globals em modo ON... É uma questão de, ou verificar o
phpinfo(); ou em caso de impossibilidade, informar-se com a empresa :)
Em qualquer dos casos, é importante saber :)
Por fim, eu ja estou acostumado a trabalhar com o $_POST e o $_GET... principalmente pk é tudo muito mais legível e
simples :)
============================================================================
Re:Secure Sessions
Posted by tiago - 2007/02/26 20:19
_____________________________________
Viva !
Acho que é interessante referir que se o servidor (apache) permitir o uso de ficheiros .htaccess (AllowOverride)
podemos alterar as definições existentes no php.ini. Neste caso, relativamente ao register_globals, podemos criar um
ficheiro .htaccess com o conteúdo:
php_flag register_globals off (ou on)
Se a versão do apache for 2.x a solução anterior não funciona !
Segundo o manual (http://httpd.apache.org/docs/2.0/mod/core.html#allowoverride) o AllowOverride so' funciona dentro
da secção <Directory>, e, neste caso:
php_value register_globals 0 (ou 1)
(0 = off, 1 = on)
Post edited by: tiago, at: 2007/02/26 20:21
============================================================================
Re:Secure Sessions
Posted by msimoes - 2007/02/27 06:14
_____________________________________
Acho que é interessante referir que se o servidor (apache) permitir o uso de ficheiros .htaccess (AllowOverride)
podemos alterar as definições existentes no php.ini.
Isto é verdade mas convêm esclarecer que não vale a pena estarem a fazer isto nos vossos sites visto que têm de ser
ficheiros com permissões de root por forma a que seja possível serem realmente "utilizados" (se assim não fosse será
possível imaginar as falhas de segurança que podiam ser criadas).
Com os melhores cumprimentos,
Miguel Simões
PHP-PT.com Forum - Comunidade Portuguesa de PHP
Joomlaboard Forum Component version: 1.1.4 Stable
Generated: 1 October, 2016, 09:35
============================================================================
Re:Secure Sessions
Posted by surrealiz3 - 2007/03/01 00:33
_____________________________________
já agora , mais uma feature interessante http://pecl.php.net/package/htscanner/
Post edited by: tiago, at: 2007/03/01 07:39
============================================================================
PHP-PT.com Forum - Comunidade Portuguesa de PHP
Joomlaboard Forum Component version: 1.1.4 Stable
Generated: 1 October, 2016, 09:35

Documentos relacionados