Ir para conteúdo
Fórum Script Brasil
  • 0

Segurança em Login


bruno_osprimosbh

Pergunta

Boa tarde pessoal, sou novo em programação PHP e gostaria de dicas e criticas construtivas sobre um simples

sistema de login que criei...

Se tratando de segurança pensei que trabalhando com classes e OO ficaria melhor, algo do tipo: o usuario ao clicar no botao entrar ele chamará uma classe controle que vai instanciar um novo objeto do tipo usuario e chamar o metodo para carregar os dados do mesmo do banco e armazenar nos atributos, depois faço a comparação dos dados vindos pelo post com os dados dos atributos da instancia criada.

É correto? é seguro? lembrando que antes de criar o objetos passei os dados vindos pelo post por metodos como get_magic_quotes_gpc(), mysql_real_escape_string e trin()....

Gostaria de dicas para melhor isso aê...

Grato pela atenção;;

Abaixo deixo os código que julgo serem importantes para analise...

Arquivo Usuario.Controller.php

<?php
session_start();
require_once '../Model/Conexao.class.php';
require_once '../Model/Administrador.class.php';
require_once '../Model/Function.class.php';
   
//extract($_POST);

if(getenv("REQUEST_METHOD") == "POST"){
    
    $con      = new Conexao();
    $function = new Funcao();
    
    $login = isset($_POST["login"]) ? $function->limpaString($_POST["login"]) : "";
    $senha = isset($_POST["senha"]) ? $function->limpaString($_POST["senha"]) : "";
    
    $login = $function->antiSqlInjection($login);
    $senha = $function->antiSqlInjection($senha);
    
    //Acho que esse if aqui é desnecessário
    if(!empty($login)|| !empty($senha)){
      
        $adm  = new Administrador();
        $adm->loadAdm();
        
        if($login == $adm->getUsuario() && $senha == $adm->getSenha()){
            
            $_SESSION['idSession']           = (int)$adm->getId();
            $_SESSION['nomeSession']         = $adm->getNome();
            $_SESSION['loginSession']        = $adm->getUsuario();
            $_SESSION['senhaSession']        = $adm->getSenha();
            $_SESSION['emailSession']        = $adm->getEmail();
            $_SESSION['nivel_acessoSession'] = $adm->getNivelAcesso;
            
            header('Location: ../View/logado.php');
        }
        else{
            unset($_SESSION['loginSession']);
            unset($_SESSION['senhaSession']);
            header('Location: ../login.php');
        }    
    }   
}
else{
    header('Location: ../login.php');
}
?>
Arquivo Administrador.class.php
<?php

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Description of Usuario
 *
 * @author VIRTUALWEB
 */
class Administrador{
    //put your code here
    
    private $id;
    private $nome;
    private $senha;
    private $usuario;
    private $email;
    private $tabela = 'tb_administrador';
    private $nivelAcesso;
    
    public function __construct(){        
        
        require_once 'Conexao.class.php'; 
    }

    public function setId($id){
        $this->id = $id;
    }
    public function getId(){
        return $this->id;
    }
    
     public function setNome($nome){
        $this->nome = $nome;
    }
     public function getNome(){
        $this->nome;
    }
    
     public function setSenha($senha){
        $this->senha = $senha;
    }
     public function getSenha(){
        return $this->senha;
    }
    
     public function setUsuario($usuario){
        $this->usuario = $usuario;
    }
     public function getUsuario(){
        return $this->usuario;
    }
    
     public function setEmail($email){
        $this->email = $email;
    }
     public function getEmail(){
        return $this->email;
    }  
    
    public function setabela($tabela){
        $this->tabela = $tabela;
    }
     public function gettabela(){
        return $this->tabela;
    }  
    
    public function setNivelAcesso($nivelAcesso){
        $this->nivelAcesso = $nivelAcesso;
    }
     public function getNivelAcesso(){
        return $this->nivelAcesso;
    }  
    
    public function loadAdm(){
        
        $con = new Conexao();
        $con->open();
   
        $sql = "SELECT * FROM tb_administrador ";
        $limite = mysql_query($sql);

        while($sql = mysql_fetch_array($limite)){
            
            $this->id          = $sql["id"]; 
            $this->nome        = $sql["nome"];
            $this->usuario     = $sql["login"];
            $this->senha       = $sql["senha"];
            $this->email       = $sql["email"];
            $this->nivelAcesso = $sql["nivel_acesso"];
        }
    }
}

?>
Arquivo Function.class.php
<?php

class Funcao {

