Jump to content

Archived

This topic is now archived and is closed to further replies.

Marcones Borges

Cadastro com Senha Criptografada

Recommended Posts

Boa noite, gostaria de ajuda.

 

tenho este código a baixo funcionando, gostaria de incrementar o md5 em meu sistema, como faço?

e  minha pagina de login mudaria alguma coisa?

 



if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) {
  $insertSQL = sprintf("INSERT INTO usuario (id, usuario, nome, email, telefone, senha, data_cadastro) VALUES (%s, %s, %s, %s, %s, %s, %s)",
                       GetSQLValueString($_POST['nome'], "int"),
                       GetSQLValueString($_POST['usuario'], "text"),
                       GetSQLValueString($_POST['nome'], "text"),
                       GetSQLValueString($_POST['email'], "text"),
                       GetSQLValueString($_POST['telefone'], "text"),
                       GetSQLValueString($_POST['senha'], "text"),
                       GetSQLValueString($_POST['data_cadastro'], "text"));

  mysql_select_db($database_localhost, $localhost);
  $Result1 = mysql_query($insertSQL, $localhost) or die(mysql_error());

  $insertGoTo = "index.php";
  if (isset($_SERVER['QUERY_STRING'])) {
    $insertGoTo .= (strpos($insertGoTo, '?')) ? "&" : "?";
    $insertGoTo .= $_SERVER['QUERY_STRING'];
  }
  header(sprintf("Location: %s", $insertGoTo));
}

 

 

Share this post


Link to post
Share on other sites

Basicamente você coloca:

GetSQLValueString(md5($_POST['senha']), "text"),

E no seu login você precisa comparar com md5($_POST['senha']) também.

 

Mas devo ressaltar que seu código é bem inseguro fazendo deste jeito. Você está sujeito a SQL Injection por não filtrar os dados que vem do $_POST e $_SERVER com filter_input() e não estar utilizando PDO Prepare Statements. Além disso md5() já não é quase mais usado, melhor trocar para password_hash().

Share this post


Link to post
Share on other sites

Beleza amigo deu certo o MD5, então como eu faria com password_hash ?

 



if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) {
  $insertSQL = sprintf("INSERT INTO usuario (id, usuario, nome, email, telefone, senha, data_cadastro) VALUES (%s, %s, %s, %s, %s, %s, %s)",
                       GetSQLValueString($_POST['nome'], "int"),
                       GetSQLValueString($_POST['usuario'], "text"),
                       GetSQLValueString($_POST['nome'], "text"),
                       GetSQLValueString($_POST['email'], "text"),
                       GetSQLValueString($_POST['telefone'], "text"),
                       GetSQLValueString($_POST['senha'], "text"),
                       GetSQLValueString($_POST['data_cadastro'], "text"));

  mysql_select_db($database_localhost, $localhost);
  $Result1 = mysql_query($insertSQL, $localhost) or die(mysql_error());

  $insertGoTo = "index.php";
  if (isset($_SERVER['QUERY_STRING'])) {
    $insertGoTo .= (strpos($insertGoTo, '?')) ? "&" : "?";
    $insertGoTo .= $_SERVER['QUERY_STRING'];
  }
  header(sprintf("Location: %s", $insertGoTo));
}

 

O login esta assim.

 



$loginFormAction = $_SERVER['PHP_SELF'];
if (isset($_GET['accesscheck'])) {
  $_SESSION['PrevUrl'] = $_GET['accesscheck'];
}

