Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Por que não quero usar cookies?
Eu tenho dois dominios, logo dois sites, estes dois sites devem se comunicar entre si, ou seja, se eu fizer login em um, no outro eu devo estar logado também. Se eu usar cookies isso não será possível, porem é claro que terei que usar cookies mesmo assim, porém não precisarei armazenar nada. Gostaria de não precisar, mas pela lógica é necessário.
Qual a minha idéia?
Através do mysql eu conectaria os dos sites em um mesmo banco, e armazenaria as informações se o usuário está logado ou não com uma espécie de sistema de cookies dentro do mysql. Com os mesmos atributos quando salvamos um cookie.
setcookie("CookieTeste", $value, time()+3600, "/~rasmus/", ".example.com", 1);Na verdade eu criei uma classe que faz exatamente isso, o funcionamento dela é esse:
$locker = new locker();
$locker->set("user", $user_md5_identity, time()+60*60*24, "/", ".example.com");
$locker->set("user", $user_md5_identity, "1month", "/", ".example.com");
$locker->set("user", $user_md5_identity, "session", "/", ".example.com");
$locker->get("user");
$locker->is_registered("user");
Como isso funciona?
1. Mesmo que eu salve as informações no banco de dados eu ainda vou precisar que os cookies estejam ativados, isto porque, para que quando eu atribua o tempo para expirar com o valor "session" será preciso pegar o ID da sessão e pra isso os cookies devem estar habilitados porque se não estiverem sempre será criado um novo ID.
2. A estrutura da tabela "locker" dentro do mysql é essa:
>
CREATE TABLE `locker` (
`ID` bigint(20) unsigned NOT NULL auto_increment,
`register_type` varchar(250) NOT NULL,
`register_status` int(11) NOT NULL,
`register_key` varchar(255) NOT NULL,
`register_value` longtext NOT NULL,
`register_path` varchar(250) NOT NULL,
`register_domain` varchar(250) NOT NULL,
`register_expire` datetime NOT NULL default '0000-00-00 00:00:00',
`user_ip` varchar(40) NOT NULL,
`user_agent` varchar(250) NOT NULL,
`user_session_id` varchar(250) NOT NULL,
`browser_unique` int(11) NOT NULL default '1',
`user_id` bigint(20) NOT NULL default '0',
`created_date` datetime NOT NULL default '0000-00-00 00:00:00',
`updated_date` datetime NOT NULL default '0000-00-00 00:00:00',
`deleted_date` datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (`ID`)
) DEFAULT CHARSET=utf8 AUTO_INCREMENT=10 ;
3. Ao inserir uma valor:
$locker->set("cores", array("azul", "amarelo", "vermelho"), time()+606024, "/", ".example.com");A inserção seria essa:
>
INSERT INTO `locker` (`ID`, `register_type`, `register_status`, `register_key`, `register_value`, `register_path`, `register_domain`, `register_expire`, `user_ip`, `user_agent`, `user_session_id`, `browser_unique`, `user_id`, `created_date`, `updated_date`, `deleted_date`) VALUES
(11, 'cookie', 1, 'cores', 'a:3:{i:0;s:4:"azul";i:1;s:7:"amarelo";i:2;s:8:"vermelho";}', '/', '.example.com', '2009-04-29 22:05:24', '127.0.0.1', 'Mozilla/5.0 (Windows; U; Windows NT 6.0; pt-BR; rv:1.9.0.9) Gecko/2009040821 Firefox/3.0.9', 'aaidthjr4f8ptv45dgrcpk2ms1', 1, 0, '2009-04-28 22:05:24', '0000-00-00 00:00:00', '0000-00-00 00:00:00');
Ou seja, se eu tivesse definido o tempo para expirar de "time()+606024" para "session", o register_type seria "sesison" e não "cookie", e o tmepo para essa sesison expirar seria de 1 dia, ou seja, se você não fechar a sessão em até 24 horas.4. Basicamente quando você aplica a classe em uma variável:
$locker = new locker();Ele irá pegar os valores para aquele usuário, a consulta seria algo mais ou menos assim:
>
$request = "SELECT * FROM drawer WHERE"
." (( register_type = 'session' AND user_session_id = '$user_session_id' )"
." OR ( register_type = 'cookie' ))"
." AND user_ip = '$user_ip' AND user_agent = '$user_agent' AND register_status > 0 AND register_expire > '$current_time'"
." ORDER BY created_date ASC";
Repare que não inclui na consulta as informações de pegar para o determinado dominio e path porque ainda tenho que ver como inserir isso na consulta.Antes de pegar os valores eu ainda executo duas funções da classe, uma se o usuário limpar os cookies ele limpa todas as linhas daquele ip, outra para expirar:
>
$new_current_time = date("Y-m-d H:i:s", time());
return $mysql->query("UPDATE drawer SET deleted_date = '$new_current_time', register_status = -1 WHERE register_status > 0 AND user_ip = '$user_ip' AND ((register_expire <= '$new_current_time') OR (register_type = 'session' AND user_session_id != '$user_session_id' AND user_agent = '$user_agent') )");
Ta, mas afinal, o que eu quero saber?
Eu não sei até que ponto isso é seguro porque eu pego esses valores via IP, se um usuario trocar o IP para um que estaja la no banco ele vai pegar aqueles dados armazenados (isso só para os cookies porque para sessões, o ID da sessao teria que ser igual também, daí seria mais improvável de conseguir burlar). Mas também não sei se isso seria possível, eu quero saber quanto a segurança, se isso é viável. Porque como disse são dois sites e eu queria que ambos usassem os mesmos cookies. Na minha cabeça e no funcionamento creio que funcionou beleza. Porém, como disse, não sei até que ponto a utilização desse jeito está correta, eu gostaria de opiniões para que eu possa desfazer isso ou prosseguir.
Carregando comentários...