Пользовательские значения MySQL C API

0

Я работаю с учебником по API MySQL C от http://zetcode.com/tutorials/mysqlcapitutorial/, следующий пример работает нормально:

#include <my_global.h>
#include <mysql.h>

int main(int argc, char **argv)
{

MYSQL *conn;

conn = mysql_init(NULL);
mysql_real_connect(conn, "localhost", "zetcode", "passwd", "testdb", 0, NULL, 0);

mysql_query(conn, "CREATE TABLE writers(name VARCHAR(25))");

mysql_query(conn, "INSERT INTO writers VALUES('Leo Tolstoy')");
mysql_query(conn, "INSERT INTO writers VALUES('Jack London')");
mysql_query(conn, "INSERT INTO writers VALUES('Honore de Balzac')");
mysql_query(conn, "INSERT INTO writers VALUES('Lion Feuchtwanger')");
mysql_query(conn, "INSERT INTO writers VALUES('Emile Zola')");

mysql_close(conn);

}

Как я могу изменить код для принятия пользовательских значений вместо жестко закодированных, возможно ли заменить сценариев и ex. Лев Толстой с указателем char или чем-то?

Теги:

3 ответа

3

У вас есть в основном два варианта:

  • Вы можете сами создать запрос, используя sprintf. Затем вы должны использовать mysql_real_escape_string для всех ваших переменных, иначе ваш код будет уязвим для SQL-инъекции.
  • Вы можете использовать подготовленные отчеты. В документации для mysql_stmt_execute приведены некоторые примеры. (это лучший вариант)
  • 0
    Что касается экранирующих строк, это относится только к предоставленным пользователем значениям. Вы должны позаботиться о том, чтобы различать безопасные и небезопасные данные.
  • 0
    Ну, нет никаких "безопасных" данных. Либо у вас есть переменные, которые берутся из файлов, пользовательского ввода и т. Д., Либо у вас есть константы в вашем коде. Даже с константами, я бы предпочел, чтобы клиент MySQL выполнял экранирование, потому что он лучше меня знает, что нужно экранировать.
0

Вам, вероятно, придется составлять ваши строки, например. используя sprintf().

0

Возможно, вы можете использовать sprintf()/snprintf(), например:

#include <my_global.h>
#include <mysql.h>

int main(int argc, char **argv)
{
MYSQL *conn;
conn = mysql_init(NULL);
/* error checking missing */
mysql_real_connect(conn, "localhost", "zetcode", "passwd", "testdb", 0, NULL, 0);
/* error checking missing */
mysql_query(conn, "CREATE TABLE writers(name VARCHAR(25))");
/* error checking missing */
do {
    char cmd[1000];
    char *name = "Leo Tolstoy"; /* get from user or file or something */
    snprintf(cmd, 999, "INSERT INTO writers VALUES('%s')", name);
    /* error checking missing */
    mysql_query(conn, cmd);
    /* error checking missing */
} while (0);
mysql_close(conn);
/* error checking missing */
}
  • 1
    Могу ли я добавить, если вы собираетесь сделать это таким образом и получить информацию от ... ну ... где угодно, вы захотите mysql_real_escape_string всю вашу переменную, чтобы убедиться, что вы не станете жертвой атаки SQL-инъекции как указано @ Lukáš Lalinský link

Ещё вопросы

Сообщество Overcoder
Наверх
Меню