C++转义Mysql单引号


Mysql为什么需要转义

程序执行中未对敏感字符进行过滤,使得攻击者传入恶意字符串与结构化数据查询语句合并,并且执行恶意代码.也就是要防注入。

常见转义

  • \0:ASCII 0(NUL)字符。
  • \':单引号(‘’’)。
  • \":双引号(‘”’)。
  • \b:退格符。
  • \n:换行符。
  • \r:回车符。
  • \t:tab字符。
  • \Z:ASCII 26(控制(Ctrl)-Z)。该字符可以编码为‘\Z’,以允许你解决在Windows中ASCII 26代表文件结尾这一问题。(如果你试图使用mysql db_name < file_name,ASCII 26会带来问题)。
  • \\:反斜线(‘\’)字符。
  • \%:‘%’字符。参见表后面的注解。
  • \_:‘_’字符。参见表后面的注解。

C++转义半角单引号

话不多说,直接上代码了。这个问题折腾我好久了……

void Conver(const char* iinput, char* output)
{
    int i = -1;//记录上次匹配的位置
    int dOffset = 0;//目标字符串游标
    int nCopy = 0;//本次需要成 copy的字节数
    const char*p = input;
    while(*p)
    {
        if(*p == '\\' || *p == '\'' || *p== '"')
        {
            nCopy = p-input-i-1;
            memcpy(output + dOffset, input + i + 1, nCopy);
            dOffset += nCopy;
            *(output + Offset) = '\\';
            *(output + dOffset + 1) = *p;
            dOffset += 2;
            i = p - input;
        }
        p++;
    }
    if( dOffset>0 )//有匹配到,copy最后的字符串
        memcpy(output + dOffset, input + i + 1, p - input - i);
    return;
}