Script de Segurança PHP

PHP

25/08/2015

Olá!

Sou novato em PHP. Estou criando um sistema de login com direcionamento para página especifica! O login está pronto, mas totalmente sem segurança... Quando copio o link e colo no navegador, a página abre sem pedir o login... Alguém pode me ajudar?

Segue código:

<?php
if(isset($_POST['usuario'])){
	$servidor = 'localhost'; //Host
	$usuario = 'root'; // User
	$senha = 'vertrigo'; // Senha do User
	$banco = 'login'; // Nome do BD
	
	//Conexao com o BD
	$pdo = new PDO('mysql:host='.$servidor.';dbname='.$banco,$usuario,$senha);
	$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
	
	
	//Recupera o Usuario e Senha
	$usuario = $_POST['usuario'];
	$senha = $_POST['senha']; 
	
	try{
	//Faz o Select da Pagina No Banco
	$sql = $pdo->prepare("SELECT `pagina` FROM `tabela_login` WHERE `usuario`= ? AND `senha`= ? LIMIT 1");
	$sql->execute(array($usuario,$senha));
	
	if($sql->rowCount() > 0 ){
		foreach($sql->fetchAll() as $dados) {
			//Seleciona a Pagina E Redireciona para a pagina cadastrada no banco
			$pagina = $dados['pagina'];
			header('Location:'.$pagina);
		}
		
	}else{
		echo 'Usuario ou Senha Incorretos';
	}
	
	//Se o Usuario e senha Forem Corretos Entra no While
		
		
	}catch(PDOexception $e){
		echo 'Ocorreu um Erro Ao Conectar : '.$e->getMessage();
	}
}
?>
Jonathan Allan

Jonathan Allan

Curtidas 0

Melhor post

William

William

26/08/2015

Que bom, meu blog pessoal http://www.devwilliam.com.br/.
GOSTEI 2

Mais Respostas

Marcio Araujo

Marcio Araujo

25/08/2015

Boa tarde Jonathan, segue aí para sua analise, algumas dicas de segurança.

[url]http://blog.thiagobelem.net/principais-falhas-de-seguranca-no-php/[/url]
GOSTEI 1
William

William

25/08/2015

Olá Jonathan, pode ter certeza que vi scripts bem piores, o seu já tem o básico que é trabalhar parametrizado e usar preparedStatement do PDO, isso é um bom começo.

Quanto a sua dúvida de abrir a url diretamente é o seguinte, uma sugestão seria no momento que você valida o usuário criar uma SESSION exemplo bem básico:
[code]
<?php
if(isset($_POST['usuario'])){
$servidor = 'localhost'; //Host
$usuario = 'root'; // User
$senha = 'vertrigo'; // Senha do User
$banco = 'login'; // Nome do BD

//Conexao com o BD
$pdo = new PDO('mysql:host='.$servidor.';dbname='.$banco,$usuario,$senha);
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);


//Recupera o Usuario e Senha
$usuario = $_POST['usuario'];
$senha = $_POST['senha'];

try{
//Faz o Select da Pagina No Banco
$sql = $pdo->prepare("SELECT `pagina` FROM `tabela_login` WHERE `usuario`= ? AND `senha`= ? LIMIT 1");
$sql->execute(array($usuario,$senha));

if($sql->rowCount() > 0 ){
foreach($sql->fetchAll() as $dados) {

//Seleciona a Pagina E Redireciona para a pagina cadastrada no banco
$pagina = $dados['pagina'];
header('Location:'.$pagina);
}

}else{
echo 'Usuario ou Senha Incorretos';
}

//Se o Usuario e senha Forem Corretos Entra no While


}catch(PDOexception $e){
echo 'Ocorreu um Erro Ao Conectar : '.$e->getMessage();
}
}
?>
[code]
GOSTEI 1
William

William

25/08/2015

Olá Jonathan, pode ter certeza que vi scripts bem piores, o seu já tem o básico que é trabalhar parametrizado e usar preparedStatement do PDO, isso é um bom começo.