if (isset($_POST['usuario'])) {
  $loginUsername=$_POST['usuario'];
  $password=$_POST['senha'];
  $MM_fldUserAuthorization = "nivel";
  $MM_redirectLoginSuccess = "index.php";
  $MM_redirectLoginFailed = "login.php";
  $MM_redirecttoReferrer = false;
  mysql_select_db($database_localhost, $localhost);
      
  $LoginRS__query=sprintf("SELECT usuario, senha, nivel FROM usuario WHERE usuario=%s AND senha=%s",
  GetSQLValueString($loginUsername, "text"), GetSQLValueString($password, "text")); 
   
  $LoginRS = mysql_query($LoginRS__query, $localhost) or die(mysql_error());
  $loginFoundUser = mysql_num_rows($LoginRS);
  if ($loginFoundUser) {
    
    $loginStrGroup  = mysql_result($LoginRS,0,'nivel');
    
    if (PHP_VERSION >= 5.1) {session_regenerate_id(true);} else {session_regenerate_id();}
    //declare two session variables and assign them
    $_SESSION['MM_Username'] = $loginUsername;
    $_SESSION['MM_UserGroup'] = $loginStrGroup;          

    if (isset($_SESSION['PrevUrl']) && false) {
      $MM_redirectLoginSuccess = $_SESSION['PrevUrl'];    
    }
    header("Location: " . $MM_redirectLoginSuccess );
  }
  else {
    header("Location: ". $MM_redirectLoginFailed );
  }
}

 

e como eu faria o filtro contra invasaão mysql injection

Share this post


Link to post
Share on other sites
23 minutos atrás, Kosonome disse:

Basicamente você coloca:


GetSQLValueString(md5($_POST['senha']), "text"),

E no seu login você precisa comparar com md5($_POST['senha']) também.

 

Mas devo ressaltar que seu código é bem inseguro fazendo deste jeito. Você está sujeito a SQL Injection por não filtrar os dados que vem do $_POST e $_SERVER com filter_input() e não estar utilizando PDO Prepare Statements. Além disso md5() já não é quase mais usado, melhor trocar para password_hash().

consegui com MD5, coloquei aqui senha e login funcionando perfeito...

 

agora me diz como faço o filtro contra inject neste código grato!

 

Share this post


Link to post
Share on other sites

Primeiramente o filtro:

Citar

$post = (object) filter_input_array((htmlspecialchars(INPUT_POST)), FILTER_DEFAULT);

 

Depois é pegar o post e enviar para uma classe/função para verificar ou codificar certos caracteres

Citar

funcao_nome($post-senha);

 

Depois de passado pela função/método que vai prevenir SQL inject na instância da execução:

Citar

$mdPass = md5($post-senha);

 

Então usar PrepareStatements da PDO como já foi citado, para registrar os dados, lembrando que lugar do $post->senha você usará a variável criada $mdPass.

 

Bom isso é o básico do básico de um sistema eficaz e seguro. Que esse básico já garante 99% de segurança.

Lembrando que para usar senha "criptografada" baste que use o comandos:

Citar

<?php

$string = "Seria o post que digitado";

$cript = md5($string);

 

Também pode usar isso:

Citar

<?php

$string = "Seria o post que digitado";

$cript = sha1($string);

 

Share this post


Link to post
Share on other sites

Criei um exemplo de verificação aqui:

 

Spoiler

<?php

class Checagem {
    private static $Valor;
    private static $Caractere;
    public static $retorno = null;

    public static function validarCampo($verifica) {
        self::$Valor = (string) $verifica;
        if (!preg_match('/^[a-zA-ZÀ-Úà-ú ]+$/', self::$Valor)) {
            self::$retorno = "Opa! Só pode usar letras e espaços";
            return true;
        } else {
            self::$retorno = null;
            return false;
        }
    }
}

$post = (object) filter_input_array((htmlspecialchars(INPUT_POST)), FILTER_DEFAULT);
$post->senha = "1a";

if (Checagem::validarCampo($post->senha)) {
    echo Checagem::$retorno;
} else {
    echo "Ok passou pela verificação!";
}

 

 

Share this post


Link to post
Share on other sites
4 minutos atrás, OmarF disse:

Criei um exemplo de verificação aqui:

 

  Ocultar conteúdo


<?php

class Checagem {
    private static $Valor;
    private static $Caractere;
    public static $retorno = null;

    public static function validarCampo($verifica) {
        self::$Valor = (string) $verifica;
        if (!preg_match('/^[a-zA-ZÀ-Úà-ú ]+$/', self::$Valor)) {
            self::$retorno = "Opa! Só pode usar letras e espaços";
            return true;
        } else {
            self::$retorno = null;
            return false;
        }
    }
}

