11540 sujets

JavaScript, DOM et API Web HTML5

Bonjour/Bonsoir tout le monde.

Je développe actuellement un mini site de musique en ligne en HTML5/CSS3, tout cela avec la technologie avec Ajax pour récupérer les données.

je propose de créer sa chaîne pour créer ses propres playlists.

Posons concrètement la situation.
-Moi, je possède l'ID 4 dans la base de données.
-Mon amis possède l'ID 5 dans la base de données.

Lors du clique sur "MES PLAYLISTS", une fonction onclick avec comme paramètre l'ID de session (4 pour moi) est passé à la fonction de manière à comme vous vous en doutez, afficher les playlists de l'utilisateur en cours. Jusque là, vous me suivez hein ? Smiley cligne

Bon les playlists d'affiche bien et les fonctions joue bien leur rôles (aucun soucis la dessus).

Mais alors où est mon problème ?
Accrochez vous, c'est très loufoque : Lors du clique sur la playlist qui porte l'ID 5 par exemple dans la base de données, je recharge ma page (car j'ai déjà cerné le problème), et la magique ! J'inspecte mon bouton playlist qui passe en paramètre l'ID de session et je vois :

afficher_playlist('5');

Alors que mon vrai ID est le 4, je me retrouve avec l'ID 5 (celui de la playlist 5). Et cela ce pose avec n'importes quelles playlists. Si je clique sur la 7, je me retrouve avec l'ID de session 7. Cela permet donc, de se retrouver sur la session d'un autre ! Smiley sweatdrop
Grosse faille de sécurité et surtout incompréhension car jamais ne donne d'autre valeur à mon $_SESSION['id'].

Voilà les lignes de code (au cas où):

Fonction appelée lors du clique sur une playlist :

function afficher_titre_playlist(id_playlist,nom)//Paramètre(ID_de_playlist,NOM_de_playlist)
{
	var id=id_playlist;
	var xhr = getXMLHttpRequest();
	xhr.onreadystatechange = function() {
			if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 0)) {
				document.getElementById('titre_barre_titre').innerHTML = "Playlist "+nom;
				document.getElementById('liste_titre').innerHTML = xhr.responseText;
			}
			else{
				document.getElementById('titre_barre_titre').innerHTML = "Loading...";
			}
	}
	xhr.open("POST", "afficher_titre_playlist.php", true);
	xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	xhr.send("id="+id+"&nom="+nom);
}


Le fichier afficher_titre_playlist.php appelé par la fonction Ajax :
<?php
session_start();
header("Content-Type: text/html; charset=iso-8859-1");
include('connect.php');
$id=$_POST['id'];
$nom=$_POST['nom'];
$_SESSION['playlist'] = array();
$sql="SELECT * FROM musics_playlist WHERE id_playlist='$id'";
$res=mysql_query($sql);
$i=0;
echo "<ul style='float:left;'>";
while($curseur=mysql_fetch_array($res))
{
	$fichier=$curseur[1];
	$_SESSION['playlist'][]=$fichier;
	echo "<li id='".$i."'>";
	if(isset($_SESSION['membre'])||($_SESSION['membre']))
	{
		echo "<div onclick=supprimer_music_playlist('".$curseur[0]."','".$curseur[1]."'); id='supprimer'></div>";
	}
	echo "<input style='display:none;' id='musique".$i."' value='".$curseur[1]."' />";
	echo "<a onclick=jouer_titre('".$fichier."',".$i.");>";
	$fichier=str_replace("_", " ",$fichier);
	$fichier=str_replace(".mp3", "",$fichier);
	$fichier=str_replace(" and ", " & ",$fichier);
	$fichier=str_replace(" And ", " & ",$fichier);
	$pos_start=strrpos($fichier, "/");
	$pos_end=strlen($fichier);
	$fichier = substr($fichier, $pos_start+1, $pos_end);
	echo "<h3>".$fichier."</h3>";
	echo "</a></li>";
	$i=$i+1;
}
echo "</ul>";
?>


Le traitement du fichier à la rigueur ça importe peu, c'est juste pour voir que j'utilise l'ID de session.

Enfin bon, c'est juste ici, et nul part ailleurs que le problème ce pose.
Je possède l'ID 4, je clique sur la playlist avec l'ID 7 dans la base de données... et je me retrouve avec l'ID 7, du coup je ne suis plus sur mon compte, et si le compte avec l'ID 7 n'existe pas, je n'ai plus rien, ou sinon je me retrouve sur le compte d'un amis.

Si quelqu'un voit le problème, car là, je m'arrache les cheveux.

Merci d'avance.
Modifié par Kikimagik (20 Dec 2012 - 19:15)
Salut,

Au pif, l'erreur est trouve dans connect.php qui est inclut (inutilement?) à la troisième ligne.

Au passage beau problème de sécurité au niveau de la requête sql. Il faut transformer $_POST['id'] en nombre ou vérifier que c'est un nombre.
De plus, les fonctions mysql_* sont dépassées, maintenant c'est mysqli_*.
jo_link_noir a écrit :
Salut,

Au pif, l'erreur est trouve dans connect.php qui est inclut (inutilement?) à la troisième ligne.

Au passage beau problème de sécurité au niveau de la requête sql. Il faut transformer $_POST['id'] en nombre ou vérifier que c'est un nombre.
De plus, les fonctions mysql_* sont dépassées, maintenant c'est mysqli_*.


Merci d'avoir répondu.
Donc d'abord à propos du fichier de connexion, l'include se justifie par le fait que je dois l'appeler environ 25 fois dans mes scripts.
le voici (sans les identifiants Smiley cligne )
<?php
 //connexion à mysql
 $link=mysql_connect("mysql**-**.***","mabase","mon_mot_de_passe");
 if(!$link) {die("Impossible de se connecter à MySQL");}
 //connexion à la base de donnée
 mysql_select_db("mabase") or die("Impossible de se connecter à la base");
 //echange en UTF-8 
 mysql_query("SET NAMES 'utf8'");
 ?>


Ensuite j'ai remarqué comme tu le dis que mes $_POST ne sont pas vérifiés, et je vais le faire (merci de m'y faire penser), mais le problème ne viens pas de là.

Puis la fonction mysqli par rapport a mysql ne change pas grand chose, juste qu'elle est faite pour PHP5 et qu'elle possède plus de fonctionnalité, mais pourquoi pas Smiley cligne
Au pif, ta requête AJAX se fait vers le même site ?

monsite.com -> monsite.com
ou
monsite.com -> api.monsite.com
ou
monsite.com -> autresite.com
Modifié par Vaxilart (20 Dec 2012 - 20:50)
Kikimagik a écrit :
Puis la fonction mysqli par rapport a mysql ne change pas grand chose, juste qu'elle est faite pour PHP5 et qu'elle possède plus de fonctionnalité, mais pourquoi pas Smiley cligne

Ainsi qu'un pilote optimisé pour php (moins de copie mémoire), qu'elle n'est pas annoncer obsolète et supporte toutes les fonctionnalités de MySQL 5.1+ (entrent autres).
Choisir une API.
introduction (application PHP qui a besoin de s'interfacer avec une base de données MySQL).

Je pensé à tord que connect.php était pour ce connecter au site ^^'.
Essaye de mettre des echo pour voir quand l'id change.
Je ne pense pas que ce soit possible mais en changeant _POST['id'] par _POST['bidule'] ? J'ai pas d'idée en fait Smiley lol .