Array
(
    [0] => stdClass Object
        (
            [Votos_Balanceados] => 2
            [id] => 529866
            [titulo] => Script de Segurança PHP
            [dataCadastro] => DateTime Object
                (
                    [date] => 2015-08-26 14:02:40
                    [timezone_type] => 3
                    [timezone] => America/Sao_Paulo
                )

            [isFirstPost] => -1
            [idUsuario] => 269142
            [status] => A
            [isExample] => 
            [NomeUsuario] => William 
            [Apelido] => William (Devwilliam)
            [Foto] => 269142_20150809195205.jpg
            [Conteudo] => Que bom, meu blog pessoal [url:descricao=http://www.devwilliam.com.br/]http://www.devwilliam.com.br/[/url].
        )

)

Script de Segurança PHP

PHP
Jonathan Allan
   - 25 ago 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:
#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();
	}
}
?>

Post mais votado

William (devwilliam)
   - 26 ago 2015

Marcio Araujo
   - 25 ago 2015

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

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

William (devwilliam)
   - 25 ago 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:
[tagcod]
<?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();
}
}
?>
[tagcod]

William (devwilliam)
   - 25 ago 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:
#Código

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();
    }
}
[tagcod]

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:
[tagcod]
<?php
session_start();
include 'verifica_acesso.php';


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

Marcio Araujo
   - 25 ago 2015

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

William (devwilliam)
   - 25 ago 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.

Marcio Araujo
   - 25 ago 2015

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

William (devwilliam)
   - 25 ago 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.

Jonathan Allan
   - 25 ago 2015


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

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


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

Jonathan Allan
   - 25 ago 2015


Citação:
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:
#Código

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();
    }
}
[tagcod]

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:
[tagcod]
<?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?

William (devwilliam)
   - 25 ago 2015

Bom Jonathan o caminho é mais ou menos esse, você cria um script "verifica_acesso.php":
#Código

<?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:
#Código
<?php
session_start();
include 'verifica_acesso.php';

/* Sua Página */


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

Jonathan Allan
   - 25 ago 2015


Citação:
Bom Jonathan o caminho é mais ou menos esse, você cria um script "verifica_acesso.php":
#Código

<?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:
#Código
<?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!

Fabio Santos
   - 25 ago 2015

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

William (devwilliam)
   - 25 ago 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.

Jonathan Allan
   - 26 ago 2015


Citação:
Bom Jonathan o caminho é mais ou menos esse, você cria um script "verifica_acesso.php":
#Código

<?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:
#Código
<?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...

William (devwilliam)
   - 26 ago 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!

Jonathan Allan
   - 26 ago 2015


Citação:
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 )
#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'];
	
        //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

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


3 - pagina01.php

#Código
<?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...

William (devwilliam)
   - 26 ago 2015

Um possível erro está ocorrendo quando vc cria a SESSION :
#Código

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:
#Código
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';
 }

Jonathan Allan
   - 26 ago 2015


Citação:
Um possível erro está ocorrendo quando vc cria a SESSION :
#Código

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:
#Código
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...

William (devwilliam)
   - 26 ago 2015

Verifica se a SESSION está sendo criada!

Fabio Santos
   - 26 ago 2015

Perfeito William, se puder divulgar por aqui eu agradeço!