modification d'un script: trop dur pour moi...

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : modification d'un script: trop dur pour moi...

Re: modification d'un script: trop dur pour moi...

par juliette » 04 nov. 2011, 20:10

c'est bon, j'ai résolu le problème, j'avais 2 php init et a force de test, les 2 n’était plus identique, désormais il y en a un seul pour tout le site...
je reprend mes recherches mais est ce que quelqu'un peut il me dir si je dois plutôt chercher du cote du dernier JS que j'ai mis ?

Re: modification d'un script: trop dur pour moi...

par juliette » 04 nov. 2011, 17:30

est ce qu'un print_r:
<?php print_r($_SESSION); ?>
doit affiché ca: Array ( [username] => juliette [userid] => userid ), j'ai l'impression que le 2eme userid devrait être un chiffre ?

et ces 2 print_r:
 <?php print_r($_SESSION['$userid']); ?>
 <?php print_r($_SESSION['$id']); ?>
donne: Notice: Undefined index:
et ca c'est pas dans un script du vote mais bien sur une page du site ou la session est active...

Re: modification d'un script: trop dur pour moi...

par juliette » 04 nov. 2011, 12:28

je commence a penser que je ne suis pas sur la bonne route, il y a us fichier js:
var xmlhttp
	/*@cc_on @*/
	/*@if (@_jscript_version >= 5)
	  try {
	  xmlhttp=new ActiveXObject("Msxml2.XMLHTTP")
	 } catch (e) {
	  try {
	    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP")
	  } catch (E) {
	   xmlhttp=false
	  }
	 }
	@else
	 xmlhttp=false
	@end @*/
	if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
	 try {
	  xmlhttp = new XMLHttpRequest();
	 } catch (e) {
	  xmlhttp=false
	 }
	}
	function myXMLHttpRequest() {
	  var xmlhttplocal;
	  try {
	    xmlhttplocal= new ActiveXObject("Msxml2.XMLHTTP")
	 } catch (e) {
	  try {
	    xmlhttplocal= new ActiveXObject("Microsoft.XMLHTTP")
	  } catch (E) {
	    xmlhttplocal=false;
	  }
	 }

	if (!xmlhttplocal && typeof XMLHttpRequest!='undefined') {
	 try {
	  var xmlhttplocal = new XMLHttpRequest();
	 } catch (e) {
	  var xmlhttplocal=false;
	  alert('couldn\'t create xmlhttp object');
	 }
	}
	return(xmlhttplocal);
}

function sndReq(vote,id_num,ip_num,units) {
	var theUL = document.getElementById('unit_ul'+id_num); // the UL
	
	// switch UL with a loading div
	theUL.innerHTML = '<div class="loading"></div>';
	
    xmlhttp.open('get', 'rpc.php?j='+vote+'&q='+id_num+'&t='+ip_num+'&c='+units);
    xmlhttp.onreadystatechange = handleResponse;
    xmlhttp.send(null);	
}

function handleResponse() {
  if(xmlhttp.readyState == 4){
		if (xmlhttp.status == 200){
       	
        var response = xmlhttp.responseText;
        var update = new Array();

        if(response.indexOf('|') != -1) {
            update = response.split('|');
            changeText(update[0], update[1]);
        }
		}
    }
}

function changeText( div2show, text ) {
    // Detect Browser
    var IE = (document.all) ? 1 : 0;
    var DOM = 0; 
    if (parseInt(navigator.appVersion) >=5) {DOM=1};

    // Grab the content from the requested "div" and show it in the "container"
    if (DOM) {
        var viewer = document.getElementById(div2show);
        viewer.innerHTML = text;
    }  else if(IE) {
        document.all[div2show].innerHTML = text;
    }
}

