是STL的错误吗?(续)

特定情况下,以下的写法导致最后一个单引号没加上(display为std::string对象):
写法1:
string  strSQL;
strSQL 
=   " WHERE APPEAL_DISPLAY=' " ;
strSQL.append(display);
strSQL.append(
" ' " ); 

写法2:
string  strSQL  =   " WHERE  APPEAL_ DISPLAY=' "   +  display  +   " ' " ;

写法3:
string  strSQL  =   " WHERE  APPEAL_ DISPLAY=' "   +  display  +   " / ' " ;


以下写法不出此问题:
char  szSQL[ 256 ] = {0} ;
string  strSQL;
sprintf(szSQL, 
" WHERE  APPEAL_DISPLAY='%s' " , display.c_str() );
strSQL 
=  szSQL;

调试之前执行了Clean+Rebuild,VC6,操作系统是Win2003,但是另外写一个工程运行上述代码就不出错。

出错的时候display的内存情况:
02083E31   67  7A  44   53  4C  38   37   32   35   36   35   31   31   00   00   gzDSL87256511..   


strSQL的内存:
02080A61   57   48   45   52   45   20   41   50   50   45   41  4C 5F  44   49   WHERE APPEAL_DI
02080A70  
53   50  4C  41   59  3D  27   67  7A  44   53  4C  38   37   32   SPLAY = ' gzDSL872
02080A7F   35   36   35   31   31   00   00   00   00   00   00   00   00   00   00    56511 .......... 

又经过试验,发现display.size() 为256 !所以想象可能还是类似上次的包含/0的问题。
追查display的来源如下:
display = CTAppeal.GetExtenNum();
按想象string不能保存包含/0的字符串,

再次测试:
经过测试:
const  std:: string  display = " sgsg8176216/0/0/0/0 " ;
int  a = display.size();

a==11
string是不会被直接赋值为一个包含/0的字符串的。但是,这里有个问题,就是这样赋值的话应该是被编译器给截断的。所以内存赋值可能string实际可以支持。GetExtenNum()是输出数据库字段的值然后返回,其间也是用string保存数据的,dtl库的内部实现我并不了解,但推测应该还是字符串被赋了包含零的值。
写测试程序如下:
string  str  =   " 123 " ;
str.append(
"/ 0/ 0/ 0 " , 3 );
str.append(
" E " );
string ::size_type srclen = str.size();

seclen为7,内存情况如下:
00E653D9   31   32   33   00   00   00   45   00  CD CD CD CD   123 ...E.屯屯

赋值成功。
 
我的程序因为那个字段的值包含/0,并且保存在了string中,所以在拼SQL的时候,导致单引号拼接失败,最终导致SQL执行失败。
结论:使用string的时候要格外当心/0的问题。恶意使用者可通过向数据库提交包含/0的字符串来使后台程序崩溃(斜杠零攻击)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值