Quanto a sua dúvida de abrir a url diretamente é o seguinte, existem diversas maneiras de montar essa verificação, vou deixar uma sugestão bem básica, no momento que você valida o usuário criar uma SESSION:
session_start();
<?php
if(isset($_POST['usuario'])){
    $servidor = 'localhost'; //Host
    $usuario = 'root'; // User
    $senha = 'vertrigo'; // Senha do User
    $banco = 'login'; // Nome do BD
     
    //Conexao com o BD
    $pdo = new PDO('mysql:host='.$servidor.';dbname='.$banco,$usuario,$senha);
    $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
     
     
    //Recupera o Usuario e Senha
    $usuario = $_POST['usuario'];
    $senha = $_POST['senha']; 
     
    try{
    //Faz o Select da Pagina No Banco
    $sql = $pdo->prepare("SELECT `pagina` FROM `tabela_login` WHERE `usuario`= ? AND `senha`= ? LIMIT 1");
    $sql->execute(array($usuario,$senha));
     
    if($sql->rowCount() > 0 ){
        foreach($sql->fetchAll() as $dados) {
            $_SESSION['validado'] = TRUE;
            //Seleciona a Pagina E Redireciona para a pagina cadastrada no banco
            $pagina = $dados['pagina'];
            header('Location:'.$pagina);
        }
         
    }else{
        $_SESSION['validado'] = FALSE;
        echo 'Usuario ou Senha Incorretos';
    }
     
    //Se o Usuario e senha Forem Corretos Entra no While
         
         
    }catch(PDOexception $e){
        echo 'Ocorreu um Erro Ao Conectar : '.$e->getMessage();
    }
}
[code]

No topo das páginas internas você sempre inicia a SESSION com "session_start();" e cria um script (verifica_acesso.php) somente para verificar se existe a SESSION['validado'] e se ela tem o valor TRUE, caso não exisae vc redireciona para a index por exemplo, pode chamar esse script com um include:
[code]
<?php
session_start();
include 'verifica_acesso.php';


Lembrando que esse exemplo é básico, tem sistemas que usam cookies para esse tipo de tarefa.
GOSTEI 1
Marcio Araujo

Marcio Araujo

25/08/2015

William, me confirme se o link que postei está dentro dos padrões atuais, por favor.
GOSTEI 0
William

William

25/08/2015

Então Márcio o post é de 2009, mas conheço vários posts do autor e considero o mesmo com grande conhecimento em PHP, algumas práticas citadas ali principalmente o que se refere a prevenção de SQL Injection eu mesmo nunca tive que usar, como citei acima basta trabalhar parametrizado com SQL, tanto a extensão mysqli quanto PDO possuem está funcionalidade.
GOSTEI 0
Marcio Araujo

Marcio Araujo

25/08/2015

Então o PDO supri as necessidades do artigo do link, ok?
GOSTEI 0
William

William

25/08/2015

Se tratando de prevenção "SQL Injection" sim, ali ele também cita outros cenários com prevenções via URL principalmente na maneira como é tratado os parâmetros, ai cai muito na questão de experiência do programador.

Po exemplo, ainda vejo muitos scripts onde a captura e o processamento dos dados é feita capturando direto $_POST['campo'], no mínimo poderia verificar se veio vazio o parâmetros, mas muitas vezes nem isso existe.
GOSTEI 0
Jonathan Allan

Jonathan Allan

25/08/2015

Boa tarde Jonathan, segue aí para sua analise, algumas dicas de segurança.

[url]http://blog.thiagobelem.net/principais-falhas-de-seguranca-no-php/[/url]


Obrigado Márcio Araújo! Esse link ajudou muito!
GOSTEI 0
Jonathan Allan

Jonathan Allan

25/08/2015

Olá Jonathan, pode ter certeza que vi scripts bem piores, o seu já tem o básico que é trabalhar parametrizado e usar preparedStatement do PDO, isso é um bom começo.