/* =============================================================== */
var ratingAction = {
		'a.rater' : function(element){
			element.onclick = function(){

			var parameterString = this.href.replace(/.*\?(.*)/, "$1"); // onclick="sndReq('j=1&q=2&t=127.0.0.1&c=5');
			var parameterTokens = parameterString.split("&"); // onclick="sndReq('j=1,q=2,t=127.0.0.1,c=5');
			var parameterList = new Array();

			for (j = 0; j < parameterTokens.length; j++) {
				var parameterName = parameterTokens[j].replace(/(.*)=.*/, "$1"); // j
				var parameterValue = parameterTokens[j].replace(/.*=(.*)/, "$1"); // 1
				parameterList[parameterName] = parameterValue;
			}
			var theratingID = parameterList['q'];
			var theVote = parameterList['j'];
			var theuserIP = parameterList['t'];
			var theunits = parameterList['c'];
			
			//for testing	alert('sndReq('+theVote+','+theratingID+','+theuserIP+','+theunits+')'); return false;
			sndReq(theVote,theratingID,theuserIP,theunits); return false;		
			}
		}
		
	};
Behaviour.register(ratingAction);
est il possible que ce soit ce script a modifier pour récupérer ce fameux id de session ?

Re: modification d'un script: trop dur pour moi...

par juliette » 04 nov. 2011, 04:11

si je ne touche pas a l'ip, ca ca devrait fonctionner normalement ???
	        $user = $_SESSION['userid'];
		$req = "INSERT INTO $rating_dbname.$rating_tableName_2 (id_question, id, id_chien, note, signup_date) VALUES (".$question.",".$user.",".$chien.",".$vote_sent.",".time().")";
		$result = mysql_query($req);

Re: modification d'un script: trop dur pour moi...

par juliette » 03 nov. 2011, 19:22

en fait, je dit une bêtise, ce n'est pas remplacer l'ip que je veux mais bien récupérer l'id de session pour mettre dans le INSERT car cet id n'est pas pour la table qui contient l'ip, je crois que c'est pour ca que ca ne marche pas ???

maintenant ca marche comme ca:
		$req = "INSERT INTO $rating_dbname.$rating_tableName_2 (id_question, id, id_chien, note, signup_date) VALUES (".$question.",'1',".$chien.",".$vote_sent.",".time().")";
		$result = mysql_query($req);
mais je n'i arrive pas avec cet id de session (id), il doit quand même bien être possible de le passer sans trop de complication, non ?

Re: modification d'un script: trop dur pour moi...

par juliette » 03 nov. 2011, 19:21

Désolé, je reviens si tard a cause de petits soucis...

le script dont on parle ne sert qu'a créer les tables si elle n'existe pas quand la page est affiché pour la 1er fois dons le champs IP est créer mais pas remplis... il y a un autre script qui lui, compare les ips a la génération pour savoir si le système de vote est activé ou pas pour le visiteur en cour...

Re: modification d'un script: trop dur pour moi...

par xTG » 28 oct. 2011, 11:36

A ce niveau si tu n'exploites pas les IPs tu n'as pas besoin de déclarer ta base de données à la CNIL.
Donc une utilisation des IPs uniquement pour faire de l'anti-spam est possible sans déclaration. C'est du même acabit que de créer un cookie "a déjà voté" en gros.

Re: modification d'un script: trop dur pour moi...

par moogli » 28 oct. 2011, 10:27

ce que je veux dire c'est qu'il n'y a aucune comparaison de l'ip actuelle avec les ip dans la table, donc cette info inutile, on a juste une relation le vote et l'ip (et encore pas entre la note et l'ip ^^).

Donc pour moi cette info est inutile dans le sens où elle n'est pas exploitée (par exemple anti spam etc etc).

je me demande d'ailleurs s'il y a un pas truc avec la chose "informatique & libertés" (ou chose du genre, cnil etc) et le log des ip des visteurs.

enfin bref sur ce bout la je ne vois pas l'intérêt de la chose c'est tout :)

@+

Re: modification d'un script: trop dur pour moi...

par juliette » 28 oct. 2011, 01:43


bon par contre je ne comprend pas c'est que ces ip ne soit pas utilisées ^^

@+
que veux tu dire, que moi je ne les utilise pas ou que le script ne les utilises pas ?
parce que le script les utilise, c'est sur car elle s'enregistre dans la bdd

Re: modification d'un script: trop dur pour moi...

par moogli » 27 oct. 2011, 22:59

on parle bien du même, je pense que tu n'a pas shunté l'ipnum