$post = (object) filter_input_array((htmlspecialchars(INPUT_POST)), FILTER_DEFAULT);
$post->senha = "1a";

if (Checagem::validarCampo($post->senha)) {
    echo Checagem::$retorno;
} else {
    echo "Ok passou pela verificação!";
}

 

 

esta verificação posso colocar antes do meu código correto?

 

Share this post


Link to post
Share on other sites
39 minutos atrás, Marcones Borges disse:

esta verificação posso colocar antes do meu código correto?

 

 

Olha é só um exemplo simples, sobre POO, onde envio algo para um método de uma classe se responsabilizar pela validação dos dados.

Então vamos explicar....

Primeiro eu crio o arquivo que será a classe de verificação: Checagem.class.php

Spoiler

<?php
class Checagem {
    private static $Valor;
    private static $Caractere;
    public static $retorno = null;

    public static function validarCampo($verifica, $quantidade) {
        self::$Valor = (string) $verifica;
        self::$Caractere = (int) $quantidade;
        if (empty(self::$Valor) || (strlen(self::$Valor) <= self::$Caractere)) {
            self::$retorno = "Opa! você tem que digitar mais de " . self::$Caractere . " caracteres!";
            return true;
        } else if (!preg_match('/^[a-zA-ZÀ-Úà-ú ]+$/', self::$Valor)) {
            self::$retorno = "Opa! Só pode usar letras e espaços";
            return true;
        } else {
            self::$retorno = null;
            return false;
        }
    }
}

 

O seja nesse arquivo eu posso ter quantos métodos eu quiser, para validar qualquer coisa que seja necessário validar logins senhas etc... E dentro de cada método eu posso colocar as condições de validação. Note que nesse exemplo agora eu coloquei um verificação de quantidade de caractere necessário.

 

Então no arquivo que vai receber o post eu aplico o filtro, incluo o arquivo da classe e instancio ela, para poder acessar seus métodos:

Spoiler

<?php
$post = (object) filter_input_array((htmlspecialchars(INPUT_POST)), FILTER_DEFAULT);

require_once ('./Checagem.class.php');
$obj = new Checagem();

 

 

Já isso aqui é só um exemplo porque o filtro já aplicado vai pegar tudo que veio da array GLOBAL.POST: 

Não sendo necessário definir o que vai se o que:

Citar

$post->senha = "1a";

Ou seja... Digamos que eu tenha criado um formulário e cliquei em submeter se eu tivesse no arquivo que vai receber o post um var_dump($post); veria todos os dados da GLOBAL envelopados pelo filtro.

 

Então agora seria a validação:

Spoiler

if (!$post) {
    echo "O arquivo não recebeu nenhum post";
} else {
    // Esse é a condição da classe se ela retornar existe essa condição
    // Parando o script nessa condição
    if (Checagem::validarCampo($post->senha, 10)) {
        echo Checagem::$retorno;
    }
    else {
        echo "Ok passou pela verificação!";
        // Então como o motivo do post aqui eu aplico a criptação da senha
        $cript = md5($post->senha);
        /*
         * Aqui com os dados já limpos e verificados.
         * Solicitaria a uma outra casse PDO para verificar os dados no banco
         * e se não existir ai sim eu cadastraria o usuário.
         */
    }
}

 

 

Ficando mais ou menos assim o arquivo que receberia o post, mas isso aqui é só um exemplo básico

 

Spoiler

<?php
$post = (object) filter_input_array((htmlspecialchars(INPUT_POST)), FILTER_DEFAULT);

require_once ('./Checagem.class.php');
$obj = new Checagem();

if (!$post) {
    echo "O arquivo não recebeu nenhum post";
} else {
    if (Checagem::validarCampo($post->senha, 10)) {
        echo Checagem::$retorno;
    }
    else {
        echo "Ok passou pela verificação!";
        // Então como o motivo do post aqui eu aplico a criptação da senha
        $cript = md5($post->senha);
        /* ************************************ */
    }
}

 

 

 

 

Share this post


Link to post
Share on other sites

