Discussion:
404
(trop ancien pour répondre)
VarioFlux
2007-11-12 22:17:34 UTC
Permalink
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.
Olivier Miakinen
2007-11-12 22:23:08 UTC
Permalink
Post by VarioFlux
Dans une page php, comment intercepter une variable GET puis provoquer
une erreur 404 basique en fonction de sa valeur ?
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;
}
VarioFlux
2007-11-13 15:22:14 UTC
Permalink
Post by Olivier Miakinen
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
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.
Olivier Miakinen
2007-11-14 00:39:03 UTC
Permalink
Ce n'était pas vraiment une demande, plutôt une proposition...
Post by VarioFlux
<?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");
?>
Post by VarioFlux
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 ?
Mickael Wolff
2007-11-14 00:39:03 UTC
Permalink
Post by VarioFlux
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
Bob
2007-11-14 00:39:03 UTC
Permalink
Post by VarioFlux
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.
Patrick 'Zener' Brunet
2007-11-24 16:53:38 UTC
Permalink
Bonjour.
Post by Bob
Post by VarioFlux
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
<?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.
Je me suis posé le problème aussi...

Je crois qu'on peut reformuler en:
comment renvoyer à la page 404 standard de son hébergeur (avec un status 404
bien sûr).

Donc comment rendre la main au serveur pour qu'il fasse le traitement 404
par défaut, après qu'il ait trouvé un script à servir ?

Pas sûr que ce soit possible...

Merci.

--
Cordialement.
--
/**************************************************\
* Patrick BRUNET
* E-mail: lien sur http://zener131.free.fr/ContactMe
\**************************************************/
Mickael Wolff
2007-11-25 18:40:30 UTC
Permalink
Post by Patrick 'Zener' Brunet
Donc comment rendre la main au serveur pour qu'il fasse le traitement 404
par défaut, après qu'il ait trouvé un script à servir ?
Pas sûr que ce soit possible...
Si avant de répondre tu lisait l'intégralité de la discussion, tu
constaterais qu'on était déjà arrivé à cette conclusion.
--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
VarioFlux
2007-11-26 19:50:16 UTC
Permalink
Post by Mickael Wolff
Post by Patrick 'Zener' Brunet
Donc comment rendre la main au serveur pour qu'il fasse le traitement 404
par défaut, après qu'il ait trouvé un script à servir ?
Pas sûr que ce soit possible...
Si avant de répondre tu lisait l'intégralité de la discussion, tu
constaterais qu'on était déjà arrivé à cette conclusion.
Bon, je suis heureux de vous proposer la solution que j'ai trouvé :

*--
if ($_GET['image_id'] == 205) {
if ($_SERVER['HTTP_REFERER'] == '') {
header("HTTP/1.1 404 Not Found");
header("Content-Type:text/html");
header("Connection: close");
exit();
}
}
*--

ces quelques lignes répondent à ma problématique de départ.

C'est à dire renvoyer "une vraie erreur 404 apache pur jus" selon un
paramètre, j'y ai ajouté deplus un test sur le referer car les robots
qui tentent de spammer ma galerie n'en envoient pas et tapent
directement la page, alors que les 9/10ème des visiteurs normaux
arrivent sur cette page en suivant des liens.

