• 05 Juin 2026, 13:03:38


Auteur Sujet: Topic Gilux [Actuel : Guillemets MySQL]  (Lu 7005 fois)

0 Membres et 1 Invité sur ce sujet

Hors ligne cristab

  • *
  • Messages: 8379
    • Voir le profil
Re : Topic Gilux [Actuel : Guillemets MySQL]
« Réponse #30 le: 28 Juin 2011, 22:08:44 »
je ne me serais pas tracasser de le sorte un simple strreplace("'","_@",text); est la meme chose dans l'autre sens
pas d'aide en PM, vous êtes sur un forum est il me semble que vous êtes la pour avoir de l'aide donc pourquoi MP une seul personne qui ne vous répondra pas alors qu'il y a plein de membre ici

Hors ligne Gilux

  • *
  • Mafioso
  • GOOBY PLS
  • Messages: 2209
    • Voir le profil
Re : Topic Gilux [Actuel : Guillemets MySQL]
« Réponse #31 le: 28 Juin 2011, 22:21:15 »
Merci :P

Donc mon idée, c'est de regarder le contenu du texte envoyé caractère par caractère, comme ceci :

<?php

for(new i<= sizeof(text); i  )
{
     if(
text[i] == """) // Si c'est un double guillemet.
     {          
          for(new x = i; x <= sizeof(text); x  ) // On va décaler chaque caractère suivant le guillemet d'un rang.
          {
               text[x] = text[x 1];
          }
          text[i] == ""; // A l'emplacement du guillemet, on met un backslash.
      }
}
               
Techniquement, c'est censé marcher... Je vais tester ça x)

EDIT : Chaud, j'ai réussi à me XSS tout seul xD (Marquer "<script>alert('Owned !');</script>" dans le chat :P)
« Modifié: 28 Juin 2011, 23:10:20 par Gilux »

Hors ligne Jeremty

  • *
  • Nouveau
  • Messages: 4
    • Voir le profil
    • Jeremy-website
Re : Topic Gilux [Actuel : Guillemets MySQL]
« Réponse #32 le: 28 Juin 2011, 22:35:50 »
Hihi ;) Heureusement il y a un "White Hat" pour te dire les hacks qui peut y avoir hein Mwihihi :3 . A ton service ;)
Cordialement, Jeremty ;)
Mon site web: www.jeremy-website.fr
Mes cover: www.youtube.com/user/TheEndlessWord

Hors ligne Gilux

  • *
  • Mafioso
  • GOOBY PLS
  • Messages: 2209
    • Voir le profil
Re : Topic Gilux [Actuel : Guillemets MySQL]
« Réponse #33 le: 28 Juin 2011, 22:43:05 »
Ouais, merci  :D

Petite mise à jour du code, je passe par une variable text2 qui m'empêche d'avoir des limitations (Au cas où quelqu'un aurait l'idée de flooder des " )

<?php

public OnPlayerText(playeridtext[])
{
new text2[200];
format(text2,sizeof(text2),"%s",text);
new query[300];
new name[20];
GetPlayerName(playerid,name,20);
for(new i<= sizeof(text2); i++)
{
    
     if(text2[i] == "\""// Ligne 83
     
     {
           for(new i<= sizeof(text2); x++)
           {
       text2[x] = text2[x+1];
          }
    text2[i] = "\\"// Ligne 89
     }
 
}
format(query,sizeof(query),"INSERT INTO `chat` (Message, pseudo) VALUES (\"%s\", \"%s\")",text,name);
        
mysql_query(query,connection);
return 1;
}

J'ai toujours 2 erreurs "Array must be indexed (Variable "-unknown-")" à la ligne 83 et 89. Je ne comprend pas pourquoi... L'assignation est pourtant correcte ?  ;D

EDIT : Nan mais j'te jure... Mettre "==" au lieu de "=" pour assigner une variable... ><

Ca devrait être bon maintenant, je teste :P
« Modifié: 28 Juin 2011, 22:50:03 par Gilux »

Hors ligne Jeremty

  • *
  • Nouveau
  • Messages: 4
    • Voir le profil
    • Jeremy-website
Re : Topic Gilux [Actuel : Guillemets MySQL]
« Réponse #34 le: 28 Juin 2011, 22:55:41 »
à mon avis, pour ton erreur de base de donnée qui ne s'écrit pas, comme tu me l'as dit via msn, c'est ici :

{
         if(text2[i] == "\"") // Ligne 83
           {
           for(new x = i; x <= sizeof(text2); x++)
           {
      text2[x] = text2[x+1];
         }
    text2[i] = "\\"; // Ligne 89
     }
  }

Mais... je pense que tu devrais essayer ceci :

           for(new x = 0; x <= sizeof(text2); x++)
           {
                       if(text2[x] == "\"")
                        {
             text2[x] = "\\";
                        }
  }
« Modifié: 28 Juin 2011, 23:08:19 par Jeremty »
Cordialement, Jeremty ;)
Mon site web: www.jeremy-website.fr
Mes cover: www.youtube.com/user/TheEndlessWord

Hors ligne Gilux

  • *
  • Mafioso
  • GOOBY PLS
  • Messages: 2209
    • Voir le profil
Re : Topic Gilux [Actuel : Guillemets MySQL]
« Réponse #35 le: 28 Juin 2011, 23:07:23 »
Non, le problème ne vient pas de là ^^

<?php

public OnPlayerText(playeridtext[])
{
new text2[200];

new query[300];
new name[20];
GetPlayerName(playerid,name,20);
format(text2,sizeof(text2),"%s",text);
printf("--------------CHAT : %s --------------",text2);
for(new i<= sizeof(text2); i++)
{
    
if(text2[i] == "\""// Si c'est un double guillemet. Ligne 85.
     
{
        for(new i<= sizeof(text2); x++)
        {
       text2[x] = text2[x+1];
       }
    text2[i] = "\\"// On remplace. Ligne 91.
}
 
}
 
printf("------------CHAT2 : %s---------------",text2);
 

format(query,sizeof(query),"INSERT INTO `chat` (Message, pseudo) VALUES (\"%s\", \"%s\")",text2,name);
    
mysql_query(query,connection);
return 1;
}


J'ai tenté de localiser le bug, le printf avec CHAT2 : %s ne s'affiche pas. Ca vient donc durant la modification.

Erreurs :
Citer
mysqltest.pwn(85) : error 033: array must be indexed (variable "-unknown-")
mysqltest.pwn(91) : error 006: must be assigned to an array
mysqltest.pwn(91) : error 029: invalid expression, assumed zero
mysqltest.pwn(91) : error 017: undefined symbol "remplace"
mysqltest.pwn(91) : fatal error 107: too many error messages on one line


En tout cas, j'abandonne pour ce soir, j'en ai marre xD
++
« Modifié: 28 Juin 2011, 23:09:38 par Gilux »

Hors ligne Jeremty

  • *
  • Nouveau
  • Messages: 4
    • Voir le profil
    • Jeremy-website
Re : Topic Gilux [Actuel : Guillemets MySQL]
« Réponse #36 le: 28 Juin 2011, 23:11:45 »
Enfin.. Si je reprends tout ton code, je ferai plutôt :

public OnPlayerText(playerid, text[])
{
new text2[200];

new query[300];
new name[20];
GetPlayerName(playerid,name,20);

        text2 = text;

        for(new x = 0; x <= sizeof(text2); x++)
        {
                      if(text2[x] == "\"")
                      {
                            text2[x] = "\\";
                      }
      }
 
format(query,sizeof(query),"INSERT INTO `chat` (Message, pseudo) VALUES (\"%s\", \"%s\")",text2,name);
    mysql_query(query,connection);
return 1;
}
Cordialement, Jeremty ;)
Mon site web: www.jeremy-website.fr
Mes cover: www.youtube.com/user/TheEndlessWord

Hors ligne S!m

  • *
  • Messages: 2341
    • Voir le profil
Re : Topic Gilux [Actuel : Guillemets MySQL]
« Réponse #37 le: 29 Juin 2011, 04:09:08 »
Salut,

simple précision: \" est un seul caractère, différent de " mais non pas 2 caractères. (faudrait vérifier dans ce cas.... sinon je donne la solution à la fin...)

Un peu comme l'on peut écrire \0 au lieu de 0...

En gros, tu pourrais simplement faire:

ReplaceChar(text[], char1, char2)
{
    new i = 0;
    while(text[i])//tant qu'on n'atteint pas la fin du texte
    {
        if(text[i] = char1)
            text[i] = char2;

        i++;
    }
}

Puis dans ton OnPlayerText:

public OnPlayerText(playerid, text[])
{
new text2[128];//la bonne taille hein^^

new query[300];
new name[MAX_PLAYER_NAME];//UTILISE LES CONSTANTES!!!!
GetPlayerName(playerid, name, sizeof(name));

        //text2 = text; -> à noter que ce n'est pas valide....
format(text2, sizeof(text2), "%s", text);

ReplaceChar(text2, '"', '\"');
 
format(query,sizeof(query),"INSERT INTO `chat` (Message, pseudo) VALUES (\"%s\", \"%s\")",text2,name);
    mysql_query(query,connection);
return 1;
}

Il faut vérifier que ça peut fonctionner ainsi, sinon il faut simplement modifier légèrement la fonction pour ReplaceSubString:

ReplaceSubString(text[], sujet[], remplacement[], bool:ignorecase = false)
{
new tmpText[256];//malheureux, mais pour la taille faudra jouer...
new opos = 0, npos = 0;
new sujet_len = strlen(sujet);
new tmp = 0;
new i = strfind(text, sujet, ignorecase);

while(i >= 0 && text[i])
{
tmp = strcpy(text[opos], tmpText[npos], i - opos);

opos += tmp;
npos += tmp;

tmp = strcpy(tmpText[npos], remplacement);

npos += tmp;

/*      tmp = 0;

while(opos < i)
{
tmpText[npos] = text[opos];
opos++;
npos++;
}

while(sub2[tmp])
{
tmpText[npos] = remplacement[tmp];
npos++;
tmp++;
}*/

opos += sujet_len;//on continue à chercher après le sujet trouvé...

i = strfind(text, sujet, ignorecase, opos);//recherche du sujet
}

format(text, sizeof(tmpText), tmpText);//on recopie le texte...
}

strcpy(source[], dest[], len = -1)//ptet trouver mieux comme valeur par défaut...genre 4096
{
new i = 0;

if(len == -1)
   len = strlen(source);
   
while((source[i] = dest[i]) && i < len)
   i++;
   
return i;
}

si vous ne voulez pas utiliser le strcpy ajouté, vous pouvez utiliser la partie en commentaire au lieu de la première partie de la boucle.

Il faut bien sur s'assurer que la chaine de caractère passée en paramètre est suffisamment longue ainsi que celle temporaire dans la fonction...
À noter que l'on pourrait inverser pour travailler sur la chaine passée en paramètre plutôt que la temporaire...

++Sim++
« Modifié: 29 Juin 2011, 21:27:50 par Sim »





Hors ligne Xartrick

  • *
  • C & Pawn Programmer
  • Messages: 1391
    • Voir le profil
    • Xartrick's Area
Re : Topic Gilux [Actuel : Guillemets MySQL]
« Réponse #38 le: 29 Juin 2011, 07:04:43 »
Et je ne pense pas qu'utiliser sizeof soit la meilleur des solutions, cela retourne la taille du tableau, mais pas la longueur de la chaîne de caractère !

Hors ligne S!m

  • *
  • Messages: 2341
    • Voir le profil
Re : Topic Gilux [Actuel : Guillemets MySQL]
« Réponse #39 le: 29 Juin 2011, 21:29:13 »
Salut,

comme il s'agit de format, je suis presque certains que la fonction arrête dès la fin de la chaine de toute façon.
On peut toujours vérifier avec des test de vitesse d'exécution mais je n'ai pas vraiment envie de le faire...

++Sim++





Hors ligne Syg

  • Expert programmeur C/C++/PAWN
  • *
  • The GTAOnline Jesus
  • Messages: 3908
    • Voir le profil
Re : Topic Gilux [Actuel : Guillemets MySQL]
« Réponse #40 le: 30 Juin 2011, 10:26:03 »
Ta solution ne fonctionne pas Sim, tu remplace les guillemets (") par le caractère d'échappement \" ce qui n'a aucun effet lors de l'exécution.
#include <a_samp>

main ()
{
}

public OnGameModeInit ()
{
new MaChaine[128] = "Bonjour, voici une chaine avec des \"guillemets\"";

printf ("Avant modif : <%s>", MaChaine);
new i = 0;
while (MaChaine[i] != 0)
{
if (MaChaine[i] == '"') {printf ("Trouve"); MaChaine[i] = '\"';}
i++;
}
printf ("Apres modif : <%s>", MaChaine);

return 1;
}
Résultat :
[09:52:35] Avant modif : <Bonjour, voici une chaine avec des "guillemets">
[09:52:35] Trouve
[09:52:35] Trouve
[09:52:35] Apres modif : <Bonjour, voici une chaine avec des "guillemets">

C'est la même chaîne !

Dans le cas qui nous occupe, ce qui gène c'est pas présence de " au milieu d'une requête SQL.
SQL est permissif et permet d'utiliser indifféremment des guillemet (") ou des apostrophes (').
Malheureusement, il n'y a pas de solution miracle dans le cas où c'est l'utilisateur qui saisi la chaîne car il peut saisir à la fois des guillemets et des apostrophes.
Dans ton cas, tu peux remplacer tous les guillemets (") par des apostrophes (') dans la chaîne saisie par l'utilisateur et encadrer tes chaînes par des guillemets dans ta requête SQL.

++
Syg
Courtesy of GtaManiac

Hors ligne S!m

  • *
  • Messages: 2341
    • Voir le profil
Re : Topic Gilux [Actuel : Guillemets MySQL]
« Réponse #41 le: 30 Juin 2011, 23:43:27 »
Salut,

dans ce cas, on peut utiliser la deuxième fonction que j'ai codé (ou l'équivalent, comme c'est codé sur le forum, peut contenir des erreurs) pour faire le remplacement.
Il suffirait de faire:

ReplaceSubString(text, "\"", "_01");
ReplaceSubString(text, "\'", "_02");

Avant la requête et l'inverse quand on récupère les infos depuis le serveur MySQL.

++Sim++





Hors ligne cristab

  • *
  • Messages: 8379
    • Voir le profil
Re : Re : Topic Gilux [Actuel : Guillemets MySQL]
« Réponse #42 le: 30 Juin 2011, 23:45:48 »
je ne me serais pas tracasser de le sorte un simple strreplace("'","_@",text); est la meme chose dans l'autre sens
sa reprend ce que je disais ^^
pas d'aide en PM, vous êtes sur un forum est il me semble que vous êtes la pour avoir de l'aide donc pourquoi MP une seul personne qui ne vous répondra pas alors qu'il y a plein de membre ici

Hors ligne Ssk

  • *
  • Lulu's Stunt - Le serveur stunt de Lulu !
  • Messages: 8154
    • Voir le profil
Re : Topic Gilux [Actuel : Guillemets MySQL]
« Réponse #43 le: 01 Juillet 2011, 12:37:52 »
Il ne faudrait pas remplacer '"' par "\"" ? et non pas '"' par '\"' qui revient à la même chose ?



Derrière tout programme se cache un programmeur, je considère le monde comme un programme.
Mon blog

Hors ligne cristab

  • *
  • Messages: 8379
    • Voir le profil
Re : Topic Gilux [Actuel : Guillemets MySQL]
« Réponse #44 le: 01 Juillet 2011, 12:44:44 »
si on se base comme en php par exemple on peut faire comme ceci

print("il n'y a pas de soleil");//cela fonctionne
print('il n\'y a pas de soleil');//fonctionne aussi 
print("il n\'y a pas de soleil");//cela afficheras l'antislash
print('il n'y pas de soleil');//ici nous avon une errore Parse error: syntax error, unexpected T_STRING qui est deja visible avec la coloration de synthaxe
« Modifié: 01 Juillet 2011, 12:46:29 par cristab »
pas d'aide en PM, vous êtes sur un forum est il me semble que vous êtes la pour avoir de l'aide donc pourquoi MP une seul personne qui ne vous répondra pas alors qu'il y a plein de membre ici