Замена некоторых символов в строке - PullRequest
1 голос
/ 07 октября 2011

Если у меня есть переменная вроде:

char *sql;
sql = "insert into Norm1Tab values (?,?,?,?,?,?)";

Я бы хотел заменить каждый ? значениями, которые хранятся в других char или char* переменных. Как я могу сделать это в C ++?

Ответы [ 4 ]

8 голосов
/ 07 октября 2011

В C ++ не используйте char* строки в стиле C. Если вы используете std::string, вы можете использовать find и replace, чтобы делать то, что вы хотите.

Но, пожалуйста, не делай этого. Вы просто откроете себе миллион атак SQL-инъекций. Вместо этого используйте подготовленные операторы со связанными параметрами.

1 голос
/ 07 октября 2011

Если вы используете sqlite (конечно, выглядит так), вам не нужно делать замену строки самостоятельно. Вместо этого используйте sqlite3_bind_*.

документация для связывания

Использование API от вашего провайдера базы данных дает много преимуществ, поэтому вам не следует избегать их, если вы можете помочь. Вы получите лучшую безопасность при печати, лучшую защиту от инъекций и улучшенную производительность.

В противном случае я бы использовал для этого boost::format.

std::string sql = "insert into Norm1Tab values ('%1%','%2%');";
boost::format fmt(sql);
std::string stmt = boost::str( fmt % param1 % param2 );

Как уже упоминалось другими, вам нужно очистить свои параметры, чтобы убедиться в отсутствии уязвимостей для инъекций.

Если вы этого не сделаете, все, что имеет специальные символы, может сломать это.

char const* param1 = "Joe's House";

Потребовалось бы некоторое знание структуры, чтобы разрушить ее. Как только кто-то увидит сообщение об ошибке от Joe's House, он, вероятно, узнает, что может сделать хуже.

char const* param1 = "'); DROP Norm1Tab; --";

Если вы будете делать это последовательно, умный человек получит полную схему только в течение времени. Например, с помощью sqlite любая инъекция в запрос может дать вам всю информацию, необходимую для тихого изменения ваших записей любым желаемым способом.

SELECT * FROM sqlite_master;
0 голосов
/ 07 октября 2011

Если вы непреклонны в этом вопросе (в отличие от использования первого комментария Matteo Italia), проверьте решение, найденное здесь:

Как мне искать / находить и заменять встандартная строка?

Это не совсем то, что вам нужно, но показывает, как можно использовать .find (), чтобы получить расположение знака вопроса, и .replace, чтобы заменить знак вопроса содержимымбуферов вашего персонажа.

0 голосов
/ 07 октября 2011

Вы можете поместить% s и использовать sprintf для заполнения полей ...

Однако для рассматриваемой проблемы вы, вероятно, хотите подготовленное утверждение ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...