Un vrai casse-tête MySQL

pyranhaz Messages postés 38 Statut Membre -  
pyranhaz Messages postés 38 Statut Membre -
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("");
?>

8 réponses

grandmoug Messages postés 621 Statut Contributeur 26
 
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 Statut Membre 3
 
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 621 Statut Contributeur 26 > pyranhaz Messages postés 38 Statut Membre
 
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 Statut Membre 3 > grandmoug Messages postés 621 Statut Contributeur
 
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 621 Statut Contributeur 26 > pyranhaz Messages postés 38 Statut Membre
 
il faut mettre des ` (c'est AltGr+7) je crois
0
Jean-François Pillou Messages postés 19541 Date d'inscription   Statut Webmaster Dernière intervention   63 279 > pyranhaz Messages postés 38 Statut Membre
 
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 Statut Membre 3
 
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 Statut Membre 3
 
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 1519 Statut Membre 281
 
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 19541 Date d'inscription   Statut Webmaster Dernière intervention   63 279
 
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 Statut Membre 3
 
Oui, il est bien auto-increment
0
pyranhaz Messages postés 38 Statut Membre 3
 
É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 Statut Membre 3
 
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 Statut Membre 3
 
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