C++ Projekt gegen SQL-Injection schützen

Hi Leute,
ich hab da mal ne Frage zu SQL-Injection.
Und zwar mache ich eine ganz normale Abfrage in C++ und will die jetzt dagegen schützen.
Hier erstmal der Code:
Code:
CRecordset recset( &db );
	CString sSQL =
		_T("SELECT Nr FROM ProdTest WHERE ")
		_T("Nr=") + vecStrProdNr[i] + _T(" AND ") +
		_T("Lang='") + vecLangs[i] + _T("' AND (") +
		_T("DefName='") + name + _T("'");
recset.Open( AFX_DB_USE_DEFAULT_TYPE, sSQL );
Ich habe beim googlen gelesen, dass man dort Prepared SQL-Statements benutzen soll. Leider hab ich keine Beispiele, etc für C++ gefunden. Ich hatte auch gelesen, dass eigentlich nur PHP und ASP hauptsächlich dafür anfällig sind. Hat da jemand eine Ahnung, bzw. sowas schonmal gemacht?
Wär super, wenn mir jemand helfen könnte, bzw. ein Beispiel nennen könnte...

Gruß,
M4CH!N3 aka Sebastian

EDIT: also ich hab grad gelesen, man soll erst Templates an den SQL Server senden, zB
Code:
SELECT * FROM users WHERE card = ?
Und dann übergibt man zur Laufzeit später die Parameter. Aber ich hab kein Plan, wie ich das in C++ realisieren soll...
 
Hallo,
ka. wie dies unter C++ geht, aber normalerweise maskiert man die Usereingaben, also aus ' macht man \'

Man hat eine Abfrage:
"SELECT * FROM db WHERE id = " + id;

Hier muss man sicher gehen, dass id auch wirklich eine Zahl ist

Oder solch eine Abfrage:
"SELECT * FROM db WHERE username = '" + maskiere_eingabe(username) + "'";

Wenn der User ne injection versucht, resultiert es in solch etwas:
SELECT * FROM db WHERE username = 'eine injection \' OR 1=1;'

Ohne Maskeriung:
SELECT * FROM db WHERE username = 'eine injection' OR 1=1;' //Alle Datensätze werden gefunden

Prinzipiell sind alle Programme anfällige für Injections, solange der User Dateneingeben kann. Da man aber im Internet meistens mit PHP oder ASP Anwendungen in Kontakt kommt, und diese oft auch Datenbanken verwenden (z.B. dieses Board), sind diese besonders gefährdet.
Deine kleine Access Datenbank, die du alleine zum Rechnungschreiben verwendest, ist evt. auch anfällig für Injections, da aber ja nur du diese verwendest, ist das Problem nebensächlich.
Wenn sie aber per Netzwerk oder gar per Internet erreicht bar ist, muss diese auch gegen SQL Injections geschützt werden.
 
Ich hab mir überlegt, ich könnte mir die PHP-Funktion
Code:
mysql_real_escape_string()
in C++ nachbauen. Hat jemand eine Ahnung, wie ich das am Besten anstelle? Ich hatte jetzt mal so angefangen:
Code:
CString mysql_real_escape_string(CString unEscaped)
{
	CString escaped = unEscaped;
	
	escaped.Replace(_T("\x00"), _T("\\\\x00"));
	escaped.Replace(_T("\n"), _T("\\n"));
	escaped.Replace(_T("\r"), _T("\\r"));
	escaped.Replace(_T("\\"), _T("\\\\"));
	escaped.Replace(_T("\'"), _T("\\\'"));
	escaped.Replace(_T("\""), _T("\\\""));
	escaped.Replace(_T("\x1a"), _T("\\\\x1a"));
	
	return escaped;
Funzt aber nochnicht optimal, da ja eigentlich nur \r escaped werden soll. Jetzt wird aber auch \\r escaped. Hat da jemand ne Idee, wie man das besser anstellen kann? Den ganzen String zu durchlaufen wäre doch bestimmt ziemlich langsam, oder?
 
Hallo,
wichtig ist eigentlich nur ' und evt. noch " zu maskieren, wofür viele in PHP die Funktion addslashes() verwenden (weil es dieses Funktion länger gibt).

Da PHP ja selber in C geschrieben ist, evt. mal den Source-Code runterladen, und per Dateiübergreifende Suche nach "mysql_escape_string" suchen (sollte dann irgendwie PHP_FUNCTION mysql_escape_string(...) heißen).
 
Zurück
Oben