软件安全编码

文章探讨了安全编码中的关键问题,包括使用强输入验证,避免黑名单策略,防止缓冲区溢出,尤其是C/C++中的问题,如gets()函数的安全隐患,以及strncpy()和strncat()的正确使用。此外,提到了SQL注入和字符串操作的潜在风险,强调了动态和静态内存分配中防止数据截断和确保安全内存管理的重要性。
摘要由CSDN通过智能技术生成

常见的安全编码问题:

安全输入

1输入验证方法

强输入验证

白名单

黑名单

间接选择

避免黑名单

不要混淆可用性和安全性

拒绝不良数据

默认执行正确的输入验证

检查输入长度

限制数值输入

2输入验证原则

接受输入,但是不能全部信任

对所有的输入必须进行验证

不要修复恶意的输入

3输入验证内容

所有的输入

各种来源的输入

  • 命令行参数
  • sql注入

建立信任边界

将可信数据和不可信数据分开存储

危害

缓冲区溢出

SQL注入

字符串问题

无边界检查(unbounded string operation)

c/c++没有边界检查

C/C++语言标准库中的许多字符串处理和 IO 流读取函
数是导致缓冲区溢出的罪魁祸首
gets()函数
没有提供方法对输入的字符个数进行限制,会导致缓冲区溢出的问题
使用fgets()和gets_s()进行替换

差一错误(off-by-one-error)

一字节溢出

在比较时使用了<,没有考虑到一个序列是从0开始,而不是从1开始,忽略了字符串最后的结束标志'\0'

strncpy(char* dst,const char* src,size_t n);

常见错误:

将数据写到目标缓冲区外

        边界通过源数据的大小确定,没有考虑目标地址是否会溢出

使用的目标缓冲区没有正确的终止

        没有在缓冲区中写入终止符

        strncpy调用重复写入了NULL终止符

strncat(char* dst,char* src,size_t bound)

        边界参数应该是目标缓冲区剩余容量的大小

        目标缓冲区需要包含NULL终止符

        确保源和目的缓冲区都包含NULL终止符

空结尾错误(Null end error)

字符串截断(string truncation)

如果源数据的长度大于边界参数的值,则有界函数即使调用正确,依然会发生数据截断错误

避免截断错误

  1. 动态内存分配
  2. 静态内存分配面临的2类数据截断错误
    1. 字符串由于目标缓冲区大小的限制导致截断,使得字符串语义被迫截断
    2. 无正确终止符的字符串
  3. 避免悄无生息的截断

安全的内存管理

1.缓冲区溢出

数据写到所分配内存之外的地方

缓冲区溢出漏洞用来覆盖内存中的值,从而达到攻击者的目的

缓冲区溢出错误给攻击者大量机会控制有漏洞的代码

程序内存分配

栈区:类似数据结构中的栈 编译器自动释放

堆区:类似于链表 OS释放

全局区:全局变量和静态变量 OS释放

文字常量区:存放字符串常量 OS释放

程序代码区:存放函数体的二进制代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值