Advertentie

Auteur Topic: waarde in een string plakken  (gelezen 486 keer)

Offline GroundZero

  • Zeer actief lid
  • *****
  • Berichten: 381
  • Aantal ++: 5
    • Devbizz - webdevelopment
waarde in een string plakken
« Gepost op: mei 10, 2012, 22:54:23 pm »
Beste,

ik heb de volgende code:

Code: C++ (QT)
  1. #include <QtCore/QCoreApplication>
  2. #include <QtSql>
  3. #include <QSqlDatabase>
  4. #include <QDebug>
  5. #include <iostream>
  6.  
  7. using namespace std;
  8.  
  9. int main(int argc, char *argv[])
  10. {
  11.     QCoreApplication a(argc, argv);
  12.    
  13.     //qDebug() << QSqlDatabase::drivers();
  14.  
  15.     QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
  16.     db.setHostName("devbign6346345.eightythree.axc.nl");
  17.     db.setDatabaseName("devbign83_cpp");
  18.     db.setUserName("devbign83_cpp");
  19.     db.setPassword("wachtwoord");
  20.     bool ok = db.open();
  21.  
  22.     // ask the user to enter his name
  23.     cout << "Please enter your username:\n";
  24.  
  25.     QString username;
  26.     getline(cin, username);
  27.  
  28.     // set a new query
  29.     QSqlQuery query;
  30.  
  31.     QString myLine = "SELECT username FROM site_users WHERE username = '";
  32.     myLine.append(username);
  33.     myLine.append("' ORDER BY username ASC");
  34.  
  35.     query.exec(myLine);
  36.  
  37.     // loop through the results
  38.     while(query.next()){
  39.         QString name = query.value(0).toString();
  40.         qDebug() << name;
  41.     }
  42.  
  43.     return a.exec();
  44. }

Probleem wat ik nu heb is het volgende:

Code: C++ (QT)
  1. query.exec("SELECT username FROM site_users WHERE username = 'username'");

Ik wil dat op de plaatst waar nu 'username' staat, daar de waarde komt te staan die ik met het getline() commando in de variable
username heb geplaatst.

Kan iemand mij vertellen hoe ik dit kan realiseren? want ik krijg het namelijk niet voor elkaar.

Wanneer ik gewoon doe:

Code: C++ (QT)
  1. query.exec("SELECT username FROM site_users");

dan werkt het perfect :)

EDIT:
Ik heb het voor elkaar met de volgende code:

Code: C++ (QT)
  1. #include <QtCore/QCoreApplication>
  2. #include <QtSql>
  3. #include <QSqlDatabase>
  4. #include <QDebug>
  5. #include <iostream>
  6. #include <QString>
  7. #include <QTextStream>
  8.  
  9. using namespace std;
  10.  
  11. int main(int argc, char *argv[])
  12. {
  13.     QCoreApplication a(argc, argv);
  14.    
  15.     //qDebug() << QSqlDatabase::drivers();
  16.  
  17.     QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
  18.     db.setHostName("devbign83.eightythree.axc.nl");
  19.     db.setDatabaseName("devbign83_cpp");
  20.     db.setUserName("devbign83_cpp");
  21.     db.setPassword("wachtwoord");
  22.     bool ok = db.open();
  23.  
  24.     // ask the user to enter his name
  25.     cout << "Please enter your username:\n";
  26.  
  27.     QString username;
  28.     QTextStream usernameIn(stdin);
  29.     usernameIn >> username;
  30.  
  31.     // ask the user for his password
  32.     cout << "Please enter your password:\n";
  33.  
  34.     QString password;
  35.     QTextStream passwordIn(stdin);
  36.     passwordIn >> password;
  37.  
  38.     // set a new query
  39.     QSqlQuery query;
  40.  
  41.     QString myLine = "SELECT username, activated FROM site_users WHERE username = '";
  42.     myLine.append(username);
  43.     myLine.append("' AND password = sha1('");
  44.     myLine.append(password);
  45.     myLine.append("') ORDER BY username ASC");
  46.  
  47.     query.exec(myLine);
  48.  
  49.     // set a counter
  50.     int rows = 0;
  51.  
  52.     // loop through the results
  53.     while(query.next()){
  54.         rows++;
  55.         int activated = query.value(1).toInt();
  56.     }
  57.  
  58.     if(activated == 1)
  59.     {
  60.         // successfully, but check if activated
  61.         if(0 == 0)
  62.         {
  63.             cout << "Account not activated yet!";
  64.         }
  65.         else
  66.         {
  67.             cout << "Logged in succesfully!";
  68.         }
  69.     }
  70.     else if(rows >= 2)
  71.     {
  72.         // something wrong or multiple accounts
  73.         cout << "Something is wrong with your account!";
  74.     }
  75.     else
  76.     {
  77.         cout << "No account found!";
  78.     }
  79.  
  80.     return a.exec();
  81. }

Enigste wat ik me nu nog afvraag is het volgende:

1. Alles wat hij weergeeft staat tussen "" tekens, kan ik dit verwijderen?
2. Ik wil kijken of de account geactiveerd is, echter krijg ik de foutmelding "error: 'activated' was not declared in this scope". Hoe kan ik dit oplossen?
3. Kan ik in plaats van alles weer te geven ook iets gaan doen met de gegevens? dus bijvoorbeeld de gebruikersnaam en wachtwoord in een variable plaatsen?

