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 
            [Login] => wllfl@ig.com.br
            [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();
}
}
#Código

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:
#Código
<?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();
}
}
#Código

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