Quanto a sua dúvida de abrir a url diretamente é o seguinte, existem diversas maneiras de montar essa verificação, vou deixar uma sugestão bem básica, no momento que você valida o usuário criar uma SESSION:
session_start();
<?php
if(isset($_POST['usuario'])){
    $servidor = 'localhost'; //Host
    $usuario = 'root'; // User
    $senha = 'vertrigo'; // Senha do User
    $banco = 'login'; // Nome do BD
     
    //Conexao com o BD
    $pdo = new PDO('mysql:host='.$servidor.';dbname='.$banco,$usuario,$senha);
    $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
     
     
    //Recupera o Usuario e Senha
    $usuario = $_POST['usuario'];
    $senha = $_POST['senha']; 
     
    try{
    //Faz o Select da Pagina No Banco
    $sql = $pdo->prepare("SELECT `pagina` FROM `tabela_login` WHERE `usuario`= ? AND `senha`= ? LIMIT 1");
    $sql->execute(array($usuario,$senha));
     
    if($sql->rowCount() > 0 ){
        foreach($sql->fetchAll() as $dados) {
            $_SESSION['validado'] = TRUE;
            //Seleciona a Pagina E Redireciona para a pagina cadastrada no banco
            $pagina = $dados['pagina'];
            header('Location:'.$pagina);
        }
         
    }else{
        $_SESSION['validado'] = FALSE;
        echo 'Usuario ou Senha Incorretos';
    }
     
    //Se o Usuario e senha Forem Corretos Entra no While
         
         
    }catch(PDOexception $e){
        echo 'Ocorreu um Erro Ao Conectar : '.$e->getMessage();
    }
}
[code]

No topo das páginas internas você sempre inicia a SESSION com "session_start();" e cria um script (verifica_acesso.php) somente para verificar se existe a SESSION['validado'] e se ela tem o valor TRUE, caso não exisae vc redireciona para a index por exemplo, pode chamar esse script com um include:
[code]
<?php
session_start();
include 'verifica_acesso.php';


Lembrando que esse exemplo é básico, tem sistemas que usam cookies para esse tipo de tarefa.


Obrigado Willian! me ajudou bastante! Vou fazer os teste e posto o resultado! Vc pode me falar mais sobre esse script de verificação?
GOSTEI 0
William

William

25/08/2015

Bom Jonathan o caminho é mais ou menos esse, você cria um script "verifica_acesso.php":
<?php
if (empty($_SESSION['validado']) || $_SESSION['validado'] == FALSE):
     header('Location:index.php');
endif;


Depois é só chamar no topo das páginas internas que você deseja verificar se o usuário está logado, chamando com include:
<?php
session_start();
include 'verifica_acesso.php';

/* Sua Página */


Caso não esteja logado ele será redirecionado para página index.php.
GOSTEI 1
Jonathan Allan

Jonathan Allan

25/08/2015

Bom Jonathan o caminho é mais ou menos esse, você cria um script "verifica_acesso.php":
<?php
if (empty($_SESSION['validado']) || $_SESSION['validado'] == FALSE):
     header('Location:index.php');
endif;


Depois é só chamar no topo das páginas internas que você deseja verificar se o usuário está logado, chamando com include:
<?php
session_start();
include 'verifica_acesso.php';

/* Sua Página */


Caso não esteja logado ele será redirecionado para página index.php.


Excelente Willian!!! Vou fazer os testes ! Muito obrigado! Assim que terminar posto o resultado!
GOSTEI 0
Fabio Santos

Fabio Santos

25/08/2015

William, possui algum material mais atualizado sobre segurança no PHP?
GOSTEI 0
William

William

25/08/2015

Fabio pior que ainda não publiquei nada sobre isso, mas já recebi alguns e-mails de leitores do meu blog fazendo essa solicitação!

Estou iniciando essa semana uma série de 4 artigos sobre importações com PHP lendo arquivos do Excel, CSV, TXT e XML.

Terminando esses vou preparar um material sobre esse assunto de segurança com PHP, tenho recebido muitos pedidos e já vale a pena escrever.
GOSTEI 0
Jonathan Allan

Jonathan Allan

25/08/2015

