Incrémentation d'une variable

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 : Incrémentation d'une variable

par Tracker » 05 oct. 2007, 08:42

Il y a d'autres raisons encore, par exemple SQLServeur supporte les 'Compound Statement" dans les query, ex:

Code : Tout sélectionner

BEGIN delete from tlb1 select * from tlb2 END
Mysql pourrait également suivre le même chemin car c'est bien pratique.

par sadeq » 05 oct. 2007, 07:17

Celà dit, ce n'est qu'une question de temps, peut être dans les prochaines versions mysql_query() peut devenir transactionnelle et permettre le multi-requêtage. Et à ce moment là :tir2: bonjour les injections SQL par des GET non contrôlés.

par Tracker » 05 oct. 2007, 06:53

Non, on ne peut pas exécuter plusieurs requêtes dans un même mysql_query, voir la doc : mysql_query()
Je suis d'accord, mais quand on débute on n'est jamais un master en SQL, alors une fausse vérité permet, quelque fois, de comprendre le problème.

pour les injections:
http://www.ghostsinthestack.org/article ... s-sql.html

par ouckileou » 04 oct. 2007, 22:50

Juste, à quoi sert la protection de la chaîne?
parce qu'on peut exécuter plusieurs ordres sql dans un même query, par exemple:
mysql_query('select * from bidule; delete from bidule;');
Non, on ne peut pas exécuter plusieurs requêtes dans un même mysql_query, voir la doc : mysql_query()
mysql_query() envoie une seule requête (les requêtes multiples ne sont pas supportées) à la base de données courante sur le serveur associé avec le link_identifier spécifié.
Liste de paramètres

query

Une requête SQL

La chaîne de requête ne doit pas se terminer par un point-virgule.
Mais tu as quand même raison concernant la protection des données entrées par l'utilisateur, vu qu'il y a d'autres moyens de faire des trucs pas top, par exemple biaiser le résultat de la requête et accéder à des endroits sans avoir l'autorisation ;)


Enfin, Volkow, si ta question est résolue, pense à ajouter le tag [Résolu]
pour indiquer aux personnes qui voudront consulter ce sujet qu'il contient une solution.
Tu peux réaliser cette opération en cliquant sur le bouton Image en haut à gauche de ce sujet.

par Tracker » 04 oct. 2007, 22:23

Exactement, bon courage pour la suite.

par Volkow » 04 oct. 2007, 21:42

Ok merci mais juste, avec:

Code : Tout sélectionner

'".mysql_escape_string($bois)."'
Comment je fais l'incrémentation?

Comme ça:

Code : Tout sélectionner

SET bois=bois+'".mysql_escape_string($bois)."'
?????

par Tracker » 04 oct. 2007, 21:35

Quoi qu'il en soit, utilise systématiquement les quotes et la fonction mysql_escape_string(...) quand tu injectes une variable dans un ordre SQL.

Prends ça comme une règle :wink:

par Volkow » 04 oct. 2007, 21:29

Même si le formulaire est protégé par un autre formulaire de login?

En plus, j'ai du mal à tout comprendre!

C'est du complexe pour moi ça ^^!

:roll:

EDIT: je viens de comprendre!!!

En fait, vu que l'on peut enchaîner à la suite plusieurs requêtes, il suffit qu'il mette après la valeur du formulaire la deuxième requête qui supprimerait la table...

OooooKkkkk ^^!

J'ai capté, merci!

par Tracker » 04 oct. 2007, 21:21

Juste, à quoi sert la protection de la chaîne?
parce qu'on peut exécuter plusieurs ordres sql dans un même query, par exemple:
mysql_query('select * from bidule; delete from bidule;');
donc tu peux imaginer, comme le contenu de $bois vient du GET donc définie par le client, comment un hooligan pourrait détruire tous tes efforts:
mysql_query("UPDATE ressource_tbl SET bois=bois+$bois WHERE joueur='volkow'");
// --> que se passerait-il si:
// --> $bois = '0; delete from ressource_tbl; select * from ressource_tbl ';
Bon il devrait avoir de la chance, mais y'a des pervers :?
L'utilisation des quotes autour des paramètres et de mysql_escape_string t'affranchissent de ce genre d'inconvénients.

Bonne soirée.

par Volkow » 04 oct. 2007, 21:09

:shock:

Je crois que je vais arrêter la programmation, parce que vu l'erreur que j'ai faite...

^^

En plus ça fait 5 jours que j'essaye de trouver le problème, LOL!

Juste, à quoi sert la protection de la chaîne?

:oops:

Merci pour ton aide précieuse!!

:wink:

par Tracker » 04 oct. 2007, 21:00

C'est ce qu'il me semblais, l'update pour fonctionner, il faut l'exécuter ;)
<?php
// ...
$bois = $_POST['bois'];

// ...
$req2 = "UPDATE ressource_tbl SET bois=bois+$bois WHERE joueur='volkow'";
mysql_query($req2); <----------

?>
tu devrais protéger la chaine sql en écrivant plutot:
$req2 = "UPDATE ressource_tbl SET bois='".mysql_escape_string($bois)."' WHERE joueur='volkow'";
N'hésite pas si tu as un pb...

par Volkow » 04 oct. 2007, 20:52

Bien sûr, le voilà:
<?php
// variable reçu par post
$bois = $_POST['bois'];

// on se connecte à MySQL
$db = mysql_connect('localhost', 'root', 'pass');

// on sélectionne la base
mysql_select_db('vkxrpg',$db);

// on crée la requête SQL
$sql = 'SELECT bois FROM ressource_tbl WHERE joueur="volkow"';

// on envoie la requête
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());

// on fait une boucle qui va faire un tour pour chaque enregistrement
while($data = mysql_fetch_array($req))
    {
    // on affiche les informations de l'enregistrement en cours
    echo $data['bois'];
    }

$req2 = "UPDATE ressource_tbl SET bois=bois+$bois WHERE joueur='volkow'";



// on ferme la connexion à mysql
mysql_close();
?>

par Tracker » 04 oct. 2007, 20:39

Peux-tu envoyer le code de la page qui gère l'update ?

Incrémentation d'une variable

par Volkow » 04 oct. 2007, 19:27

Bonsoir à tous et à toutes,

Ce soir je viens vous embêter avec un de mes petits problèmes ^^.

En fait, j'ai un formulaire qui envoit une valeur numérique en POST (ex.: 1000) à un script PHP qui doit se connecter à ma base de données, sélectionner un champs, récupérer la valeur de se champs et y ajouter la valeur envoyé dans le formulaire...

Seul problème, je sais comment incrémenter le champs de ma table avec une valeur numérique directe (qui ne provient pas d'une variable), comme ci-dessous:
$req2 = "UPDATE ressource_tbl SET bois=bois+1000 WHERE joueur='volkow'";
MAIS je ne sais pas comment faire pour l'incrémenter selon la valeur de la variable que j'ai reçu par POST...

Voilà ce que j'ai essayé (et qui ne marche pas, vous vous en doutez...^^):
$req2 = "UPDATE ressource_tbl SET bois=bois+$variablepost WHERE joueur='volkow'";
Selon vous, comment puis-je faire?

En vous remerciant, Volkow.