Script de Segurança PHP

25/08/2015

0

PHP

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

Responder

Post mais votado

26/08/2015

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

William

William
Responder

Mais Posts

25/08/2015

Marcio Araujo

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]
Responder

25/08/2015

William

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]
Responder

25/08/2015

Marcio Araujo

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

25/08/2015

William

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.
Responder

25/08/2015

Marcio Araujo

Então o PDO supri as necessidades do artigo do link, ok?
Responder

25/08/2015

William

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.
Responder

25/08/2015

Jonathan Allan

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!
Responder

25/08/2015

Jonathan Allan

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?
Responder

25/08/2015

William

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.
Responder

25/08/2015

Jonathan Allan

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!
Responder

25/08/2015

Fabio Santos

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

25/08/2015

William

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.
Responder

26/08/2015

Jonathan Allan

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...
Responder

26/08/2015

William

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!
Responder

26/08/2015

Jonathan Allan

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...
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar