Sinds kort heb ik weer C++ opgepakt, alles lukt perfect behalve een ding.
Ik heb zelf classes geschreven voor Sockets, MySQL en Clients. Het gaat hier met name om de MySQL. Omdat ik de mysql query aanmaak via user input (ik snap dat sql injection een mogelijkheid is, maar dit even ter zijde) is het nodig dat ik de variables juist escape. Zo moet abc'def omgezet worden in abc\'def om het juist uit te kunnen voeren in MySQL (als ik het niet af vang, dan geeft het programma een segfault).
Hiervoor heb ik twee commando's gevonden in de mysql.h header, namelijk mysql_escape_string en mysql_real_escape_string.
Ik gebruik nu de "real" functie omdat deze kijkt naar het huidige MySQL charset. Het probleem is dat ik het commando niet juist kan uitvoeren. Stel:
char *a = "abc'def"
char *newa;
int alen = strlen(a);
char *b = "def'hij"
char *newb;
int blen = strlen(b);
mysql_real_escape(&mysql,newa,a,alen); // ik weet dat &mysql nu niet bestaat.
mysql_real_escape(&mysql,newb,b,blen); // ik weet dat &mysql nu niet bestaat.
dan word newa netjes "abc\'def" zoals het hoort. Daar in tegen word newb "\\\\\\\\". Dus allemaal slashes.
Nou dacht ik bij mezelf, maak het script eens kleiner en probeer het opnieuw:
Nu krijg ik deze code helemaal niet aan het werk, geeft een segfault bij het uitvoeren van de escape_string.
Heeft iemand enig idee?
Alvast bedankt.
Ik heb zelf classes geschreven voor Sockets, MySQL en Clients. Het gaat hier met name om de MySQL. Omdat ik de mysql query aanmaak via user input (ik snap dat sql injection een mogelijkheid is, maar dit even ter zijde) is het nodig dat ik de variables juist escape. Zo moet abc'def omgezet worden in abc\'def om het juist uit te kunnen voeren in MySQL (als ik het niet af vang, dan geeft het programma een segfault).
Hiervoor heb ik twee commando's gevonden in de mysql.h header, namelijk mysql_escape_string en mysql_real_escape_string.
Ik gebruik nu de "real" functie omdat deze kijkt naar het huidige MySQL charset. Het probleem is dat ik het commando niet juist kan uitvoeren. Stel:
char *a = "abc'def"
char *newa;
int alen = strlen(a);
char *b = "def'hij"
char *newb;
int blen = strlen(b);
mysql_real_escape(&mysql,newa,a,alen); // ik weet dat &mysql nu niet bestaat.
mysql_real_escape(&mysql,newb,b,blen); // ik weet dat &mysql nu niet bestaat.
dan word newa netjes "abc\'def" zoals het hoort. Daar in tegen word newb "\\\\\\\\". Dus allemaal slashes.
Nou dacht ik bij mezelf, maak het script eens kleiner en probeer het opnieuw:
Code:
#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <unistd.h>
#include <cctype>
#include "/usr/include/mysql/mysql.h"
MYSQL *mysql; /* MySQL Handler */
MYSQL_RES *mysql_res; /* MySQL Result */
MYSQL_FIELD *mysql_fields; /* MySQL Fields */
MYSQL_ROW mysql_row; /* MySQL Row */
int iRetValue = 0;
char *Test1 = "abc'def";
char *Escaped;
int Test1Len;
int main(int argc, char *argv[]){
mysql = mysql_init(NULL);
if (!mysql_real_connect(mysql,"10.0.0.2","roland","xxxxxxx","Cer",3306,NULL,0)) {
printf("Failed to open connection to MySQL\n");
}
printf("Testing char *Test1 with %s length %i\n",Test1,strlen(Test1));
Test1Len = strlen(Test1);
//Escaped = malloc((1 + (Test1Len * 2)) * sizeof(char));
mysql_real_escape_string(mysql,Escaped,Test1,Test1Len); << segfault
printf("Escaped outcome %s\n",Test1);
mysql_close(mysql);
}
Nu krijg ik deze code helemaal niet aan het werk, geeft een segfault bij het uitvoeren van de escape_string.
Heeft iemand enig idee?
Alvast bedankt.