je m'explique
j'ai réduit le code à l'essentiel de mon explication, c'est normal mais, bien sur, il ne faut supprimer les lignes manquantes c'est juste pour permettre simplement l'explication
<?php
$ip_num = preg_replace("/[^0-9\.]/","",$_REQUEST['t']);
$ip = $_SESSION['userid'];

//connexion
$query = mysql_query("SELECT id_question, id_chien, total_votes, total_value, used_ips FROM $rating_dbname.$rating_tableName WHERE id='$id_sent' ")or die(" Error: ".mysql_error());
$numbers = mysql_fetch_assoc($query);
$checkIP = unserialize($numbers['used_ips']);

// si c'est la table existe deja a déjà on ajoute les valeurs valeur
((is_array($checkIP)) ? array_push($checkIP,$ip_num) : $checkIP=array($ip_num));
$insertip=serialize($checkIP);

         if (($vote_sent >= 1 && $vote_sent <= $units) && ($ip == $ip_num)) { /
?>
la première ligne prend un variable provenant de get/post ou cookie (on ne sais pas voir la doc pour plus d'info ;)), cette variable (t) est 'nettoyée' de tous ce qui n'est pas un chiffre ou un point (parce qu'une ip c'est que des chiffres et des points ex 192.168.1.2) donc tous ce qui n'est ni l'un l'autre est supprimé.
ensuite on affect la valeur du userid de la session à la variable $ip.
requete sql pour récupérer les infos de la tables.
arrive un truc un peu spécial $checkIP = unserialize($numbers['used_ips']); => qu'est ce que c'est que bazar ?

pour expliquer ce qu'est la serialisation je te renvoie a la doc des fonctions utilisée ici http://fr2.php.net/serialize

mais pour faire simple c'est le fait de transformer tout objet / tableau / variable en unse chaine de caractère qui pourra être réutiliser pour le reconstruire

ici on prend la table checkIP on le serialise, on le met dans la table.
Après on fait l'inverse et l'on a directement un tableau utilisable dans la variable checkIP.

((is_array($checkIP)) ? array_push($checkIP,$ip_num) : $checkIP=array($ip_num));
ça c'est un test qui permet de soit créer le tableau avec l'ip actuel soit ajouter l'ip actuel dans le tableau. Utilise pour différencier le cas 1er vote des autres (au 1ere vote y a pas de tableau donc il faut initialiser la chose ;) )).

ça c'est pour le stockage

après viens : ($ip == $ip_num)) et la c'est le drame :)

cette égalité ne peu être vérifiée car un id (entier) est comparée à un chaine de caractère (aucun n'entier ne peux être égale à 192.168.1.12 , par exemple :))

la il faut que tu enlève complètement cette condition qui n'a donc plus lieux d'être :)

bon par contre je ne comprend pas c'est que ces ip ne soit pas utilisées ^^

@+

Re: modification d'un script: trop dur pour moi...

par juliette » 27 oct. 2011, 18:41

regarde, c 'est dans ce script, plus bas, j'ai un UPDATE, il fonctionne et juste apres j'ai un INSERT qui fonctionne aussi mais des que je met: $ip = $_SESSION['userid']; comme tu peux le voir, ca ne marche plus...
<?php
header("Cache-Control: no-cache");
header("Pragma: nocache");

require('_config-rating.php'); 

//création des valeur
$vote_sent = preg_replace("/[^0-9]/","",$_REQUEST['j']);
$id_sent = preg_replace("/[^0-9a-zA-Z-]/","",$_REQUEST['q']);
$ip_num = preg_replace("/[^0-9\.]/","",$_REQUEST['t']);
$units = preg_replace("/[^0-9]/","",$_REQUEST['c']);
$ip = $_SESSION['userid'];

// suprimer le script parce que les utilisateurs normaux ne le verront jamais.
if ($vote_sent > $units) die("Désolé, le vote a l'air d'être sans fondement."); 


//connexion
$query = mysql_query("SELECT id_question, id_chien, total_votes, total_value, used_ips FROM $rating_dbname.$rating_tableName WHERE id='$id_sent' ")or die(" Error: ".mysql_error());
$numbers = mysql_fetch_assoc($query);
$checkIP = unserialize($numbers['used_ips']);
$count = $numbers['total_votes']; //votes total
$current_rating = $numbers['total_value']; //valeur calculées
$sum = $vote_sent+$current_rating; // ajoure la nouvelle valeur
$tense = ($count==1) ? "vote" : "votes"; //plural form votes/vote
$question = $numbers['id_question'];
$chien = $numbers['id_chien'];


// contrôle pour voir si le premier vote a été compté 
// ou augmentation du nombre actuel de votes
($sum==0 ? $added=0 : $added=$count+1);

// si c'est la table existe deja a déjà on ajoute les valeurs valeur
((is_array($checkIP)) ? array_push($checkIP,$ip_num) : $checkIP=array($ip_num));
$insertip=serialize($checkIP);

//recherche ip sur les votes
$voted=mysql_num_rows(mysql_query("SELECT used_ips FROM $rating_dbname.$rating_tableName WHERE used_ips LIKE '%".$ip."%' AND id='".$id_sent."' "));
if(!$voted) {     //if the user hasn't yet voted, then vote normally...

	if (($vote_sent >= 1 && $vote_sent <= $units) && ($ip == $ip_num)) { // verification adresse ip
		$update = "UPDATE $rating_dbname.$rating_tableName SET total_votes='".$added."', total_value='".$sum."', used_ips='".$insertip."' WHERE id='$id_sent'";
		$result = mysql_query($update);	

		
		$req = "INSERT INTO $rating_dbname.$rating_tableName_2 (id_question, id, id_chien, note, signup_date) VALUES (".$question.",'1',".$chien.",".$vote_sent.",".time().")";
		$result = mysql_query($req);		

			
	} 
}
// mise a jour de l'affichage des valeurs
$newtotals = mysql_query("SELECT total_votes, total_value, used_ips FROM $rating_dbname.$rating_tableName WHERE id='$id_sent' ")or die(" Error: ".mysql_error());
$numbers = mysql_fetch_assoc($newtotals);
$count = $numbers['total_votes'];//total des votes
$current_rating = $numbers['total_value'];//valeur calculées
$tense = ($count==1) ? "vote" : "votes"; 

// $new_back est ce qui est affiché sur la page après un vote de 'AJAX/Javascript' réussi

$new_back = array();

$new_back[] .= '<ul class="unit-rating" style="width:'.$units*$rating_unitwidth.'px;">';
$new_back[] .= '<li class="current-rating" style="width:'.@number_format($current_rating/$count,2)*$rating_unitwidth.'px;">Current rating.</li>';
$new_back[] .= '<li class="r1-unit">1</li>';
$new_back[] .= '<li class="r2-unit">2</li>';
$new_back[] .= '<li class="r3-unit">3</li>';
$new_back[] .= '<li class="r4-unit">4</li>';
$new_back[] .= '<li class="r5-unit">5</li>';
$new_back[] .= '<li class="r6-unit">6</li>';
$new_back[] .= '<li class="r7-unit">7</li>';
$new_back[] .= '<li class="r8-unit">8</li>';
$new_back[] .= '<li class="r9-unit">9</li>';
$new_back[] .= '<li class="r10-unit">10</li>';
$new_back[] .= '</ul>';
$new_back[] .= '<p class="voted">'.$id_sent.'. Moyenne: <strong><font color="red">'.@number_format($sum/$added,1).'</font></strong>/'.$units.' ('.$count.' '.$tense.') ';
$new_back[] .= '<span class="thanks"><strong>Merci !</strong</span></p>';

$allnewback = join("\n", $new_back);

// ========================

//name of the div id to be updated | the html that needs to be changed
$output = "unit_long$id_sent|$allnewback";
echo $output;
?>
toi, tu me parle bien de ce code ?

Re: modification d'un script: trop dur pour moi...

par juliette » 27 oct. 2011, 18:38


Par contre dans le système d'origine cette donnée n'a pas vraiment d'utilité puisse que dans ce champs il y a un tableau "sérialisé" qui contient les ip utilisée, ceci afin d'éviter un spam sur les votes. pour simuler cela il te faudrais mettre le userid, c'est tout a fait réalisable il te suffit à la ligne $ip = $_SERVER['REMOTE_ADDR']; remplacer $_SERVER['REMOTE_ADDR'] par $_SESSION['userid']. ceci dans le 1er code fournis.

bon après je ne sais pas ce qu'il y a dans $ip_num = preg_replace("/[^0-9\.]/","",$_REQUEST['t']); donc au pire tu peux virer le test && ($ip == $ip_num) avant l'update et le remplacer par un test pour savoir si l'id du votant est déja dans le tableaux $checkIP (avec simplement isset)).

ce serait plus mieux :)

