C++ 我想不出这个错误

C++ 我想不出这个错误,c++,mysql,C++,Mysql,你们能在这个查询中看到任何明显的错误吗?im获取的错误是:`字段列表中的未知列003ADF50。003ADF50 wtf query << "UPDATE `record` SET `record` = " << lastRecord << ", `time` = " << time; query这里发生的事情是,您正在注入到sql中的其中一个值将显示为003ADF50。(可能是时间值?) Brendan Long是正确的:您应该使用准备好的语句

你们能在这个查询中看到任何明显的错误吗?im获取的错误是:`字段列表中的未知列003ADF50。003ADF50 wtf

query << "UPDATE `record` SET `record` = " << lastRecord << ", `time` = " << time;

query这里发生的事情是,您正在注入到sql中的其中一个值将显示为003ADF50。(可能是
时间
值?)

Brendan Long是正确的:您应该使用准备好的语句来正确处理SQL中的参数。手动连接字符串会导致引用问题,如您在这里看到的,这可能是代码中严重的安全问题。这里遇到的具体引用问题是,在生成的查询字符串中没有引用参数。如果您在mysql客户机中手动输入SQL,您会说:

UPDATE `record` set `record` = 'foo';
如果您在
'foo'
中省略了引号,您将有:

UPDATE `record` set `record` = foo;
它试图将记录列设置为
foo
列的值,而不是文本字符串
'foo'
。同样的事情发生在你从C++生成的SQL上。试图通过手动添加引号来解决这个问题不是一个好主意——当string参数包含引号字符时会发生什么?最好的做法是使用事先准备好的语句


[P>谷歌的“小BBBY表”是一个关于SQL参数注入的著名XKCD漫画,并考虑如果Bobby Tables的名字找到你的程序变量中的一个变量会发生什么。

这里发生的事情是,你注入SQL的那些值中的一个出现为03ADF50。(可能是

时间
值?)

Brendan Long是正确的:您应该使用准备好的语句来正确处理SQL中的参数。手动连接字符串会导致引用问题,如您在这里看到的,这可能是代码中严重的安全问题。这里遇到的具体引用问题是,在生成的查询字符串中没有引用参数。如果您在mysql客户机中手动输入SQL,您会说:

UPDATE `record` set `record` = 'foo';
如果您在
'foo'
中省略了引号,您将有:

UPDATE `record` set `record` = foo;
它试图将记录列设置为
foo
列的值,而不是文本字符串
'foo'
。同样的事情发生在你从C++生成的SQL上。试图通过手动添加引号来解决这个问题不是一个好主意——当string参数包含引号字符时会发生什么?最好的做法是使用事先准备好的语句


另外,Google“little bobby tables”为著名的关于sql参数注入的XKCD漫画,考虑一下如果Bobby Tables的名字找到你的程序变量中的一个会发生什么。

我看到的最大的错误是你没有使用准备好的语句……查询应该如何在普通SQL中?表名和属性名真的是“记录”吗?@ No北极:只是一个提示:我恢复了你的编辑;您添加的换行符使程序格式不正确。@McNellis,是的,我意识到之后,我讨厌滚动。我看到的最大错误是您没有使用准备好的语句。查询应该如何使用纯sql?表名和属性名真的是“记录”吗?@northpole:只是提醒一下:我恢复了您的编辑;你添加的新行使程序格式不正确。@McNellis,是的,我意识到之后,我讨厌滚动。