2009-02-19 6 views
2

Je suis en train de développer un site web, et en raison de l'entrée de l'utilisateur ou pour toute autre raison, j'ai besoin de montrer quelques messages d'erreur. Pour cela, j'ai une page nommée error.php, et j'obtiens le numéro d'erreur en utilisant $ _GET. Tous les messages d'erreur sont stockés dans un tableau.Cette méthode est-elle bonne/sécurisée pour montrer des erreurs aux utilisateurs? - PHP

Exemple:

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

Mais je ne veux pas que les utilisateurs les entrer le code d'erreur dans l'URL et voir tous les autres messages d'erreur. Pour éviter cela, j'ai pensé que je pourrais mettre en liste blanche la page de référence, et afficher seulement le message d'erreur si le referer est trouvé dans ma liste blanche.

Il devrait être juste similaire à ce (n'ont pas encore testé;))

$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];} 

Cette méthode est assez bon pour éviter les utilisateurs d'espionnage-?

Je fais cela avec

PHP5

Merci

Répondre

5

quelque chose d'aussi simple que l'adaptation de votre code actuel avec quelque chose comme

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

Dans la pratique, il est peut-être un peu plus sophistiqué, mais l'idée est la même - l'utilisateur est présenté avec un message d'erreur sans redirection. Assurez-vous de sortir une sorte d'en-tête d'erreur, par ex. header ("HTTP/1.0 401 Bad Request") pour indiquer au navigateur qu'il ne voit pas vraiment la page demandée.

Si vous souhaitez rediriger, vous pouvez créer une URL "inviolable" en incluant un hachage du numéro d'erreur avec un sel connu uniquement de votre code, par ex.

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

Maintenant, votre error.php peut vérifier si le hachage fourni a été correctement créé. Si c'était le cas, alors selon toute vraisemblance, il a été créé par votre code, et non par l'utilisateur.

+0

+1 pour le hachage salé. –

+0

+1 pour inclure au lieu de rediriger. – Gumbo

8

Non, ce n'est pas sécurisé à distance: l'en-tête HTTPReferer est trivial d'usurper, et n'est pas un en-tête soit nécessaire. Je vous suggère de lire this article pour un exemple d'exploitation de code (écrit en PHP), ou de télécharger this add-on pour Firefox pour le faire vous-même dans le confort de votre propre navigateur.

En outre, votre $allowedReferer tableau doit contenir plein URL, non seulement le nom du script, sinon le code sera également exploitable de références à distance, par exemple de

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

Pour résumer: vous ne pouvez pas restreindre l'accès à une ressource réseau publique sans nécessiter d'authentification.

1

HTTP_REFERER peut être usurpé trivialement par ceux avec suffisamment d'incitations (telnet est l'outil de choix là-bas), et ne doit pas être approuvé.

Les messages d'erreur ne devraient jamais révéler quelque chose de critique de toute façon, je vous suggère donc de concevoir vos messages d'erreur de manière à ce qu'ils puissent être montrés à n'importe qui.

que, ou hash aléatoires pour identifier les erreurs (au lieu de 11, utilisez 98d1ud109j2, etc.), qui seraient stockés dans une place centrale dans un tableau associatif quelque part:

$errors[A_VERY_FATAL_ERROR] => "308dj10ijd"
4

Vous ne devriez pas utiliser une redirection externe pour accéder à une page d'erreur. Comment je structure mon PHP est comme ceci:

J'ai un fichier commun qui est inclus dans chaque page, avec des fonctions communes: gérer la connexion/déconnexion, mettre en place des constantes et autres. Avoir une fonction error() là vous pouvez passer des informations d'erreur à qui affichera une page d'erreur et quitter. Une alternative est d'utiliser l'idiome index.php? Include = pagename.php pour atteindre la fonctionnalité commune, mais je trouve cela beaucoup plus floconneux et sujettes aux erreurs.

Si vous redirigez le client vers l'extérieur (ce que vous devez évidemment faire parfois), ne comptez jamais sur les informations transmises via ce mécanisme. Comme toutes les entrées de l'utilisateur, il est intrinsèquement indigne de confiance et devrait être nettoyé et traité avec une extrême prudence. N'utilisez pas non plus de cookies (même problème). Utilisez des sessions si vous devez conserver des informations entre les demandes.

0

Au lieu de rediriger vers une page d'erreur, pourquoi ne pas inclure une page d'erreur. Vous pouvez restreindre l'accès à un répertoire contenant les fichiers php qui contiennent le contenu d'erreur avec .htaccess:

RedirectMatch 404 ^error-pages/*$ 

et à l'intérieur des pages d'erreur, vous pouvez avoir des pages qui comprennent-mesure des erreurs d'affichage.

Avec cette méthode, vous pouvez être sûr que personne ne peut accéder directement aux pages du répertoire error-pages, mais vous pouvez toujours les inclure dans des scripts accessibles au public. Plutôt que de rediriger, vous pouvez simplement afficher l'erreur "en place" - par exemple,

0

Si vous gérez les erreurs avant d'envoyer les en-têtes, vous pouvez facilement créer une fonction qui affiche une page html de base avec du contenu et quitter juste après. De cette façon, il n'y a pas de besoin spécifique pour une autre page (en dehors de la page des fonctions, je suppose).

C'est aussi simple que de vérifier s'il y a un problème, et s'il y a un problème, il suffit d'appeler la fonction.

-je utiliser une fonction comme celle qui écrit les données, même loin quand on l'appelle, je dois donc mes propres journaux d'erreurs ...

1

Pourquoi vous comprennent tout simplement pas le script de message d'erreur? Et pour se débarrasser des données de sortie précédentes, utilisez le output control pour tamponner et effacer en cas d'erreur:

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