Tanto md5 quanto sha1 não são tão seguros assim. Façam com password_hash e "PASSWORD_BCRYPT" pois segue uma implementação do Blowfish. O password gerado fica com até 72 caracteres ou mais, cuidado.

$passwordHash = password_hash('senha', PASSWORD_BCRYPT);

if (password_verify('senha-errada', $passwordHash)) { 
	// senha correta
} else {
	// senha errada
}

 

15 horas atrás, OmarF disse:

Primeiramente o filtro:

 

O filtro filter_input_array() não é para utilizar com uma linha só provavelmente, o exemplo da documentação do PHP é bem legal: https://secure.php.net/manual/pt_BR/function.filter-input-array.php

 

Um exemplo de filtragem e PDO seria assim:

// string de conexão ao banco de dados
$pdo = new PDO('sqlite:/path/db/users.db');

// SQL
$stmt = $pdo->prepare('SELECT name FROM users WHERE id = :id');

// evitar html/javascript injection filtrando o $_GET['id']
$id = filter_input(INPUT_GET, 'id', FILTER_SANITIZE_NUMBER_INT);

// evita SQL injection em conjunto com filter_input
$stmt->bindParam(':id', $id, PDO::PARAM_INT);

// executa o SQL no banco de dados
$stmt->execute();

 

Share this post


