REMOTE_ADDR

Répondre
jeff
le 03/12/2007 à 10:02
jeff
Bonjour,

Je viens de lire la nouvelle sur la non sécurité de REMOTE_ADDR, je suis allé sur les cours php, et sur "Afficher le nombre de connectés sur un site", tu n'as pas proposé de modification ?

Il n'y a pas plus de parade sur le site d'où est issue la nouvelle.

Alors, que peut-on faire pour sécuriser ce REMOTE_ADDR ?

Jack Bocar
Je suis pour le monde du libre
LA GLOBULE
le 03/12/2007 à 10:50
LA GLOBULE
Les comment faire ne sont pas du tout sécurisés (je ne sais pas combien de fois j'ai du le répéter çà).
Ils sont juste là pour vous fournir un squelette de programmation.

Sinon, pour l'exemple de ce blog, la solution est simple : htmlentities.
jeff
le 05/12/2007 à 19:11
jeff
Bonjour,

J'ai essayé de placer le "HTMLENTITIE" et le "ENT_QUOTES". Le problème est que maintenant, pour afficher le nombre connecté, il me faut rafraichir la page…

J'ai du faire une erreur mais où ?

Mon code :



<?php
$conn = db_connect();
$result = $conn->query('SELECT count(*) FROM visiteurs_online');
$data = mysqli_fetch_array($result);

echo '<br />';
echo '<p class="connexion">Actuellement &nbsp; <strong>' , $data[0] , ' </strong> &nbsp; visiteur(s) sur le site. </p>';
echo 'Votre adresse IP est :';
echo ''.htmlentities($_SERVER["REMOTE_ADDR"].'',ENT_QUOTES);

echo '<br />';
?>


Merci de votre aide

Jack Bocar
Je suis pour le monde du libre
LA GLOBULE
le 05/12/2007 à 20:51
LA GLOBULE
Ben appuie sur F5.

Ca se refresh à chaque chargement de page le truc.
Si tu veux le faire toutes les x secondes, tu dois faire un truc en Ajax.
jeff
le 06/12/2007 à 10:53
jeff
Bonjour,

Lorsque j'ouvre une page, le nombre de connectés et à 0, il faut réactualiser cette page pour voir le chiffre apparaître.

1) - Est-ce que les "HTMLENTITIES" et le "ENT_QUOTES", sont biens placés ?

<?php
echo ''.htmlentities($_SERVER["REMOTE_ADDR"].'',ENT_QUOTES);
?>



2) - Je suppose qu'il n'est pas nécessaire d'en placer sur toutes les lignes du code suivant :

<?php
$result = $conn->query('SELECT count(*) FROM visiteurs_online WHERE ip= "'.$_SERVER['REMOTE_ADDR'].'"');

$result = $conn->query('UPDATE visiteurs_online SET time = "'.$temps_actuel.'" WHERE ip = "'.$_SERVER['REMOTE_ADDR'].'"');

$result = $conn->query('INSERT INTO visiteurs_online VALUES("'.$_SERVER['REMOTE_ADDR']. '",
?>



Merci de votre aide.

Jack Bocar
Je suis pour le monde du libre
LA GLOBULE
le 06/12/2007 à 13:49
LA GLOBULE
Lorsque j'ouvre une page, le nombre de connectés et à 0, il faut réactualiser cette page pour voir le chiffre apparaître.


Ben c'est pas bon ca.
Tu dois d'abord enregistrer la visite en base, puis seulement ensuite tu peux compter combien de visiteurs tu as.

Pour ton htmlentities, ca sert à rien de concaténer l'adresse IP avec une chaine vide.
Fais juste un :

<?php
echo htmlentities($_SERVER["REMOTE_ADDR"], ENT_QUOTES);
?>


Ensuite, pour tes requêtes SQL, il manque une fonction qui permet de te protéger contre les injections SQL.

Je ne sais pas ce que tu utilises comme base SQL (non plus quelle classe PHP tu utilises), mais la fonction à utiliser pour du MySQL, c'est mysql_escape_string (surement que ta classe a sa propre méthode d'escape, regarde la doc de ta classe).
jeff
le 07/12/2007 à 11:43
jeff
Bonjour,

J'ai refais le code, dis-moi si c'est correct ou s'il faut modifier quelque chose pour l'améliorer.


<?php
$mysqli = new mysqli('localhost', 'jackbocar', 'mon password', 'ma base');

if (mysqli_connect_errno()) {
printf("Echec de la connexion : %s\n", mysqli_connect_error());
exit();
}

$tps_max_connex = 180;

$temps_actuel = date("U");

$result = $mysqli->query('SELECT count(*) FROM visiteurs_online WHERE ip= "'.mysql_escape_string($_SERVER['REMOTE_ADDR']).'"');
$data = $result->fetch_array(MYSQLI_NUM);
$result->close();



if ($data[0]) {

$result = $mysqli->query('UPDATE visiteurs_online SET time = "'.$temps_actuel.'" WHERE ip = "'.mysql_escape_string($_SERVER['REMOTE_ADDR']).'"');
}
else {
$result = $mysqli->query('INSERT INTO visiteurs_online VALUES("'.mysql_escape_string($_SERVER['REMOTE_ADDR']). '", "'.$temps_actuel.'")');
}

$heure_max = $temps_actuel - $tps_max_connex;

$result2 = $mysqli->query('DELETE FROM visiteurs_online where time < "'.$heure_max.'"');
?>

<?php
$mysqli = new mysqli('localhost', 'jackbocar', 'mon password', 'ma base');

if (mysqli_connect_errno()) {
printf("Echec de la connexion : %s\n", mysqli_connect_error());
exit();
}

$result = $mysqli->query('SELECT count(*) FROM visiteurs_online');
$data = $result->fetch_array(MYSQLI_NUM);
$result->close();

echo 'Il y a actuellement ' , $data[0] , ' personne(s) sur le site.';
echo '<br /><br />';
echo '<p>';
echo 'Votre adresse IP est :';
echo htmlentities($_SERVER["REMOTE_ADDR"], ENT_QUOTES);

echo '</p>';
?>


Merci

Jack Bocar
Je suis pour le monde du libre
jeff
le 11/12/2007 à 10:55
jeff
Bonjour,

Personne pour me dire si c'est correct !!!

Jeff
Je suis pour le monde du libre
LA GLOBULE
le 11/12/2007 à 11:49
LA GLOBULE
Ben si ça fonctionne sans erreur (je n'ai pas testé), c'est que c'est pas trop mal.

Par contre, si jamais tes requêtes SQL merdent, il faut l'handler (tu ne le fais pas tout le temps).

Le mieux, c'est de faire un vrai handler d'erreur plutôt que d'afficher tes erreurs directement sur le site.

Sur lephpfacile, quand une erreur est générée, elle est loguée en base, je ne l'affiche pas, et je redirige le mec sur la home du site (si y'a une erreur en home, je redirige le mec sur une pauvre page HTML).
jeff
le 11/12/2007 à 17:57
jeff
Bonjour,

Merci de ta réponse.

Mais, je ne sais pas ce que ça veut dire "handler", et surtout pas comment réaliser un code.

Où, puis-je me renseigner pour avoir un tutoriel et surtout un modèle.

Merci de ta réponse.

Jack Bocar
Je suis pour le monde du libre
Répondre

Ecrire un message

Votre message vient d'être créé avec succès.
LoadingChargement en cours