<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Richtiger Umgang mit SQL in C++ Code]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich bin mir nicht sicher ob die Kategorie C++ passt. Bitte verschieben wenn dem nicht so ist.<br />
Beispiel:<br />
Ich möchte SQLite in einem Programm nutzen.<br />
Das feuern eines Statements wird wie folgt gemacht:</p>
<pre><code>db.query(&quot;INSERT INTO t_user(a_username,a_password,a_salt) VALUES ('Username','Password','Salt');&quot;);
</code></pre>
<p>Wenn ich nun statt der fixen Werte variable Werte haben möchte dann muss ich mir den String &quot;hinfrickeln&quot;:</p>
<pre><code>db.query(&quot;INSERT INTO t_user(a_username,a_password,a_salt) VALUES ('&quot;+Username+&quot;','&quot;+Password+&quot;','Salt');&quot;);
</code></pre>
<p>Nun für mich heißt das:<br />
SQL Injektion WILLKOMMEN <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /><br />
Was mich aber noch mehr stört ist die Tatsache das ich bei größeren Abfragen ein total unübersichtlichen, Fehleranfälligen, Quelltext habe.<br />
Ausserdem habe ich einen riesen Aufwand, weil ich jetzt manuell alle Eingaben auf SQL Injektion prüfen darf. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_down"
      title=":-1:"
      alt="👎"
    /><br />
Frage:<br />
Was ist hier der &quot;richtige&quot; Weg? Wie geht man mit SQL und C++ um?<br />
Ich kenne noch die Lösung der stored procedures, welche mein Problem ja beheben. Auch die SQL Injektions Frage. Jedoch bietet SQLite stored procedures <strong>nicht</strong> an.</p>
<p>Also ihr weisen Hasen. Was schlagt ihr vor? (Bitte mit Begründung)</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/319994/richtiger-umgang-mit-sql-in-c-code</link><generator>RSS for Node</generator><lastBuildDate>Fri, 24 Jul 2026 14:52:11 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/319994.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 11 Sep 2013 18:42:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Richtiger Umgang mit SQL in C++ Code on Wed, 11 Sep 2013 18:42:34 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich bin mir nicht sicher ob die Kategorie C++ passt. Bitte verschieben wenn dem nicht so ist.<br />
Beispiel:<br />
Ich möchte SQLite in einem Programm nutzen.<br />
Das feuern eines Statements wird wie folgt gemacht:</p>
<pre><code>db.query(&quot;INSERT INTO t_user(a_username,a_password,a_salt) VALUES ('Username','Password','Salt');&quot;);
</code></pre>
<p>Wenn ich nun statt der fixen Werte variable Werte haben möchte dann muss ich mir den String &quot;hinfrickeln&quot;:</p>
<pre><code>db.query(&quot;INSERT INTO t_user(a_username,a_password,a_salt) VALUES ('&quot;+Username+&quot;','&quot;+Password+&quot;','Salt');&quot;);
</code></pre>
<p>Nun für mich heißt das:<br />
SQL Injektion WILLKOMMEN <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /><br />
Was mich aber noch mehr stört ist die Tatsache das ich bei größeren Abfragen ein total unübersichtlichen, Fehleranfälligen, Quelltext habe.<br />
Ausserdem habe ich einen riesen Aufwand, weil ich jetzt manuell alle Eingaben auf SQL Injektion prüfen darf. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_down"
      title=":-1:"
      alt="👎"
    /><br />
