Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

404

19 réponses
Avatar
VarioFlux
Hello
Dans une page php, comment intercepter une variable GET puis provoquer
une erreur 404 basique en fonction de sa valeur ?

En l'occurence, il s'agit pour moi de pouvoir faire un test du type :

if ($_GET['id'] == 999) {
header("HTTP/1.0 404 Not Found");
}

ce simple test affiche la page normalement même si id vaut 999. Si j'y
ajoute exit; le script stoppe (donc le test est bien positif) mais
toujours pas de page 404 !

En d'autre terme, comment simuler ou provoquer une "vraie" erreur 404 ?

Merci

--
VarioFlux @-`-,--

Metteur en scène cherche nain pour rôle dans court métrage.

10 réponses

1 2
Avatar
Olivier Miakinen

Dans une page php, comment intercepter une variable GET puis provoquer
une erreur 404 basique en fonction de sa valeur ?

En l'occurence, il s'agit pour moi de pouvoir faire un test du type :

if ($_GET['id'] == 999) {
header("HTTP/1.0 404 Not Found");
}

ce simple test affiche la page normalement même si id vaut 999. Si j'y
ajoute exit; le script stoppe (donc le test est bien positif) mais
toujours pas de page 404 !


1) Vérifier qu'aucun caractère n'est envoyé avant cet appel à header().
En particulier, si ta page est en UTF-8, vérifie qu'elle est sauvée sans
« Byte Order Mark » (BOM).

2) Selon que PHP est installé comme module d'Apache ou par CGI, je crois
que la requête est différente (mais ne me demande pas pourquoi). Tu peux
essayer à tout hasard :

if ($_GET['id'] == 999) {
header("Status: 404 Not found");
exit;
}

Avatar
VarioFlux
Olivier Miakinen a formulé la demande :
1) Vérifier qu'aucun caractère n'est envoyé avant cet appel à header().
En particulier, si ta page est en UTF-8, vérifie qu'elle est sauvée sans
« Byte Order Mark » (BOM).

2) Selon que PHP est installé comme module d'Apache ou par CGI, je crois
que la requête est différente (mais ne me demande pas pourquoi). Tu peux
essayer à tout hasard :

if ($_GET['id'] == 999) {
header("Status: 404 Not found");
exit;
}


J'ai créé une simple page ne contenant que :

<?php
if ($_GET['id'] == '404') {
header("Status: 404 Not found");
//header("HTTP/1.0 404 Not Found");
}
?>

donc rien d'envoyé avant...
que cela soit la première version du header ou la seconde, qu'il y ait
des quotes ou non à la valeur : résultat page blanche, pas de 404...

--
VarioFlux @-`-,--

A vendre robe de mariée portée une seule fois... Par erreur.

Avatar
Bob
VarioFlux a exposé le 12/11/2007 :

En d'autre terme, comment simuler ou provoquer une "vraie" erreur 404 ?


Après avoir envoyé la bonne entête HTTP kivabien, il ne faut pas
oublier d'envoyer la page HTML.

Une page 404 standard d'apache peut se réprésenter par le code PHP
suivant :

<?php
header("HTTP/1.0 404 Not Found");

echo '<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL '.$_SERVER['REQUEST_URI'].' was not found on this
server.</p>
<hr>
<address>'.$_SERVER['SERVER_SIGNATURE'].'</address>
</body></html>';
?>

A adapter selon vos besoins.

Avatar
YBM
Hello
Dans une page php, comment intercepter une variable GET puis provoquer
une erreur 404 basique en fonction de sa valeur ?

En l'occurence, il s'agit pour moi de pouvoir faire un test du type :

if ($_GET['id'] == 999) {
header("HTTP/1.0 404 Not Found");
}


j'aurai ajouté un "rn" en fin de chaîne, mais pour autant que je
sache (et teste en Linux/Apache) ça marche très bien.

ce simple test affiche la page normalement même si id vaut 999. Si j'y
ajoute exit; le script stoppe (donc le test est bien positif) mais
toujours pas de page 404 !


Ton script renvoie bien une erreur 404 dans l'en-tête, un client du
genre wget te dira bien la même chose que pour une url correspondant
à une page non trouvée "normale"...

Par contre comme tu fabrique l'en-tête toi-même et que ce n'est pas
Apache ou IIS qui génère l'erreur il n'y a rien dans l'en-tête qui
raconte que derrière tu envoie du html ni le html en question...
il faut le faire toi-même, par ex :

<?php
$header="HTTP/1.1 404 Not FoundrnContent-Type: text/html";

$content "<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL was not found on this server.</p>
<hr>
<address>A-Patchy-Server</address>
</body></html>";

header($notfound);
echo $content;
?>


En d'autre terme, comment simuler ou provoquer une "vraie" erreur 404 ?


elle était très vraie ton erreur 404, c'est le comportement d'un serveur
Web qui cherche des ressources dans un système de fichiers que tu cherches
à simuler.

La question existentielle du jour : ça sert à quoi ?

Avatar
Mickael Wolff

donc rien d'envoyé avant...
que cela soit la première version du header ou la seconde, qu'il y ait
des quotes ou non à la valeur : résultat page blanche, pas de 404...