Link to post
Share on other sites

  • Similar Content

    • By Alvaro_php
      Pessoal boa noite
      Tenho um sistema em Visual Basic 6 que utiliza um documento do Word que é enviado para as empresas, onde tenho algumas flags que são utilizadas para colocar no nome da empresa e endereço e que são enviadas via email

      Estou conseguindo converter esse documento do WORD em PDF sem problemas
      Private Sub ConverterWordParaPDF()

          On Error GoTo TrataErro
          Dim ObjWord2 As Word.Application
          Dim ObjWordDoc2 As Word.Document
          
          Set ObjWord2 = CreateObject('Word.Application')
          ObjWord2.Visible = False
          ObjWord2.DisplayAlerts = wdAlertsNone

          Set ObjWordDoc2 = ObjWord2.Documents.Open(App.Path + '\Documento.doc', True, True, False, Replace(Replace(Replace(Replace(Rs(1), '/', ''), '-', ''), '.', ''), '_', ''))

          ObjWordDoc2.ExportAsFixedFormat OutputFileName:= _
          App.Path + '\Documento.pdf', ExportFormat:=wdExportFormatPDF, _
          OpenAfterExport:=False, OptimizeFor:=wdExportOptimizeForPrint, Range:= _
          wdExportAllDocument, from:=1, To:=1, Item:=wdExportDocumentContent, _
          IncludeDocProps:=True, KeepIRM:=True, CreateBookmarks:= _
          wdExportCreateNoBookmarks, DocStructureTags:=True, BitmapMissingFonts:= _
          True, UseISO19005_1:=False
              
          ObjWord2.Visible = False
          ObjWord2.Quit (False)
          Set ObjWord2 = Nothing
      Exit Sub
      TrataErro:
        msgbox 'Erro ao converter o documento'
      End Sub

      Porém a senha que coloquei no word, não está ficando no arquivo pdf após a conversão, e também não achei nenhuma opção para incluir uma senha nesse novo arquivo

      Não estou usando o Crystal e o documento do word é um documento qualquer que o cliente usa, por isso que não da para utilizar o crystal

      Alguém sabe como que eu poderia fazer essa conversão e colocar a senha nesse novo arquivo ou teria alguma outra forma de converter esse documento para pdf que desse para colocar a senha

      Desde já agradeço a todos
    • By marsolim
      e aí galera... então tô querendo fazer um sistema de validar a senha por um código enviado pro email da criatura na hora de fazer o cadastro. tive duas ideias aqui...
       
      1. criar um campo na tabela de usuarios mesmo vamos dizer de nome status onde na hora do cadastro mete lá o código gerado randomicamente e manda o email pra pessoa e aí a pessoa insere o código recebido no email e bota ele num campo de formulário pra enviar pro sistema e então vai e bota confirmado no lugar do código na tabela e a partir daí, uma vez que foi confirmado entra normalmente.
       
      2. criar uma tabela com o id da criatura e o o código e então a pessoa insere o código e aí bota confirmado ou exclui a linha já que ela pode não ser necessária pois nesse caso a ideia é se tem a linha é porque ainda não confirmou e se não tem é porque já confirmou.
       
      ora pois eu cá acho que a primeira ideia é mais pratica porque não precisa de duas querys ou join pra fazer isso o que poupa recurso do sistema mas vocês faz de forma diferente? tem alguma outra técnica mais eficaz e própria pra isso?
       
      agradecido.
    • By Marcio_123
      pessoal bllll
       
      to tentando gravar esse arquivo tentando criptografar para evitar entrada de sql injection
       
      esta gravando legal mas o dado que esta o addslashes esta gravando em BRANCO o certo seria colocar \ antes de '
       
      alguem pode dar um help ai. :)
       
      <?php session_start(); ob_start(); $btsalvar = filter_input (INPUT_POST, 'btsalvar', FILTER_SANITIZE_STRING); if($btsalvar) { $campos = filter_input_array(INPUT_POST, FILTER_DEFAULT); $campos['senha'] = password_hash($campos['senha'], PASSWORD_DEFAULT); // var_dump($campos); $result_usuario = "INSERT INTO tb_usuarios (nome, endereco, numero, complemento, cep, senha) VALUES ( '" .addslashes($campos['nome']). "', // aqui coloca \ antes das ' '" .$campos['endereco']. "', '" .$campos['numero']. "', '" .$campos['complemento']. "', '" .$campos['cep']. "', '" .$campos['senha']. "' )"; $resultado_usario = mysqli_query($conn, $result_usuario); if(mysqli_insert_id($conn)){ $_SESSION['msgcad'] = "Usuário cadastrado com sucesso"; header("Location: Cadastro"); }else{ $_SESSION['msg'] = "Erro ao cadastrar o usuário"; } } ?>  
    • By marsolim
      fala grandes tudo na base do café? hehehe
      hoje tô postando mais pra uma troca de experiência sobre as formas de checar uma sequência de senha pra ver se não é tudo igual tipo aaaaaaaa ou 11111111, se é uma sequência crescente como abcdefgh ou 12345678 e se é uma sequência decrescente tipo hgfedcba ou 87654321. eu criei um script aqui que usa o ord() pra comparar o decimal de cada caractere com o próximo ou anterior. tá funcionando bem mas queria saber como vcs fazem isso, se tem uma forma mais prática e mais elegante e tal. meu script...
      $str = "dcba"; $pos = 1; $comprimento = strlen($str); $iguais = false; $seq_mais = false; $seq_menos = false; //******************************************* for($i = 0; $i < $comprimento - 1; ++$i){     if($str[$i] == $str[$i + 1]){         $pos += 1;     } } if($pos == $comprimento){     $iguais = true; } //******************************************* $pos = 1; for($i = 0; $i < $comprimento - 1; $i++){     if(ord($str[$i + 1]) == (ord($str[$i]) + 1)){         $pos += 1;     } } if($pos == $comprimento){     $seq_mais = true; } //******************************************* $pos = 1; for($i = 0; $i < $comprimento - 1; ++$i){     if(ord($str[$i]) == (ord($str[$i + 1]) + 1)){         $pos += 1;     } } if($pos == $comprimento){     $seq_menos = true; } echo $iguais . " - " . $seq_mais . " - " . $seq_menos; não botei teste de porcentagem de match, é só um teste simples por horas.
    • By Junior Salzano
      Fala galera 
      Bom dia, 
       
      Td certo ?
      Galera....
      To dando uma pesquisada aqui pra ver se encontro alguma coisa, se alguém já passou pela mesma situação puder ajudar.
      Eu preciso pegar um pdf e incluir uma senha nele pelo php, alguém sabe se isso é possível ?
      Criar uma rotina para carregar um pdf e incluir uma senha para que esse pdf seja aberto apenas por essa senha.
      Existem alguns site que realizam esse processo, alguém conhece algo no php para criar uma rotina;
       
      Valeu galera, obrigado por quem leu ate aqui.
       
      Abraço
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.