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

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

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

Aceitar