Bom Jonathan o caminho é mais ou menos esse, você cria um script "verifica_acesso.php":
<?php
if (empty($_SESSION['validado']) || $_SESSION['validado'] == FALSE):
     header('Location:index.php');
endif;


Depois é só chamar no topo das páginas internas que você deseja verificar se o usuário está logado, chamando com include:
<?php
session_start();
include 'verifica_acesso.php';

/* Sua Página */


Caso não esteja logado ele será redirecionado para página index.php.


Bom dia Willian! Fiz todo o processo, só mudei o "Location:index.php" para "Location:login.php", pois a intenção é voltar para a página de login se o acesso não for permitido... Sendo que.. quando tendo fazer o login, ele não acessa a página e retorna para a página de login... Estou quebrando minha cabeça desde de ontem para tentar resolver esse processo, mas até o momento sem sucesso... As dicas que você me passou estão servindo perfeitamente, agora só preciso entender porque que na hora do login, ele não vai para a página e permanece na página de login? Desculpa incomodar Willian, é que não estou conseguindo avançar...
GOSTEI 0
William

William

25/08/2015

Vou chutar mas está parecendo que você colocou o "include 'verifica_acesso.php';" no topo do script que valida o login e como ainda não existe SESSION ele retorna para o login.php, mas poste o script da página que faz a validação.

Por favor utilize a tag code para postar trechos de código!
GOSTEI 1
Jonathan Allan

Jonathan Allan

25/08/2015

Vou chutar mas está parecendo que você colocou o "include 'verifica_acesso.php';" no topo do script que valida o login e como ainda não existe SESSION ele retorna para o login.php, mas poste o script da página que faz a validação.

Por favor utilize a tag code para postar trechos de código!


Aí vai Willian... As páginas que estou trabalhando são essas: 1- login.php ( contém o script php e a html com os campos para login ) / 2- verifica_acesso.php ( contém o script de verificação ) / 3 - pagina01.php ( contém o "include" e o conteúdo da pagina ).

1 - login.php ( Inseri alguns campos de segurança )
<?php
if(isset($_POST['usuario'])){
	$servidor = 'localhost'; //Host
	$usuario = 'root'; // User
	$senha = 'vertrigo'; // Senha do User
	$banco = 'login'; // Nome do BD
	
	//Conexao com o BD
	$pdo = new PDO('mysql:host='.$servidor.';dbname='.$banco,$usuario,$senha);
	$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
	
	
	//Recupera o Usuario e Senha
	$usuario = $_POST['usuario'];
	$senha = $_POST['senha'];
	
        //Novo -
		function tratar($str) {
    	$retorno = trim($str);
    	$retorno = addslashes($retorno);
    	return $retorno;
}		
		 //Novo -
		$usuario = isset($_POST["usuario"]) ? tratar($_POST["usuario"]) : “0”;
		
		//Novo -	
		 $senha = sha1($_POST['senha']);
		 
	try{
	//Faz o Select da Pagina No Banco
	$sql = $pdo->prepare("SELECT `pagina` FROM `tabela_login` WHERE `usuario`= ? AND `senha`= ? LIMIT 1");
	$sql->execute(array($usuario,$senha));
	
	if($sql->rowCount() > 0 ){
		foreach($sql->fetchAll() as $dados)
		$_SESSION['validado'] = TRUE; {
			//Seleciona a Pagina E Redireciona para a pagina cadastrada no banco
			$pagina = $dados['pagina'];
			header('Location:'.$pagina);
		}
		
	}else{
		$_SESSION['validado'] = FALSE;
		echo 'Usuario ou Senha Incorretos';
	}
	
	//Se o Usuario e senha Forem Corretos Entra no While
		
		
	}catch(PDOexception $e){
		echo 'Ocorreu um Erro Ao Conectar : '.$e->getMessage();
	}
}
?>
// Abaixo todo conteúdo html...


2- verifica_acesso.php

<?php
if (empty($_SESSION['validado']) || $_SESSION['validado'] == FALSE):
     header('Location:login.php');
endif;
?>


