2010-11-18 4 views
1

Ist es möglich, Text zu einem char* hinzuzufügen?Text zum Zeichen hinzufügen *

Da dieser Code Fehler gibt:

name3 = "SELECT account_id FROM players WHERE name = '" + name + "'"; 

(name3 = a char *)

+1

Siehe [SQL injection attack] (http://en.wikipedia.org/wiki/SQL_injection) –

Antwort

16

Ihre Frage mit C++, markiert so C++ verwenden. Befreien Sie sich von Ihrem char* ‚s und verwenden std::string:

std::string name = "..."; 

std::string name3 = "SELECT account_id FROM players WHERE name = '" + name + "'"; 

Sie können zwei Zeichen-Arrays (char *‚add‘‘ s) durch ein neues Array groß genug, um die Zuweisung sowohl zu halten, und das Kopieren beider Strings in die neuen Array. Ich denke, Sie werden zustimmen, dass std::string einfacher ist, aber es bietet auch weniger Gelegenheit für Sie, um subtile Fehler in Ihren Code einzuführen, die das Debugging und die Wartung einfacher machen.

+2

Als Nebenbemerkung, wenn Sie planen, viele String-Verkettung zu tun, sollten Sie 'std :: stringstream' verwenden. Vermeiden Sie auch die Verwendung von Inline-SQL. –

2

Sie müssen die Speicher zuerst, zum Beispiel zuteilen:

char* name = new char[ BUFF_SIZE ]; 

und dann strcpy und strcat verwenden, aber .. Sie haben Tag c++. Verwenden std::string

std::string name3 = "SELECT account_id FROM players WHERE name = '" 
        + 
        std::string(name) 
        + 
        "'"; 

oder

std::string name3 = "SELECT account_id FROM players WHERE name = '"; 
name3 += name; 
name3 += "'"; // or name3.push_back(';'); 

Hinweis wenn name nicht const char*, aber std::string, die Sie nicht von expliziten Konvertierungen benötigen, so finden Sie in der

+0

'std :: string' ist schlauer als das. Sie benötigen höchstens 'std :: string (name)', die anderen expliziten Deklarationen sind nur Unordnung. – meagar

+0

Ja, richtig, danke –

1

meagar schreiben Sie können auch Verwenden Sie sprintf für das, was Sie beschreiben.

Auch wenn dies für eine Datenbankverbindung ist, sollten Sie vorbereitete Anweisungen verwenden.

+0

-1 für die Empfehlung der Verwendung der unsicheren 'Sprintf'-Funktion. –

+0

+1 für vorbereitete Anweisungen, -1 für 'sprintf' (verwenden Sie' string', Streams oder schlimmstenfalls 'snprintf'. –

+0

+1 für vorbereitete Anweisungen. Ernsthaft, hören Sie sich diesen Typ an. Machen Sie __nicht_ SQL so zu verketten, _ Im besten Fall wird sich Ihr Programm auf seltsame Weise verhalten, wenn es bestimmte Eingaben erhält. Im schlimmsten Fall wird jemand diese leicht erkennbare Sicherheitslücke ausnutzen und etwas tun, das Sie bereuen werden. –