我用MySQL++来操作数据库的,数据库中有两张表wealth和account。有段代码像这样:void func(const char* name)
{
    char buf[256];
    const char* sql = "SELECT coin FROM wealth WHERE id=(SELECT id FROM account \
                  WHERE name='%s'";
    sprintf(buf, sql, name)
    
    // exceute sql
}
name这个参数是由客户端传过来的,这样是否很容易被注入?该如何防范呢?

解决方案 »

  1.   

    name这个字符串的长度是被限制了的,上面的代码只是为了演示所以没有写的太细节。
      

  2.   


    stmt_bind是API还是库?
    搜索出来没有太多结果
      

  3.   

    name是没有限制的,可以有任何字符。所以弄起来比较麻烦。name里面一旦包含一个单引号mysql++就抛异常了。
      

  4.   

    name 把这个传入变量中的 ' 全部转为 '' 就可以了。
      

  5.   

    你自己对name进行特殊字符转义后再传入数据库不行吗