    public function mask($val, $mask){
    
        $maskared = '';
        $k = 0;
        for($i = 0; $i<=strlen($mask)-1; $i++){
            if($mask[$i] == '#'){
                if(isset($val[$k]))
                $maskared .= $val[$k++];
            }
            else{
                if(isset($mask[$i]))
                $maskared .= $mask[$i];
            }
        }
        return $maskared;
    }
    
    public function limpaString($string){
        
        $novaString = trim($string);
        $novaString = addslashes($novaString);        
        return $novaString;
    }
    
    public function antiSqlInjection($str) {
    if(!is_numeric($str)) {
        
            $str = get_magic_quotes_gpc() ? stripslashes($str) : $str;
            $str = function_exists('mysql_real_escape_string') ? mysql_real_escape_string($str) : mysql_escape_string($str);

            return $str;
         }
         else{
             $str = "";
             return $str;
         }
           
    }
}

?>

Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 0

muito bom!

sabe que eu uso criptografia... utilizo SHA1 ou MD5 mesmo... mas muito seguro mesmo é RIJNDAEL

então se por exemplo você armazenar a senha de usuário e o login com SHA1, o SQL Injection já falha, ou seja você já estaria seguro disso...

exemplo

quando você for gravar o usuário e senha de um usuário que está sendo cadastrado só você fazer

$login = "churc";

$login_sha1 = sha1($login);

$senha = sha1($senha);

na tabela...

codigo = AUTO_INCREMENT INT(11)

usuario = VARCHAR(80) //$login

login = VARCHAR(40) //$login_sha1

senha = VARCHAR(40) //$senha

e no seu caso você faria

$login = sha1($_POST["login"]);

$senha = sha1($_POST["senha"]);

bom automaticamente morreram todas as tentativas de SQL Injection... os dados estão seguros e nem o criador do sistema tem acesso as senhas dos usuários (o que é o certo)

pra logar você procura na tabela onde login = $login e senha = $senha e pra saber o nome do usuario basta puxar o campo usuario que é somente referência assim como outros campos podem ser criados na hora de cadastrar o usuário para tal referência (idade, etc)...

mas o seu ta show;;; muito bem feito e bem elaborado... parabéns!

só quis mostrar que é uma forma simples mas porém segura também...

abrss

Editado por Churc
Link para o comentário
Compartilhar em outros sites

  • 0
muito bom!

sabe que eu uso criptografia... utilizo SHA1 ou MD5 mesmo... mas muito seguro mesmo é RIJNDAEL

então se por exemplo você armazenar a senha de usuário e o login com SHA1, o SQL Injection já falha, ou seja você já estaria seguro disso...

exemplo

quando você for gravar o usuário e senha de um usuário que está sendo cadastrado só você fazer

$login = "churc";

$login_sha1 = sha1($login);

$senha = sha1($senha);

na tabela...

codigo = AUTO_INCREMENT INT(11)

usuario = VARCHAR(80) //$login

login = VARCHAR(40) //$login_sha1

senha = VARCHAR(40) //$senha

e no seu caso você faria

$login = sha1($_POST["login"]);

$senha = sha1($_POST["senha"]);

bom automaticamente morreram todas as tentativas de SQL Injection... os dados estão seguros e nem o criador do sistema tem acesso as senhas dos usuários (o que é o certo)

pra logar você procura na tabela onde login = $login e senha = $senha e pra saber o nome do usuario basta puxar o campo usuario que é somente referência assim como outros campos podem ser criados na hora de cadastrar o usuário para tal referência (idade, etc)...

mas o seu ta show;;; muito bem feito e bem elaborado... parabéns!

só quis mostrar que é uma forma simples mas porém segura também...

abrss

Mais com a senha criptografada utilizando por exemplo o md5, independente de qual senha voce registre ela vai ser a senha criptografada seria um caso de você enviar a senha criptografada " Exemplo: d56s55sssafdafDFDss68 " no e-mail do seu usario para depois ele alterar, ai sim quando ele alterar vai passar a valer a senha que ele criar...

Pois se ele cadastrar e tentar entrar com a senha que ele criou vai aparecer a pagina de usuario ou senha invalido pois a senha vai ser " d56s55sssafdafDFDss68 "

Link para o comentário
Compartilhar em outros sites

  • 0
muito bom!

sabe que eu uso criptografia... utilizo SHA1 ou MD5 mesmo... mas muito seguro mesmo é RIJNDAEL

então se por exemplo você armazenar a senha de usuário e o login com SHA1, o SQL Injection já falha, ou seja você já estaria seguro disso...