Je vais bien voir si ça va exciter les spammeurs ou les calmer...
:o)
--
VarioFlux @-`-,--

Metteur en scène cherche nain pour rôle dans court métrage.
YBM
2007-11-14 00:39:03 UTC
Permalink
Post by VarioFlux
Hello
Dans une page php, comment intercepter une variable GET puis provoquer
une erreur 404 basique en fonction de sa valeur ?
if ($_GET['id'] == 999) {
header("HTTP/1.0 404 Not Found");
}
j'aurai ajouté un "\r\n" en fin de chaîne, mais pour autant que je
sache (et teste en Linux/Apache) ça marche très bien.
Post by VarioFlux
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 Found\r\nContent-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;
?>
Post by VarioFlux
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 ?
Mickael Wolff
2007-11-14 02:06:06 UTC
Permalink
Post by YBM
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
VarioFlux
2007-11-14 11:26:54 UTC
Permalink
Post by Mickael Wolff
Post by YBM
La question existentielle du jour : ça sert à quoi ?
- 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_id=123&start=20, 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:
abuse-***@inbox.ru
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 ?
YBM
2007-11-14 22:57:57 UTC
Permalink
Post by VarioFlux
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" ?
Paul
2007-11-15 07:39:03 UTC
Permalink
VarioFlux a écrit :
...
...
Post by VarioFlux
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...
Mickael Wolff
2007-11-15 07:39:03 UTC
Permalink
Post by VarioFlux
Si vous avez d'autres idées ?
Ben pour générer l'erreur tu as tout bon. Le bot il regarde pas le
contenu de la page s'il reçoit un 404 ou un 500 (modulo un bot pervers).
--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
Paul
2007-11-15 07:39:03 UTC
Permalink
VarioFlux a écrit :
...
Post by VarioFlux
Si vous avez d'autres idées ?
suite "pour les nuls" :
http://www.rstack.org/oudot/20022003/456/netbus/4_rapport.htm
Antoine Polatouche
2007-11-15 07:41:49 UTC
Permalink
Post by VarioFlux
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 ?
Si tu mets une page d'erreur, ils risquent d'attaquer tes autres pages.
Pourquoi ne fais-tu pas un vrai faux traitement: tu fais réagir ta page
comme normalement en répondant que tout est normal et tu ne fais aucun
traitement. Les robots ne vont pas voir si leurs posts ont été bien
écrits ;-)
Ils s'acharnent alors sur une page qui ne fait rien et sont contents
comme ça.
VarioFlux
2007-11-15 15:33:29 UTC
Permalink
Post by Antoine Polatouche
Post by VarioFlux
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 ?
Si tu mets une page d'erreur, ils risquent d'attaquer tes autres pages.
Pourquoi ne fais-tu pas un vrai faux traitement: tu fais réagir ta page
comme normalement en répondant que tout est normal et tu ne fais aucun
traitement. Les robots ne vont pas voir si leurs posts ont été bien
écrits ;-)
Ils s'acharnent alors sur une page qui ne fait rien et sont contents
comme ça.
C'est ce qui me fais hésiter, à vrai dire, c'est pour ça que je voulais
une "vraie de vraie" page 404 ! Apache doit bien générer ou faire un
include de ce texte...

En attendant je fais le gros dos, mais ça dure depuis 3 ou 4 mois et
heureusement que j'ai un dédié...
--
VarioFlux @-`-,--

Sourd rencontrerait sourd pour trouver terrain d'entente.
Mickael Wolff
2007-11-15 22:10:33 UTC
Permalink
Post by VarioFlux
C'est ce qui me fais hésiter, à vrai dire, c'est pour ça que je voulais
une "vraie de vraie" page 404 ! Apache doit bien générer ou faire un
include de ce texte...
Du tout, c'est en dur dans le code. À la ligne 860, dans la version
trouvée via GoogleCodeSearch :

<http://www.google.com/codesearch?hl=fr&q=+lang:c+package:apache2+404+Not+Found+show:ib7AnBjygJU:xZupCAn-wMo:_ssPKX9GHUk&sa=N&cd=1&ct=rc&cs_p=http://ftp.debian.org/debian/pool/main/a/apache2/apache2_2.2.3.orig.tar.gz&cs_f=httpd-2.2.3/modules/http/http_protocol.c#first>

Ce qu'il faut comprendre, c'est que le texte n'est qu'un plus généré
pour l'utilisateur. En fait, le navigateur devrait afficher un message à
mon avis... mais bon, il a été décidé que la même erreur devait pouvoir
être représentée au goût du Webmaster. C'est ce qu'on appelle rendre
l'environnement cohérent ;)

Il ne faut pas que tu oublie que PHP est un module de Apache, et que
Apache, une fois qu'il a préparé les informations HTTP les mets à
disposition des modules et appelle les modules selon la nécessité. Si
Apache a trouvé un fichier à traiter, il n'a pas de raison de vérifier
que le module a changé l'état HTTP : il envoie ce qui a été modifié par
le module, point.

Sinon Apache serait trop intrusif, et les modules perdraient de leur
intérêt.
--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
Patrick 'Zener' Brunet
2007-11-24 16:53:38 UTC
Permalink
Bonjour.
Post by VarioFlux
Post by YBM
La question existentielle du jour : ça sert à quoi ?
[...]
Depuis plusieurs semaines des bots attaquent ma galerie photo dans le
but d'y déposer des commentaires "exotiques" :o)
[...]
If you want do delete your site from our spam bases - just email us
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 ?
Donnez-leur ce qu'ils veulent, en renommant les URL:
http://www.monkeys.com/cgi-bin/wpoison/wpoison.cgi/tetaclac

http://www.monkeys.com/wpoison/ pour description.

--
Cordialement.
--
/**************************************************\
* Patrick BRUNET
* E-mail: lien sur http://zener131.free.fr/ContactMe
\**************************************************/
Continuer la lecture sur narkive:
Loading...