G'night!
« Laatst bewerkt op: mei 11, 2012, 15:35:28 pm door GroundZero »

Offline Laloeka

  • Administrator
  • Zeer gerespecteerd lid
  • ********
  • Berichten: 1518
  • Aantal ++: 19
    • JochemKuijpers.nl
Re: waarde in een string plakken
« Reactie #1 Gepost op: mei 11, 2012, 02:40:24 am »
[...]

Enigste wat ik me nu nog afvraag is het volgende:

1. Alles wat hij weergeeft staat tussen "" tekens, kan ik dit verwijderen?
2. Ik wil kijken of de account geactiveerd is, echter krijg ik de foutmelding "error: 'activated' was not declared in this scope". Hoe kan ik dit oplossen?
3. Kan ik in plaats van alles weer te geven ook iets gaan doen met de gegevens? dus bijvoorbeeld de gebruikersnaam en wachtwoord in een variable plaatsen?

G'night!

1. Je zou het eerste en laatste karakter van de string af kunnen knippen, hoe dat met een QString moet weet ik niet precies.

2. Je declareert het variabele activated in een while-loop. Het variabele is dus enkel geldig binnen die loop. Vervolgens controleer je de waarde buiten de loop. De oplossing is dus:

Code: C++ (QT)
  1.     [...]
  2.     int activated;
  3.     // loop through the results
  4.     while(query.next()){
  5.         rows++;
  6.         activated = query.value(1).toInt();
  7.     }
  8.  
  9.     if(activated == 1)
  10.     {
  11.         // successfully, but check if activated
  12.         [....]

3. Dat lijkt me wel. Waarom wil je de gebruikersnaam en het (gehashte?) wachtwoord opvragen?



Overigens zitten er momenteel meerdere beveiligingsfouten in je code.

Als eerste valideer je gebruikers input niet. Zo maak je SQL Injectie mogelijk.

Als tweede staat je MySQL wachtwoord letterlijk in de broncode van het bestand. Als dit gecompileerd is kun je het ergens terugvinden in de programmabestanden met bijvoorbeeld Kladblok. Vaak wordt voor applicaties die naar een vaste server moeten verbinden een (PHP) script op een server gezet. Het script maakt vervolgens de verbinding met de MySQL server, na de nodige beveiligingschecks. Een directe MySQL verbinding vanuit je programma zou ik enkel toepassen op bijvoorbeeld een MySQL beheersysteem, een soort tool waarmee gebruikers zélf kunnen inloggen op hun eigen databases.

Als derde zie ik dat je het te controleren wachtwoord zo mee geeft aan de MySQL query, met een sha1() functie eromheen. Dat betekend dat als iemand het netwerk verkeer onderschept, en deze querystring eruit kan halen, dat hij het wachtwoord heeft. Het beste kun je de sha1() functie dus al in je programma uitvoeren.

Dus in plaats van deze querystring (voorbeeld):
Code: MySQL
  1. SELECT * FROM `table` WHERE `password` = sha1('abc')

heb je deze:
Code: MySQL
  1. SELECT * FROM `table` WHERE `password` = 'a9993e364706816aba3e25717850c26c9cd0d89d'

(vergeet niet minstens één salt toe te voegen aan je sha1() functie!)

Offline GroundZero

  • Zeer actief lid
  • *****
  • Berichten: 381
  • Aantal ++: 5
    • Devbizz - webdevelopment
Re: waarde in een string plakken
« Reactie #2 Gepost op: mei 11, 2012, 10:39:01 am »
Dankjewel voor je antwoord Laloeka,

ik had inderdaad de integer ook VOOR de loop al eens gedeclareerd.
In de while loop word hij dat geset als 0 of 1 zijnde, echter blijft hij altijd op 0 staan wat niet klopt.
Als ik de waarde is de while loop weergeef dan geeft hij netjes "1" weer, maar de integer blijft wel op 1 staan.

Betreft de rest daar kom ik dadelijk op terug, eerst even dat met die integer werkend krijgen ;)

EDIT
Heb het nu inderdaad werkend, mijn fout zat in de afhandeling, beetje dom van me maar goed nu werkt het.
Ik ga nu naar het MYSQL gebeuren kijken en dergelijke. Ik weet dat de code nog niet veel soeps is maar dit is puur een
leer proces voor mij, ben alles nog aan het uitvinden en leren dus vandaar ;)

Is het ook mogelijk om een soort van regdex uit te voeren op de invoer van de gebruiker? dus dat ik kan kijken of de gebruikersnaam
alleen uit letters (klein en hoofdletter) bestaat en niet uit leestekens, spaties en overige karakters?

Betreft de query...

ik moet het wachtwoord dus eerst in een sha1 plaatsen, en die mee geven in de query?... maar hoe kan ik zo iets doen? ik heb geen idee
waar te beginnen om eerlijk te zijn in C++

en mysql_real_escape_string als C++ variant... waar kan ik dat vinden?

En kan ik ergens vinden hoe ze dat doen dan met de MYSQL zodat het niet in mijn broncode staat? :P
« Laatst bewerkt op: mei 11, 2012, 17:54:29 pm door GroundZero »

Advertentie