Un vrai casse-tête MySQL
pyranhaz
Messages postés
38
Statut
Membre
-
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("");
?>
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:
- Un vrai casse-tête MySQL
- Un mot est caché dans l’en-tête du document. pour le trouver, modifiez sa couleur. - Forum Word
- Un mot est caché dans l'en-tête du document. pour le trouver, modifiez sa couleur. ✓ - Forum Word
- Mysql community download - Télécharger - Bases de données
- Écran ordinateur cassé sans choc - Forum Ecran
- Mysql error in file: /engine/classes/mysql.php at line 53 ✓ - Forum Réseaux sociaux
8 réponses
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
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
non, ca ne change rien les `
je cherche l'erreur...
je fais des requêtes dans phpMyAdmin jusqu'à ce que ca marche
je cherche l'erreur...
je fais des requêtes dans phpMyAdmin jusqu'à ce que ca marche
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...
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...
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...
Si tu veux récupérer les données de toutes les colonnes il faut mettre SELECT * FROM...
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
mysql_query("INSERT into ban (ip, hote, date) values (\"$ip\", \"$hote\", \"$date\")");
Vérifie que ton champ id est bien en auto-increment
Vérifie que ton champ id est bien en auto-increment
Jeff --WM@CCM--
É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
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
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();
?>
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();
?>
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 ???
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 ???
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...
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 ;) ?
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' ???
Il faut que tu mettes :
ou mieux
Jeff --WM@CCM--