3 - pagina01.php

<?php
session_start();
include 'verifica_acesso.php';
?>
// abaixo todo conteúdo da página em html...


Bom.. só existe essas páginas até o momento...
GOSTEI 0
William

William

25/08/2015

Um possível erro está ocorrendo quando vc cria a SESSION :
if($sql->rowCount() > 0 ){
        foreach($sql->fetchAll() as $dados)
        $_SESSION['validado'] = TRUE; {
            //Seleciona a Pagina E Redireciona para a pagina cadastrada no banco
            $pagina = $dados['pagina'];
            header('Location:'.$pagina);
        }
         
    }else{
        $_SESSION['validado'] = FALSE;
        echo 'Usuario ou Senha Incorretos';
    }


O correto:
if($sql->rowCount() > 0 ){
        $_SESSION['validado'] = TRUE; 
        foreach($sql->fetchAll() as $dados)
        {
            //Seleciona a Pagina E Redireciona para a pagina cadastrada no banco
            $pagina = $dados['pagina'];
            header('Location:'.$pagina);
        }
         
}else{
        $_SESSION['validado'] = FALSE;
        echo 'Usuario ou Senha Incorretos';
 }
GOSTEI 1
Jonathan Allan

Jonathan Allan

25/08/2015

Um possível erro está ocorrendo quando vc cria a SESSION :
if($sql->rowCount() > 0 ){
        foreach($sql->fetchAll() as $dados)
        $_SESSION['validado'] = TRUE; {
            //Seleciona a Pagina E Redireciona para a pagina cadastrada no banco
            $pagina = $dados['pagina'];
            header('Location:'.$pagina);
        }
         
    }else{
        $_SESSION['validado'] = FALSE;
        echo 'Usuario ou Senha Incorretos';
    }


O correto:
if($sql->rowCount() > 0 ){
        $_SESSION['validado'] = TRUE; 
        foreach($sql->fetchAll() as $dados)
        {
            //Seleciona a Pagina E Redireciona para a pagina cadastrada no banco
            $pagina = $dados['pagina'];
            header('Location:'.$pagina);
        }
         
}else{
        $_SESSION['validado'] = FALSE;
        echo 'Usuario ou Senha Incorretos';
 }


Fiz a alteração Willian... Mas o problema ainda continua...
GOSTEI 0
William

William

25/08/2015

Verifica se a SESSION está sendo criada!
GOSTEI 1
Fabio Santos

Fabio Santos

25/08/2015

Perfeito William, se puder divulgar por aqui eu agradeço!
GOSTEI 0
Jonathan Allan

Jonathan Allan

25/08/2015

Verifica se a SESSION está sendo criada!


Willian, poderia me explicar como verificar se a SESSION está sendo iniciada? Como disse, sou novato em PHP, estou aprendendo tudo na marra... Agradeço muito...
GOSTEI 0
William

William

25/08/2015

Basta adicionar no inicio das páginas internas:
<?php
session_start();
GOSTEI 1
Marcio Araujo

Marcio Araujo

25/08/2015

Boa tarde Jonathan, segue aí para sua analise, algumas dicas de segurança.

[url]http://blog.thiagobelem.net/principais-falhas-de-seguranca-no-php/[/url]


Obrigado Márcio Araújo! Esse link ajudou muito!


De nada.
GOSTEI 1
Jonathan Allan

Jonathan Allan

25/08/2015

Basta adicionar no inicio das páginas internas:
<?php
session_start();


Excelente Willian! Muito obrigado! Deu certo! Vou continuar acompanhando suas postagens! Quero aprender mais sobre PHP! Agora só falta criar um script de logout seguro, para destruir as sessões! vou dar uma pesquisada aqui, pra ver o que consigo! Vlw Willian!
GOSTEI 0
Fabio Santos

Fabio Santos

25/08/2015

Esse blog não é estranho, acho que tenho aqui guardado.
GOSTEI 0
Mauricio Padua

Mauricio Padua

25/08/2015

Sessão em cada página?
GOSTEI 0
POSTAR