Pergunta

Estou desenvolvendo um site, e devido à entrada de usuário ou por outra razão, eu preciso mostrar algumas mensagens de erro. Por isso, eu tenho uma página chamada error.php , e eu obter o número de erro usando $ _GET. Todas as mensagens de erro são armazenados em um array.

Exemplo:

header( 'Location: error.php?n=11' ); 

Mas eu não quero que os usuários ao inserir o código de erro na URL e veja todas as outras mensagens de erro. Para prevenir isso, eu pensei que eu poderia whitelist a página de referência, e apenas mostrar a mensagem de erro se o referer é encontrado na minha lista branca.

Deve ser justo semelhante a esta (ainda não testado;))

$accept = false;
$allowedReferer = array (0=>'page1.php', 'page2.php');
if (in_array($_SERVER['HTTP_REFERER'], $allowedReferer )) {$accept = true;}
if ($accept) { $n=$_GET['n'];echo "Error: " . $errorList[$n];}

Este método é bom o suficiente para evitar o espião-usuários ?

Estou fazendo isso com PHP5

Graças

Foi útil?

Solução

Ao invés de redirecionamento, você poderia simplesmente exibir o erro "no lugar" - por exemplo, algo tão simples como adaptar o seu código presente com algo como

if ($error_condition)
{
    $_GET['n']=11;
    include "/path/to/error.php";
    exit;
}

Na prática, pode ser um pouco mais sofisticado, mas a idéia é a mesma - o usuário é apresentado com uma mensagem de erro sem redirecionar. Certifique-se de saída de algum tipo de cabeçalho de erro, por exemplo, header ( "HTTP / 1.0 401 Bad Request") para dizer ao navegador que ele não está realmente vendo a página solicitada.

Se você deseja redirecionar, então você poderia criar um "inviolável" URL através da inclusão de um hash do número de erro com um sal conhecido apenas por seu código, por exemplo.

$n=11;
$secret="foobar";
$hash=md5($n.$secret);
$url="http://{$_SERVER['HTTP_HOST']}/error.php?n={$n}&hash={$hash}";

Agora, o seu error.php pode verificar se o hash fornecido foi criado corretamente. Se fosse, então, com toda a probabilidade ele foi criado por seu código, e não o usuário.

Outras dicas

Não, não é remotamente seguro: o cabeçalho HTTP Referer é trivial para paródia, e não é um cabeçalho necessário, quer. Eu sugiro que você leia este artigo para um exemplo de código de exploração (escrito em PHP), ou fazer o download este add-on para o Firefox fazê-lo sozinho a partir do conforto do seu próprio navegador.

Além disso, sua matriz $allowedReferer deve conter completo URL, não apenas o nome do script, caso contrário, o código também será explorado a partir de referências remotas, por exemplo, de

http://www.example.org/page1.php

Para resumir:. Você não pode restringir o acesso a qualquer público recurso de rede sem a necessidade de autenticação

Você não deve usar um redirecionamento externo para chegar a uma página de erro. Como eu estruturar minha PHP é assim:

Eu tenho um arquivo comum que está incluído em cada página, com funções comuns: Punho login / logout, configurar constantes e similares. Possui uma função de erro () lá você pode passar informações de erro para que irá mostrar uma página de erro e sair. Uma alternativa é usar o index.php? Incluem = pagename.php idioma para alcançar funcionalidade comum mas eu acho isso muito mais esquisito e propenso a erros.

Se você redirecionar externamente o cliente (que obviamente você precisa fazer às vezes) nunca confiar na informação passada através desse mecanismo. Como todos os entrada do usuário é inerentemente não confiável e deve ser higienizado e tratado com extrema cautela. Não usamos cookies ou (mesmo problema). Use sessões se você precisa manter as informações entre os pedidos.

HTTP_REFERER podem ser falsificados trivialmente por aqueles com incentivos suficientes (telnet é a ferramenta de escolha lá), e não deve ser confiável.

As mensagens de erro nunca deve revelar nada crítico de qualquer forma, então eu sugiro que você projetar suas mensagens de erro, de tal forma que pode ser mostrado a ninguém.

Isso, ou usar hashes aleatórios para identificar erros (em vez de 11, uso 98d1ud109j2, etc), que seria armazenado em um lugar central em um algum lugar matriz associativa:

$errors[A_VERY_FATAL_ERROR] => "308dj10ijd"

Por que você não basta incluir o script mensagem de erro? E para se livrar de dados de saída anteriores, use o controle de saída para tampão-la e limpá-la em caso de erro:

if ($error) {
    ob_clear();
    $errorCode = 11;
    include 'error.php';
    exit;
}

Em vez de redirecionar para uma página de erro por que não incluir uma página de erro. Você pode restringir o acesso a um diretório que contém os arquivos php que contêm o conteúdo de erro com .htaccess:

RedirectMatch 404 ^error-pages/*$

e no interior o erro de páginas que você pode ter páginas incluem-able que erros de exibição.

Com este método você pode ter certeza que ninguém pode acessar diretamente as páginas no diretório de erro páginas mas você ainda pode incluí-los dentro de scripts que são acessíveis ao público.

Se você lidar com erros antes de cabeçalhos de envio, você pode facilmente criar uma função que produz uma página html básico com conteúdo, e sair logo depois. Dessa forma, não há nenhuma necessidade específica de qualquer outra página (além da página de funções, eu acho).

É tão simples como verificar se há um problema, e se houver um problema, é só chamar a função.

Eu uso uma função como esta que mesmo grava dados afastado quando é chamado, então eu tenho o meu próprio erro registos ...

scroll top