Frage:<br />
Was ist hier der &quot;richtige&quot; Weg? Wie geht man mit SQL und C++ um?<br />
Ich kenne noch die Lösung der stored procedures, welche mein Problem ja beheben. Auch die SQL Injektions Frage. Jedoch bietet SQLite stored procedures <strong>nicht</strong> an.</p>
<p>Also ihr weisen Hasen. Was schlagt ihr vor? (Bitte mit Begründung)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2351987</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2351987</guid><dc:creator><![CDATA[Croatiancow]]></dc:creator><pubDate>Wed, 11 Sep 2013 18:42:34 GMT</pubDate></item><item><title><![CDATA[Reply to Richtiger Umgang mit SQL in C++ Code on Wed, 11 Sep 2013 19:17:12 GMT]]></title><description><![CDATA[<p>Hab damit keine Erfahrung, aber trotzdem mal ein Ansatz:</p>
<pre><code>//einfach zu benutzen und sicher
void DataBase::insert(const string &amp;username, const string &amp;password){
    query(&quot;INSERT INTO t_user(a_username,a_password,a_salt) VALUES ('&quot;+sanitize(username)+&quot;','&quot;+sanitize(password)+&quot;','Salt');&quot;);
}

//oder damit man das sanitize nicht vergessen kann:
struct SaneString{
    SaneString(const char *cs){
        s = sanitize(cs);
    }
    SaneString(const string &amp;ss){
        s = sanitize(ss);
    }
    operator string&amp; (){
        return s;
    }
    operator const string&amp; () const{
        return s;
    }
private:
    string s;
};
string operator +(const char *cs, const SaneString &amp;ss){
    return cs + string(ss);
}

//drauf achten, dass alle DataBase-Funktionen außer private member query SaneStrings nehmen
void DataBase::insert(const SaneString &amp;username, const SaneString &amp;password){
    query(&quot;INSERT INTO t_user(a_username,a_password,a_salt) VALUES ('&quot;+username+&quot;','&quot;+password+&quot;','Salt');&quot;);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2352000</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2352000</guid><dc:creator><![CDATA[nwp3]]></dc:creator><pubDate>Wed, 11 Sep 2013 19:17:12 GMT</pubDate></item><item><title><![CDATA[Reply to Richtiger Umgang mit SQL in C++ Code on Wed, 11 Sep 2013 19:35:20 GMT]]></title><description><![CDATA[<p>prepared statement?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2352003</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2352003</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Wed, 11 Sep 2013 19:35:20 GMT</pubDate></item><item><title><![CDATA[Reply to Richtiger Umgang mit SQL in C++ Code on Wed, 11 Sep 2013 19:54:19 GMT]]></title><description><![CDATA[<p>Danke für deine Antwort nwp3.</p>
<p>Du versuchst mit dem sanitize() also den String abzuklopfen?<br />
Zu welcher lib gehört denn sanitize?</p>
<p>Sollte dem so sein, finde ich ein manuelles abklopfen und der Suche nach einem escape Zeichen etwas unsicher. Es findet sich doch immer ein Weg dies zu Umgehen.</p>
<p>Deine Lösung behält den SQL Code weiterhin im C++ Quelltext.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2352005</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2352005</guid><dc:creator><![CDATA[Croatiancow]]></dc:creator><pubDate>Wed, 11 Sep 2013 19:54:19 GMT</pubDate></item><item><title><![CDATA[Reply to Richtiger Umgang mit SQL in C++ Code on Wed, 11 Sep 2013 19:45:47 GMT]]></title><description><![CDATA[<p>Schau dir mal ODB - C++ an. Vielleicht ist das ja was für dich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2352008</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2352008</guid><dc:creator><![CDATA[eddi0815]]></dc:creator><pubDate>Wed, 11 Sep 2013 19:45:47 GMT</pubDate></item><item><title><![CDATA[Reply to Richtiger Umgang mit SQL in C++ Code on Wed, 11 Sep 2013 20:24:33 GMT]]></title><description><![CDATA[<p>Bashar schrieb:</p>
<blockquote>
<p>prepared statement?</p>
</blockquote>
<p>Bingo!<br />
Habe die API Doku nicht genau genug gelesen.<br />
Ich denke in SQLite wäre das dann <a href="http://www.sqlite.org/c3ref/prepare.html" rel="nofollow">dieser Befehl</a>?</p>
<p>Stellt sich die Frage wie ich den SQL Code damit Auslagern kann.<br />
Ich hätte jetzt einfach die einzelnen Abfragen in den Konstruktor einer Database Klasse aufgenommen und die ganzen strings (statements) als private deklariert.<br />
dann nur noch den Zugriff über Methoden erlauben.</p>
<p>Wäre dies der richtige Weg?</p>
<p>Laut Doku prüft der prepare Befehl jedoch nicht auf SQL Injektion.<br />
Bleibt diese Frage also noch offen.</p>
<p>Edith sagt:<br />
Mit einem <a href="http://www.sqlite.org/c3ref/bind_blob.html" rel="nofollow">Bind</a> kann man die Variablen zuweisen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2352013</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2352013</guid><dc:creator><![CDATA[Croatiancow]]></dc:creator><pubDate>Wed, 11 Sep 2013 20:24:33 GMT</pubDate></item><item><title><![CDATA[Reply to Richtiger Umgang mit SQL in C++ Code on Fri, 13 Sep 2013 08:54:25 GMT]]></title><description><![CDATA[<p>Normalerweise arbeitet man mit Parametern. Sollte SQLite auch können.</p>
<pre><code>db.query(&quot;INSERT INTO t_user(a_username,a_password,a_salt) VALUES (:Username, :Password, 'Salt');&quot;);
</code></pre>
<p>Den Parametern :Username und :Password musst Du dann vor Ausführung der Abfrage die entsprechenden Werte zuweisen.<br />
Das ganze hat auch den Vorteil, dass Du die Abfrage schon in der Parameterform preparen kannst. Dadurch wird die eigentliche Ausführung deutlich schneller.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2352186</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2352186</guid><dc:creator><![CDATA[MichelRT]]></dc:creator><pubDate>Fri, 13 Sep 2013 08:54:25 GMT</pubDate></item><item><title><![CDATA[Reply to Richtiger Umgang mit SQL in C++ Code on Thu, 12 Sep 2013 16:06:04 GMT]]></title><description><![CDATA[<p>Ich meine die '' bei den Parametern gehören weg.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2352231</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2352231</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 12 Sep 2013 16:06:04 GMT</pubDate></item><item><title><![CDATA[Reply to Richtiger Umgang mit SQL in C++ Code on Fri, 13 Sep 2013 08:55:21 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Ich meine die '' bei den Parametern gehören weg.</p>
</blockquote>
<p>Meine ich auch. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>Ich hab's geändert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2352280</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2352280</guid><dc:creator><![CDATA[MichelRT]]></dc:creator><pubDate>Fri, 13 Sep 2013 08:55:21 GMT</pubDate></item><item><title><![CDATA[Reply to Richtiger Umgang mit SQL in C++ Code on Thu, 12 Sep 2013 20:06:13 GMT]]></title><description><![CDATA[<p>Danke für eure Antworten.<br />
So wie ich das jetzt sehe kann man also mit:</p>
<pre><code>sqlite3_prepare()
</code></pre>
<p>und</p>
<pre><code>sqlite3_bind_int
</code></pre>
<p>prepared statements und Parameter übergeben.</p>
<p>Ich werde jetzt eine Wrapper Klasse schreiben, welche dann den SQL Code in den einzelnen Methoden hat.</p>
<p>Danke für eure Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2352282</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2352282</guid><dc:creator><![CDATA[Croatiancow]]></dc:creator><pubDate>Thu, 12 Sep 2013 20:06:13 GMT</pubDate></item><item><title><![CDATA[Reply to Richtiger Umgang mit SQL in C++ Code on Fri, 13 Sep 2013 08:53:28 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>prepared statements ist genau der richtige Ansatz. Ich würde so etwas immer weg kapseln und einen Datenbankunabhängigen Layer dazwischen schalten, wo ich die Datenbank später eventuell dann auch mal wechseln kann. Und da ich das schon lange so machen würde, habe ich das auch getan. Das Ergebnis ist <a href="http://www.tntnet.org/tntdb.html" rel="nofollow">Tntdb</a>.</p>
<p>Das Beispielstatement:</p>
<pre><code>db.query(&quot;INSERT INTO t_user(a_username,a_password,a_salt) VALUES ('Username','Password','Salt');&quot;);
</code></pre>
<p>Wäre mit tntdb dann so (inklusive connect):</p>
<pre><code>db = tntdb::connect(&quot;sqlite:mydb.db&quot;);
tntdb::Statement ins = db.prepare(&quot;INSERT INTO t_user(a_username,a_password,a_salt) VALUES (:Username, :Password, :Salt)&quot;);
ins.set(&quot;Username&quot;, Username)
   .set(&quot;Password&quot;, Password)
   .set(&quot;Salt&quot;, Salt)
   .execute();
</code></pre>
<p>Da ist dann garantiert, dass keine SQL Injection passieren kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2352312</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2352312</guid><dc:creator><![CDATA[tntnet]]></dc:creator><pubDate>Fri, 13 Sep 2013 08:53:28 GMT</pubDate></item><item><title><![CDATA[Reply to Richtiger Umgang mit SQL in C++ Code on Fri, 13 Sep 2013 09:28:28 GMT]]></title><description><![CDATA[<p>Der nächste Schritt ist <a href="http://en.wikipedia.org/wiki/Object-relational_mapping" rel="nofollow">ORM</a> zu verwenden.</p>
<p>Wir schreiben zB quasi keine Queries und wenn es doch mal sein muss, dann sind die se weggekapselt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2352328</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2352328</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Fri, 13 Sep 2013 09:28:28 GMT</pubDate></item><item><title><![CDATA[Reply to Richtiger Umgang mit SQL in C++ Code on Fri, 13 Sep 2013 15:57:36 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>Der nächste Schritt ist <a href="http://en.wikipedia.org/wiki/Object-relational_mapping" rel="nofollow">ORM</a> zu verwenden.</p>
<p>Wir schreiben zB quasi keine Queries und wenn es doch mal sein muss, dann sind die se weggekapselt.</p>
</blockquote>
<p>Macht ihr das mit Hilfe eines Frameworks? Oder tippt ihr das alles manuell ab?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2352383</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2352383</guid><dc:creator><![CDATA[Croatiancow]]></dc:creator><pubDate>Fri, 13 Sep 2013 15:57:36 GMT</pubDate></item><item><title><![CDATA[Reply to Richtiger Umgang mit SQL in C++ Code on Fri, 13 Sep 2013 22:00:43 GMT]]></title><description><![CDATA[<p>eddi0815 schrieb:</p>
<blockquote>
<p>Schau dir mal ODB - C++ an. Vielleicht ist das ja was für dich.</p>
</blockquote>
<p>Das ist genau das was ich Suche <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /><br />
Danke!</p>
<p>Damit kann der Thread geschlossen werden.</p>
<p>Ergebnis:</p>
<p>Ich werde ORM (ODB - C++) verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2352429</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2352429</guid><dc:creator><![CDATA[Croatiancow]]></dc:creator><pubDate>Fri, 13 Sep 2013 22:00:43 GMT</pubDate></item></channel></rss>