evitar url adulteração em php
Pergunta
Este é um mecanismo de teste de aplicativo com 5 trabalhos definidas por mim..como 5 páginas php
Fluxo da aplicação
Login.html
check.php // para verificar se as credenciais de r para a direita
se correto, então
main.php //o usuário clica em "fazer o teste", em que esta página apresenta-lhe 1 dos 5 trabalhos...
mas uma vez que eu sou registrado no eu pode apenas mudar o url, para o url do teste de papel eu quero..os nomes de papel r 1.php 2.php....
como faço para parar isso...??
if(!isset($_SESSION['page'])//Tp
continue; //Tp
else
{
header('Location:login.php');
exit;
} //Tp
$_SESSION['page']=$_SERVER['SCRIPT_NAME'];//tp
isso está correto...como eu disse há 5 páginas....
no eac página eu tenho este código....
verificar se a variável de Sessão é definida....se ele estiver definido...isso significa que ele já visitou a página.....mas esse código não funciona...eu uso a variável _SESSION['page'] antes de declarar isso???
Solução
Os problemas que você está tendo pode principalmente ser resolvidos pela organização de seu código em torno de um padrão de manipulador de script.(ver o meu orientações abaixo.)
Há duas maneiras básicas para passar informações para um script (como eu disse em um comentário acima).A forma básica é através de um GET variável, como http://www.example.com/main.php?p=1
.
Se você deseja ter mais visitantes URLs amigáveis, você pode usar um RewriteRule
em um .htaccess
arquivo para converter o bom URLs para as URLs que seu processador vai entender.(Você vai precisar de o mod_rewrite habilitado.)
Isso pode ser um exagero para esta questão em particular, mas aqui estão algumas diretrizes para proteger aplicativos da web.Eu acho que eles são todos relevantes:
- Coloque suas informações confidenciais fora do público web raiz.
- Por padrão, não exibe qualquer informação.Só permitir a exibição de informações se o usuário está positivamente autorizado.
- Idealmente, isso inclui URLs (se eles digite uma URL válida, mas não são autorizados, não deixá-los saber que eles já atingiu um URL válido).É uma maneira de redirecionar (definir o cabeçalho de localização, como você estava fazendo) para a página de login, caso eles não estejam autorizados.
- Criar um manipulador padrão de script. Esta central script irá incluir todos os arquivos necessários e chamar todas as funções de que precisa.Passar todas as informações do pedido para este processador, e tem saída de todo o HTML.
- Requisito para #3: Encapsular o código funções e classes.Dessa forma, o manipulador padrão pode chamá-los quando estiver pronto, apenas se você precisar deles, e não simplesmente porque eles passou a ser incluído.Isso permite que você mais controle sobre o fluxo de seu aplicativo.
- Em vez de
echo
ing HTML em lugares aleatórios em todo o seu código, retornar todos os formatos de saída para o processador principal, que irá coletar e saída de tudo em um só lugar quando ele está pronto.Aleatóriaecho
s espalhados ao redor tornar mais fácil para furos de segurança para cortar. - Não confie a entrada do usuário.Se você estiver indo para usar um valor que você começa a partir
$_GET
ou$_POST
, certifique-se de que é um valor válido antes de usá-lo.
Editar:
(Este é mais específico e direcionado para o seu código, como é agora)
Há 3 motivos pelos quais o código não funciona conforme o esperado:
Você deixou de fora um parêntese de fechamento na primeira linha
if(!isset($_SESSION['page'])
.A forma como o código é escrito, se
$_SESSION['page']
já está definido quando o usuário visita a página, ele será redirecionado para a página de login.Você pode corrigir isto, ao colocar oheader('Location:login.php'); exit;
noif
cláusula e remover oelse
cláusula completamente:if(!isset($_SESSION['page'])) { header('Location:login.php'); exit; } $_SESSION['page']=$_SERVER['SCRIPT_NAME'];
Você precisa definir
$_SESSION['page']
quando fizer o primeiro logon, então eles serão capazes de ver a primeira página.
Eu recomendo usar um número inteiro para $_SESSION['page']
em vez do nome do script.Dessa forma, você pode definir $_SESSION['page']
1 quando iniciar sessão, e a cada vez que eles não conseguem visualizar uma página, incremento $_SESSION['page']
por um.Considere $_SESSION['page']
para dizer o próximo papel este usuário tem permissão para exibir.
Você pode definir um $pageid
em cada papel.Cada vez que tenta exibir uma página, se $_SESSION['page']
é menos do que $pageid
, não deixá-los ver a página.
Outras dicas
A melhor maneira é criar verdadeira autenticação e autorização em seu aplicativo. Em seguida, o URL que serve ao documento precisa verificar se o usuário pode visualizar a página antes de servir.
Tudo o que você estiver fazendo em check.php, faça -o na própria página de papel.
Muitas alternativas. Um casal:
Não codifique o nome dos nomes de papel no URL, mas retorne o conteúdo do papel selecionado de uma página chamada, digamos, teste paper.php.
Rastreie os papéis que o usuário tem o direito de ver na sessão do usuário. Verifique cada página do papel de teste se o usuário pode ver este e retornar um 403 proibido (ou uma página de erro), se não estiver.
Muito mais, tenho certeza.