Un vrai casse-tête MySQL

Fermé
pyranhaz Messages postés 38 Date d'inscription dimanche 19 octobre 2003 Statut Membre Dernière intervention 2 février 2008 - 18 mars 2004 à 18:20
pyranhaz Messages postés 38 Date d'inscription dimanche 19 octobre 2003 Statut Membre Dernière intervention 2 février 2008 - 20 mars 2004 à 20:05
Bonjour,

Comment fait-on pour dire à MySQL si tu trouve l'info dans la table x ne met rien dans la table y et tu ferme la bdd alors que dans le cas contraire tu ajoute l'info requise dans la table y ???

Dans ce cas présent, une première requête MySQL vérifie le user_agent avec la table "rs_robots"

Si cette requête est négative il retourne la page "Forbidden.php" à l'intrus

Dans le cas contraire il prend les identifications demandés de l'intrus et les ajoute à la table "ban"

Par conséquent, si le script fonctionne, je ne suis pas un robot et mon "user_agent" n'est pas dans la liste "rs_robots" donc j'obtiendrai la page "Forbidden.php" et mes infos seront dans la table "ban"

Or, je n'obtiens rien du tout !!!

Je sias qu'il y a une erreur évidente avec ma fonction "if" dans MySQL dont je ne sais pas comment l'appliquer (voir la partie en gras dans le script ci-dessous... Après avoir corrigé cette partie en gras, je pense que le script fonctionnera comme voulu... mais ce serait bien de vérifier tout le script...


Merci pour votre aide


<?php

//parametre de connection a la base de données
$host="sql";
$user="user";
$pass="pass";
$name="base1";
$table="ban";
$table_1="rs_robots";


//recuperation de la date systeme
$date = date("Y/m/d H:i");
//recuperation de l'ip du client
$ip = $HTTP_SERVER_VARS["REMOTE_ADDR"];
//recuperation du user_agent du client
$hote = $HTTP_SERVER_VARS["HTTP_USER_AGENT"];


//connection a la base de données
$dbic = mysql_connect($host,$user,$pass);
//selection de la base de données
mysql_select_db($name);

//recherche du robot
mysql_query("SELECT FROM rs_robots WHERE user_agent="$hote"");

//action si pas de robot
if while(list($hote) = mysql_fetch_row($res))

//liberation du resultat de la requette
mysql_free_result($res) or print mysql_error();
//fermeture de la connection a la base de données
mysql_close($ic) or print mysql_error();


// on insere l'ip du client dans la table des ip bloqué
mysql_query("INSERT into ban (id, ip, hote, date) values ('', '$ip', '$hote', '$date')");

//envoie de la page Forbidden.php à l'intrus
include ($HTTP_SERVER_VARS["DOCUMENT_ROOT"]."/Forbidden.php");


// on libère les prisonniers d'il ya 24 heures
$timestamp = time() - 86400; // 24 heures
$date_1 = date("Y-m-d H:i:s", $timestamp);
$delete = "DELETE FROM $table WHERE date < '$date_1'";
$query = Mysql_Query($delete);


// on ferme le script sans afficher le reste de la page demander
mysql_close($dbic);
die("");
?>
A voir également:

8 réponses

grandmoug Messages postés 619 Date d'inscription jeudi 2 mai 2002 Statut Contributeur Dernière intervention 21 juillet 2004 26
18 mars 2004 à 19:01
Salut,
j'avoue que j'ai pas compris cette partie
//recherche du robot
mysql_query("SELECT FROM rs_robots WHERE user_agent="$hote"");

//action si pas de robot
if while(list($hote) = mysql_fetch_row($res))

En effet : si $hote correspond à un robot alors ta requête sql aura un résultat et si $hote!= de robot=> ta requete sql sera vide.

Donc pourquoi ne pas faire juste un test sur le nombre de résultat de la requête sql.

Voilà c'est mon avis et j'espère que c'est pas une connerie ;)

Bon courage
0
pyranhaz Messages postés 38 Date d'inscription dimanche 19 octobre 2003 Statut Membre Dernière intervention 2 février 2008 3
18 mars 2004 à 19:10
non, je ne crois pas...

le nombre n'a pas d'importance...

ce que je veux est que si le "user_agent" est trouvé, la base se ferme et ne fait aucune action autre

dans le cas où aucun robot n'est trouvé (requête sql vide) que la page "Forbidden.php" soit immédiatement affiché en + d'ajouter les infos de l'intrus dans la table "ban"

mon problème est qu'en ce moment le script affiche une page blanche quand je le test...

Comme mon "user_agent" n'est pas celui d'un robot je devrais voir la page "Forbidden.php" et dans ma base MySQL et la table "ban" je devrais voir mon IP et la date + heure auquel cela est arrivé...

Rien du tout...
0
grandmoug Messages postés 619 Date d'inscription jeudi 2 mai 2002 Statut Contributeur Dernière intervention 21 juillet 2004 26 > pyranhaz Messages postés 38 Date d'inscription dimanche 19 octobre 2003 Statut Membre Dernière intervention 2 février 2008
18 mars 2004 à 19:19
C'est quand même un peu ce que je disais ;)
Bon ok je suis borné mais pourquoi ne pas tester si la requete est vide ou pas.
je m'explique
<?
$sql="SELECT FROM rs_robots WHERE user_agent='$hote'";	
$req=mysql_query($sql) or die ('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
if (mysql_num_rows($req) == 0)
{
   mysql_free_result($res) or print mysql_error();
  //fermeture de la connection a la base de données
  mysql_close($ic) or print mysql_error();
  // on insere l'ip du client dans la table des ip bloqué
  mysql_query("INSERT into ban (id, ip, hote, date) values ('', '$ip', '$hote', '$date')");
  //envoie de la page Forbidden.php à l'intrus
  include ($HTTP_SERVER_VARS["DOCUMENT_ROOT"]."/Forbidden.php");
  // on libère les prisonniers d'il ya 24 heures
  $timestamp = time() - 86400; // 24 heures
  $date_1 = date("Y-m-d H:i:s", $timestamp);
  $delete = "DELETE FROM $table WHERE date < '$date_1'";
  $query = Mysql_Query($delete);
  // on ferme le script sans afficher le reste de la page demander
  mysql_close($dbic);
  exit();
}
?>

Non ;) ?
0
pyranhaz Messages postés 38 Date d'inscription dimanche 19 octobre 2003 Statut Membre Dernière intervention 2 février 2008 3 > grandmoug Messages postés 619 Date d'inscription jeudi 2 mai 2002 Statut Contributeur Dernière intervention 21 juillet 2004
18 mars 2004 à 19:32
Oui,

néanmoins on se rapproche du but semble-t-il

J'ai une ERRUER MYSQL qui dit ceci:

Erreur SQL !
SELECT FROM rs_robots WHERE user_agent='Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)'
You have an error in your SQL syntax near 'FROM rs_robots WHERE user_agent='Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5' at line 1

C'est quoi, je ne comprends pas... il veut des '' entre rs_robots ???
comme ceci: 'rs_robots' ???
0
grandmoug Messages postés 619 Date d'inscription jeudi 2 mai 2002 Statut Contributeur Dernière intervention 21 juillet 2004 26 > pyranhaz Messages postés 38 Date d'inscription dimanche 19 octobre 2003 Statut Membre Dernière intervention 2 février 2008
18 mars 2004 à 19:38
il faut mettre des ` (c'est AltGr+7) je crois
0
Jean-François Pillou Messages postés 18707 Date d'inscription lundi 15 février 1999 Statut Webmaster Dernière intervention 16 février 2023 63 270 > pyranhaz Messages postés 38 Date d'inscription dimanche 19 octobre 2003 Statut Membre Dernière intervention 2 février 2008
18 mars 2004 à 19:58
C'est surtout que ce n'est pas du SQL ça...

SELECT koi FROM ?



Il faut que tu mettes :
SELECT * FROM [...]


ou mieux

SELECT champ1, champ2[, ...] FROM [...]


                                   
Jeff  --WM@CCM--
0
pyranhaz Messages postés 38 Date d'inscription dimanche 19 octobre 2003 Statut Membre Dernière intervention 2 février 2008 3
18 mars 2004 à 19:47
non, ca ne change rien les `
je cherche l'erreur...

je fais des requêtes dans phpMyAdmin jusqu'à ce que ca marche
0
pyranhaz Messages postés 38 Date d'inscription dimanche 19 octobre 2003 Statut Membre Dernière intervention 2 février 2008 3
18 mars 2004 à 19:57
Il semble que ce soit un succès !

reste à faire quelques tests et surtout attendre le passage des robots pour conclure...

l'ERREUR SQL était ceci:

SELECT * FROM `rs_robots` WHERE user_agent="google"

Oui il y avait les ` mais également le * après select

J'ai obtenu la page "Forbidden.php" puisque mon "user_agent" n'est pas un robot...

Mais je n'ai pas été ajouté dans la table "ban"
ce détail est impotant...
0
flokocha Messages postés 1510 Date d'inscription lundi 8 mars 2004 Statut Membre Dernière intervention 10 octobre 2015 280
18 mars 2004 à 19:59
C'est juste que SELECT FROM... n'existe pas.
Si tu veux récupérer les données de toutes les colonnes il faut mettre SELECT * FROM...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Jean-François Pillou Messages postés 18707 Date d'inscription lundi 15 février 1999 Statut Webmaster Dernière intervention 16 février 2023 63 270
18 mars 2004 à 20:00
mysql_query("INSERT into ban (ip, hote, date) values (\"$ip\", \"$hote\", \"$date\")");

Vérifie que ton champ id est bien en auto-increment


                                   
Jeff  --WM@CCM--
0
pyranhaz Messages postés 38 Date d'inscription dimanche 19 octobre 2003 Statut Membre Dernière intervention 2 février 2008 3
18 mars 2004 à 20:46
Oui, il est bien auto-increment
0
pyranhaz Messages postés 38 Date d'inscription dimanche 19 octobre 2003 Statut Membre Dernière intervention 2 février 2008 3
18 mars 2004 à 20:43
Échec !

Malheureusement, les robots se font prendre :-(

le script ne fonctionne pas...
Le user_agent même si il est trouvé par MySQL, bloque l'accès

je ne comprends pas
0
pyranhaz Messages postés 38 Date d'inscription dimanche 19 octobre 2003 Statut Membre Dernière intervention 2 février 2008 3
18 mars 2004 à 23:35
Problème finalement réglé définitivement !

tous semble avoir été "patché" et le résultat est satisfaisant après un test effectué avec mon "user_agent" la réponse est exactement celle attendue...

La question en suspend est qu'il est p-e tardif avant de fermer la base de donnée, mais bon c'est relatif en frais de question...

voici le code final, si vous avez des améliorations à me noter, gênez-vous pas...

Merci à ceux qui ont contribué à sa réalisation ! :-)

<?php

//parametre de connection a la base de données
$host="sql";
$user="user";
$pass="pass";
$name="base1";
$table="ban";


//recuperation de la date systeme
$date = date("Y/m/d H:i");
//recuperation de l'ip du client
$ip = $HTTP_SERVER_VARS["REMOTE_ADDR"];
//recuperation de l'hôte du client
$hote = $HTTP_SERVER_VARS["REMOTE_HOST"];
//recuperation du user_agent du client
$agent = $HTTP_USER_AGENT;


//connection a la base de données
$ic = mysql_connect($host,$user,$pass);
//selection de la base de données
mysql_select_db($name);

$sql="SELECT * FROM `rs_robots` WHERE user_agent='$agent'";
$req=mysql_query($sql) or die ('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
if (mysql_num_rows($req) == '')
{
// on insere l'ip du client dans la table des ip bloqué
mysql_query("INSERT into `ban` (id, ip, hote, date) values ('', '$ip', '$hote', '$date')");
//envoie de la page Forbidden.php à l'intrus
include ($HTTP_SERVER_VARS["DOCUMENT_ROOT"]."/Forbidden.php");
// on libère les prisonniers d'il ya 24 heures
$timestamp = time() - 86400; // 24 heures
$date_1 = date("Y-m-d H:i:s", $timestamp);
$delete = "DELETE FROM $table WHERE date < '$date_1'";
$query = Mysql_Query($delete);
// on ferme le script sans afficher le reste de la page demander
mysql_close($ic);
exit();
}
else
header('HTTP/1.1 301 Moved Permanently');
header('Location: http://www.zone-international.com');
header('Connection: close');
exit();
?>
0
pyranhaz Messages postés 38 Date d'inscription dimanche 19 octobre 2003 Statut Membre Dernière intervention 2 février 2008 3
20 mars 2004 à 20:05
Enfin !
C'est fonctionnel !

Les pages blanches étaient causés par la fonction "die('')" et/ou "exit()"

La façon inverse recherché (si pas dans la liste MySQL) a été trouvé avec le code suivant:

$sql="SELECT * FROM `rs_robots` WHERE agent='$agent'";
$req=mysql_query($sql) or die ('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
if (mysql_num_rows($req) == '')
{

et SANS rien d'autre en dessous que ceci:

//envoie de la page Hack.php à l'intrus
include ($HTTP_SERVER_VARS["DOCUMENT_ROOT"]."/Hack.php");
// on ferme le script
mysql_close($ic);
}

Ainsi si ce n'est PAS un robot, le fichier "Hack.php" entrera en action

Au contraire, si c'est UN robot, le fichier sera ignoré et la visite tranparente (sans arrêt ni page blanche)

Il y a cependant des visiteurs qui ont le "REMOTE_HOST == '' et qui ne sont pas bloqué par le système...

Je ne comprends pas pourquoi, même si c'est une minorité...

Comment peut-on contourner du php ???
0