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