能力值:
( LV13,RANK:1760 )
2 楼
Good job...
能力值:
( LV2,RANK:10 )
3 楼
使用新的增强安全的CRT函数有什么好处呢?简单地说,新的函数加强了对参数合法性的检查以及缓冲区边界的检查,如果发现错误,会返回errno或抛出异常。老版本的这些CRT函数则没有那么严格的检查与校验,如果错误地传输了参数或者缓冲区溢出,那么错误并不能被立刻发现,对于定位程序错误也带来更大困难。
简单的说,安全函数并不是说会帮你做截断的工作 ,strcpy 对应的截断版本是strncpy 。
strcpy_s 的作用是让错误直接暴露出来 ,也就是超出范围直接就挂掉, 防止缓冲区溢出利用。
在debug版本中加了断言, 可以方便的在调试阶段就暴露问题。
能力值:
( LV4,RANK:50 )
4 楼
安全函数会重新设置SEH ,导致外部无法捕获~ 直接 “崩~”弹出来给用户~ 一点都不友好;报错地址还不好定位。 还不如不用安全函数 生成minidump 呢;
能力值:
( LV2,RANK:10 )
5 楼
对~~ 这函数是个坑,直接用strncpy来得好。
能力值:
( LV8,RANK:130 )
6 楼
试试就知道哪不对了,如果应用到项目中,就知道后果了,它会带来前所未有点麻烦。
能力值:
( LV2,RANK:10 )
7 楼
memcpy最安全。
能力值:
( LV2,RANK:10 )
8 楼
再回复你下吧
错误越早暴露越好,暴露的越明显越好.
_s安全函数它不是让你的代码可以无异常的运行,而是让错误立即暴露,让你修改程序.它在万一你忘了检查或者截断数据的情况下,告诉你"黑,这里有问题".通过迫使你修改程序,从根本过上提高安全性,而不是默默代替你处理一切,毕竟_s函数不会知道这里的数据是否可以截断.
当然,这里有个假设,你会在程序发布前做充分的测试,这样才能暴露问题.
然后,万一你还是搞出了漏洞,入侵者来了,程序会奔溃,你觉的不安全了,
哪你和被入侵者成功得手相比呢?安全函数保证系统是安全的,数据是安全的,服务器不会被做成肉鸡,这有什么不好?
安全函数不是"智能保安",是"最终保险",在所有拦截都失效时的和敌人同归于尽的最后手段.
使用它,但不要依赖它.
能力值:
( LV8,RANK:130 )
9 楼
错误发现越早越好解决,*_s函数作用就在于此。当字符串越界时,不带s的函数可能不会崩溃,但是堆写坏了,堆写坏了,你的大楼一样会垮,而且估计垮的时候,还顺带把你一起杀死。另外strcmp是没有_s的版本,因为不需要。
能力值:
( LV8,RANK:130 )
10 楼
你们真的在使用strcpy_s吗?不怕程序挂?难道你们的程序都不是服务器程序?挂了意味着什么,大家都应该知道的吧
能力值:
( LV8,RANK:130 )
11 楼
服务程序要7*24小时运行的,一般必须会有重新拉起机制,和使用_s函数不矛盾。
能力值:
( LV4,RANK:40 )
12 楼
lstrcpyn的内部实现大概如下
一个for 循环COPY 字符串,当发现BUFFER的SIZE比SRC的字符小的时候,它会把BUFFER的最后一个字节强制填充为\0.以此保证BUFFER内容不被利用。
这函数完全可以自己写。 至于strcpy_s这个在DEBUG版本下的实现是先COPY,当发现BUFFER的SIZE比SRC的字符小的时候,此时函数内部会把BUFFER的第一个字符填充为\0,然后再写入0xFEFFFFFF,此时这个BUFFER完就被改写了,然后它再调用CRT的一个函数弹一个警告(也就是我们常说的断言),这个机制实现,很明显是为了防止 程序被栈溢出而被别人利用。而它的RELEASE版本下,当问题发生时,它只是把BUFFER的第一个字节填充为\0,然后再调用CRT的另一个函数(该函数是检察参数是否有效的),然后在这个函数调用完之后程序立即死亡。
从上面可以知道无论是DEBUG还是RELEASE其最主要的目的是为了防止 程序栈溢出而被利用。也就是LS上很多朋友说的 使问题提前暴露。而lstrcpyn完全就不会有这个特性。
如果让我建议的话我还是建议使用strcpy_s,这样问题才能暴露出来,程序的健壮性才能够得到保证。
PS:一些题外话,带S这种函数应该是以前M$被溢出怕了才出现的,所以说带S的安全也只是针对这种情况下才说的。
就LZ前面说的一大堆假设,服务器程序崩溃了,确实会引起很大的麻烦,不过这些和使用这几个函数确实没多大关系,现在还有人写的服务程序没有对应的容错机制吗?
能力值:
( LV2,RANK:10 )
13 楼
服务程序数据被覆盖了更可怕。。。比如交易程序。。100覆盖成100W 。。。防溢出检查出错都是直接退出进程的。。
能力值:
( LV2,RANK:10 )
14 楼
要捕获异常的话,用_set_invalid_parameter_handler就可以。
我认为他并不是重置了SEH,而是在捕获函数里直接abort了
能力值:
( LV4,RANK:50 )
15 楼
这种方式的捕获,你也不方便定位问题函数具体行号;没有minidump
哥们是不是还有啥没说完~ 求指教!
能力值:
( LV12,RANK:340 )
16 楼
个人认为:
安全函数就是在溢出的时候,弹出异常,而避免溢出后的问题。
好处是能及时发现漏洞,坏处是程序直接崩了。
如果仅仅为了不溢出,可以自己比较缓冲区大小,符合条件在调用"非安全"的函数。
能力值:
( LV2,RANK:10 )
17 楼
就是用了安全函数还是要自己判断缓冲区大小的,然后给出合适的处理,安全函数是在你万一忘记了检测,或者检测不得法的时候,给你最后的保障.
能力值:
( LV3,RANK:20 )
18 楼
都溢出了,你还希望他不要挂,我只能说你没调试过大型程序的bug吧
程序稳定是你逻辑上确保的,你自己代码写的不好程序老挂为什么要怪到这个函数头上?
能力值:
( LV2,RANK:10 )
19 楼
唔抱歉现在才看到……
void _invalid_parameter(
const wchar_t * expression,
const wchar_t * function,
const wchar_t * file,
int line,
uintptr_t pReserved
);
以上这些参数在debug模式下都是有效的,当然minidump就没有了。。。
我试了一下hook abort 让他直接返回的话是可以正常运行下去的,逆了下abort没怎么看懂……我渣
能力值:
( LV8,RANK:130 )
20 楼
为毛不明白呢,难道是我理解错了?
比如聊天程序,你得限制聊天字串大小吧,或者用户名,你得限制长度吧,
客户端可以作限制,但是黑客可以你的协议,不经客户端直接发送到服务器,服务器你可以作检查,检查了,如果字符串过长,您直接丢弃,还是给后面截断了,再复制(strcpy_s)?不是多此一举吗?lstrcpyn可以复制时截断,不是很好吗?也不会溢出,
这不能严格叫溢出,叫截断溢出部分,溢出部分给他截断而已,
难道你收到一个比你规定长度的字符串,服务器就直接挂掉么?那还有什么稳定性而言,我是没有调试过大型 项目bug,但是我的程序,不会出现因为复制字符串而溢出的bug,我的团队,我也不允许他们这么干,对复制字符串的函数,我有严格规定的,能用哪些,不能用哪些,应该怎么使用等等,
而且我的项目,都得做溢出测试,绝对不允许程序掉挂的,即使我的服务器逻辑有异常,但是不能挂掉,一但挂掉,会影响其它用户业务,还有影响 其它服务器,
比如im服务,一但im服务器挂掉了,大量用户会重新连接,这样,即使im聊天服务器重新启动,因为大量用户同时连接,会再次请求其它服务,会给其它服务器,以及im服务器本身,带来大流量冲击,这种 冲击很麻烦,可能导致其它服务再次挂掉,就像骨牌一样,
这是我新身体会过的,以前我也使用strcpy_s,因为有一个地方,没有提前截断超长字符串,从而导致整个程序挂掉,大量用户挂线,然后断时间内,全部重新连接,相当 于一次CC攻击,然后等级服务器,以及头像 服务器,半小时内无响应,数据库服务器,一样受影响 。
然后IDC还发信息来说,服务器受攻击 ,要我处理,不处理给我停服务器。
您觉得这样的事,很好玩吗?
还有,你的服务器程序,难道允许 随时挂掉?然后再开一个监控进程,来重启 服务进程吗?
因为我的容灾处理,做得不好,所以,我不允许 服务器挂,即使逻辑出问题,
您有什么好的,方便的容灾处理方案,方便的话,请告诉我一下好吗?
这样,我就可以允许 我的服务器程序,随时挂掉了。
能力值:
( LV3,RANK:20 )
21 楼
渗透的时候最喜欢这种有异常也不会挂掉的了,被拿了shell用户信息全泄露你觉得更好看来
能力值:
( LV8,RANK:130 )
22 楼
lstrcpyn不会被渗透,如果lstrcpyn被渗透了,strcpy_s还能跑掉吗?不可能的
两者函数,复制字符串功能相同 ,只是一个挂掉,一个不挂而已.
能力值:
( LV2,RANK:10 )
23 楼
楼主还没搞明白,啥叫"最后保障",你自己做了严格的检查,那当然好,但万一你忘了呢?也许楼主水平高不会忘,但还有很多水平不那么高的人,他们会忘记检查.而安全函数的作用就是在万一忘记的情况下,防止损害扩大 .
能力值:
( LV8,RANK:130 )
24 楼
lstrcpyn不需要你检查缓冲区长度,strcpy_s,既需要提供缓冲区长度,又需要你提前检查长度
能力值:
( LV8,RANK:130 )
25 楼
话说,lstrcpyn不会溢出,strcpy-s也不会溢出,但前者不会挂,后者会挂,用哪个,自己选吧