exemplo

quando você for gravar o usuário e senha de um usuário que está sendo cadastrado só você fazer

$login = "churc";

$login_sha1 = sha1($login);

$senha = sha1($senha);

na tabela...

codigo = AUTO_INCREMENT INT(11)

usuario = VARCHAR(80) //$login

login = VARCHAR(40) //$login_sha1

senha = VARCHAR(40) //$senha

e no seu caso você faria

$login = sha1($_POST["login"]);

$senha = sha1($_POST["senha"]);

bom automaticamente morreram todas as tentativas de SQL Injection... os dados estão seguros e nem o criador do sistema tem acesso as senhas dos usuários (o que é o certo)

pra logar você procura na tabela onde login = $login e senha = $senha e pra saber o nome do usuario basta puxar o campo usuario que é somente referência assim como outros campos podem ser criados na hora de cadastrar o usuário para tal referência (idade, etc)...

mas o seu ta show;;; muito bem feito e bem elaborado... parabéns!

só quis mostrar que é uma forma simples mas porém segura também...

abrss

Mais com a senha criptografada utilizando por exemplo o md5, independente de qual senha voce registre ela vai ser a senha criptografada seria um caso de você enviar a senha criptografada " Exemplo: d56s55sssafdafDFDss68 " no e-mail do seu usario para depois ele alterar, ai sim quando ele alterar vai passar a valer a senha que ele criar...

Pois se ele cadastrar e tentar entrar com a senha que ele criou vai aparecer a pagina de usuario ou senha invalido pois a senha vai ser " d56s55sssafdafDFDss68 "

Ah sim, é que no meu caso são sistemas "comerciais" então não tem essa de ir pro usuário por email por exemplo a senha... e sim o usuário é cadastrado por um Administrador por exemplo com uma senha X ai depois de logar com essa senha ele vai no Painel dele de usuário e altera a senha para Y.

Realmente, em sistemas Web tipo um cadastro em um site e "for enviada" a senha pro usuário isso falha...

Mas é por isso que sites como Twitter, Facebook, etc... você não recebe a senha por email e quando perde a senha o único meio é dar um RESET na senha... ou seja, eles não armazenam sua senha... por privacidade... alias armazenam sim mas criptografado... quis dizer que não armazenam como ela "é"...

Agora sites que enviam sua senha por email realmente desta forma não é viável mesmo...

mas por segurança, o certo é dar um RESET como os próprios sites "grandes" vamos que se dizer fazem... windows live, gmail tb...

ps: mas é claro que sites grandes como estes que citei não usam essa simplicidade que fiz uhahuahu

é do que o amigo fez ai pra mais forte em termo de segurança... só quis mostrar uma maneira simples e segura de login... excetos os sistemas que precisam enviar a senha pro usuário como mencionado...

Sinceramente, da até medo sites que te mandam por email suas informações de cadastro, principalmente sites de compra... porque mostra que por exemplo informações do seu cartão de crédito ou até mesmo a senha que você usou pode ser sua senha do dia dia pro email etc... esteja vulnerável...

abrs

Editado por Churc
Link para o comentário
Compartilhar em outros sites

  • 0

Verdade viu, havia me esquecido deste detalhe....

Refazendo parte do código ficaria assim então

la no arquivo UsuarioController.php

...
$adm  = new Administrador();
        $adm->loadAdm();
        
        //Depois de ter tratado o dado via post uso a criptografia md5
        if($login == $adm->getUsuario() && md5($senha) == $adm->getSenha()){
            
            $_SESSION['idSession']           = (int)$adm->getId();
            $_SESSION['nomeSession']         = $adm->getNome();
            $_SESSION['loginSession']        = $adm->getUsuario();
            $_SESSION['senhaSession']        = $adm->getSenha();
            $_SESSION['emailSession']        = $adm->getEmail();
            $_SESSION['nivel_acessoSession'] = $adm->getNivelAcesso;
            
            header('Location: ../View/logado.php');
...
Então, dos artigos que vi, sempre ocorre a verificação do usuário direto na query por exemplo:
// consultando se o usuário enviou a senha correta
$query = sprintf("SELECT 1 FROM users WHERE name='%s' AND pwd='%s';",
            pg_escape_string($username), md5($password));
$result = pg_query($connection, $query);

Achei que a forma que estava fazendo estava errada e com a segurança baixa...

No entanto, testei o sql injection OR 1=1 e pelo menos isso aí ele barrou... :)

Mais dicas ou esta bom assim?

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...