Je t'invite à installer et utiliser Firebug (une extension de Firefox,
permettant de déboguer les applis web). En regardant, on constate bien
que le code HTTP est correctement renseigné.

Le problème c'est que Apache il n'en sait rien. Et c'est Apache,
lorsqu'il ne trouve pas une pag, émet l'erreur 404 et affiche une page Web.

Donc tu as une solution : tu inclus le document correspondant à
l'erreur 404 dans ce cas, après avoir renseigné l'en-tête avec le code
d'erreur.

Je n'ai pas trouvé de fonction PHP permettant d'interroger Apache sur
une option de configuration. Pourtant je suis certain que l'API d'Apache
propose cette fonctionnalité.

À+
--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org

Avatar
Olivier Miakinen
Olivier Miakinen a formulé la demande :


Ce n'était pas vraiment une demande, plutôt une proposition...

J'ai créé une simple page ne contenant que :

<?php
if ($_GET['id'] == '404') {
header("Status: 404 Not found");
//header("HTTP/1.0 404 Not Found");
}
?>


Tant que tu y es, tu peux essayer :

<?php
error_reporting(E_ALL);
header("Status: 404 Not found");
//header("HTTP/1.0 404 Not Found");
?>

donc rien d'envoyé avant...
que cela soit la première version du header ou la seconde, qu'il y ait
des quotes ou non à la valeur : résultat page blanche, pas de 404...


La page est dans quel charset ? Tu as vérifié que ce n'était pas UTF-8
avec BOM ?

Avatar
Mickael Wolff

La question existentielle du jour : ça sert à quoi ?


J'en vois au moins deux intérêts :

- tu utilises le rewriting pour gérer une arborescence d'articles. Si
l'article n'existe pas, ça peut être une bonne idée de mettre la page du
404 et de mettre le contenu correspondant.

- tu as un moteur de recherche sur le site. Ça peut être utile de
générer un code d'erreur 404 lorsque la recherche n'aboutit pas. Ça
éviterait aux moteurs de recherche d'indexer un contenu qui n'est pas
pertinent pour un sous (ça m'arrive souvent de tomber sur le moteur de
recherches de commentcamarche.com, sur des résultats inexistants).

Il doit y avoir d'autres intérêts, mais je te laisse l'opportunité d'y
réfléchir :)

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org

Avatar
VarioFlux
Mickael Wolff avait prétendu :

La question existentielle du jour : ça sert à quoi ?


J'en vois au moins deux intérêts :

- tu utilises le rewriting pour gérer une arborescence d'articles. Si
l'article n'existe pas, ça peut être une bonne idée de mettre la page du
404 et de mettre le contenu correspondant.

- tu as un moteur de recherche sur le site. Ça peut être utile de
générer un code d'erreur 404 lorsque la recherche n'aboutit pas. Ça
éviterait aux moteurs de recherche d'indexer un contenu qui n'est pas
pertinent pour un sous (ça m'arrive souvent de tomber sur le moteur de
recherches de commentcamarche.com, sur des résultats inexistants).

Il doit y avoir d'autres intérêts, mais je te laisse l'opportunité d'y
réfléchir :)


Ben je suis plus prosaïque que ça :

Depuis plusieurs semaines des bots attaquent ma galerie photo dans le
but d'y déposer des commentaires "exotiques" :o)

J'ai modifié le formulaire par quelques tests en PHP donc sur ce plan
là c'est réglé, pour l'instant, mais les accès continuent à raison de 4
à 5000 par jour, minimum. C'est une page PHP à laquelle on accède par
picture.php?image_id3&start , et ils font varier le paramètre
start en permanence, mais n'attaquent que 2 pages distinctes (N° 205 et
412)

J'ai tenté de bloquer les IP par .htaccess mais pour chaque IP bloquée
2 ou 3 autres nouvelles les remplace dans la minute, et un message est
apparu dans la galerie :


If you want do delete your site from our spam bases - just email us


with domain of your site:

thank you!
<<

Donc mon idée est de générer une "vraie" erreur 404 sur ces pages là et
uniquement celles-là car le reste est très bien référencé.

Si vous avez d'autres idées ?


Avatar
YBM
Donc mon idée est de générer une "vraie" erreur 404 sur ces pages là et
uniquement celles-là car le reste est très bien référencé.

Si vous avez d'autres idées ?


Que veux-tu de plus que mon exemple, ou celui encore plus proche d'une
page 404 d'Apache donné par Bob, qui est bel et bien une "vraie 404" ?

Avatar
Paul
...

Ben je suis plus prosaïque que ça :

...

Si vous avez d'autres idées ?
"Pot à miel"

http://www.supinfo-projects.com/fr/2006/design_archi_reseau_secu/6/
et Linux émulé :
http://actes.sstic.org/SSTIC03/Honeypots_UML/SSTIC03-Hervieux_Meurisse-Honeypots_UML.pps

J'eqça.. car ta démarche peut te sauver sur tes 2 pages, mais il faut
sans doute régler le problème plus généralement...

1 2