ça devrait aller ?

@+
désolé mais je ne comprend pas #-o

Re: modification d'un script: trop dur pour moi...

par moogli » 27 oct. 2011, 16:22

ok

au vu de ton code tu doit utiliser $_SESSION['userid']

par contre j'en profite pour te dire que tu ne devrais pas mettre le mot de passe dans le cookie (même haché avec sha1).
à la limite utilise un hash qui fait référence à l'utilisateur dans la table couplé avec autre chose (par exemple le user-agent) me semble un peu mieux, même si le user-agent n'est pas fiable. La pour le coup je ne sais pas trop ce qui est le mieux.

donc remplacer l'ip par le userid est simple.
dans la fonction rating_bar l'ip est récupérée ainsi : $ip = $_SERVER['REMOTE_ADDR'];
dans la requete d'insertion cette adresse et figé vide
INSERT INTO $rating_dbname.$rating_tableName (`id`,`id_chien`,`id_question`,`total_votes`, `total_value`, `used_ips`) VALUES ('$id','$chien','$question', '0', '0', ''");

donc remplace ce vide par $_SESSION['userid'];

Par contre dans le système d'origine cette donnée n'a pas vraiment d'utilité puisse que dans ce champs il y a un tableau "sérialisé" qui contient les ip utilisée, ceci afin d'éviter un spam sur les votes. pour simuler cela il te faudrais mettre le userid, c'est tout a fait réalisable il te suffit à la ligne $ip = $_SERVER['REMOTE_ADDR']; remplacer $_SERVER['REMOTE_ADDR'] par $_SESSION['userid']. ceci dans le 1er code fournis.

bon après je ne sais pas ce qu'il y a dans $ip_num = preg_replace("/[^0-9\.]/","",$_REQUEST['t']); donc au pire tu peux virer le test && ($ip == $ip_num) avant l'update et le remplacer par un test pour savoir si l'id du votant est déja dans le tableaux $checkIP (avec simplement isset)).

ce serait plus mieux :)

ça devrait aller ?

@+

Re: modification d'un script: trop dur pour moi...

par juliette » 27 oct. 2011, 15:03

je garde les 2 tables, une qui UPDATE et calcul la moyenne et une qui enregistre vote par vote et dans les 2 je veux changer l'adresse IP en ID_votant qui est la session

la 1er affiche des résultats avec ajax, la je ne touche pas mais plus bas, j'affiche les votes des parents du chien en cours et la j'utilise la 2 eme table pour affiché les votes, celle de 1 vote par ligne et ainsi de suite pour les grands parents...

Re: modification d'un script: trop dur pour moi...

par juliette » 27 oct. 2011, 14:48

voila mon fichier ini.php pour les sessions
<?php
//Cette page permet d'initialiser le site en verifiant par exemple si le membre est connecté
session_start();
header('Content-type: text/html;charset=UTF-8');
if(!isset($_SESSION['username']) and isset($_COOKIE['username'], $_COOKIE['password']))
{
	$cnn = mysql_query('select password,id from users where username="'.mysql_real_escape_string($_COOKIE['username']).'"');
	$dn_cnn = mysql_fetch_array($cnn);
	if(sha1($dn_cnn['password'])==$_COOKIE['password'] and mysql_num_rows($cnn)>0)
	{
		$_SESSION['username'] = $_COOKIE['username'];
		$_SESSION['userid'] = $dn_cnn['id'];
	}
}
?>