我们正在获得PCI PA-DSS认证,其中一项要求是避免将干净的PAN(卡号)写入磁盘.应用程序不会将此类信息写入磁盘,但如果操作系统(在本例中为Windows)需要交换,则将内存内容写入页面文件.因此,应用程序必须清理内存以防止RAM捕获器服务读取敏感数据.
有三种情况需要处理:
memsetmemset例如:
void test()
{
char card_number[17];
strcpy(card_number, "4000000000000000");
}
Run Code Online (Sandbox Code Playgroud)
在执行测试之后,存储器仍然包含card_number信息.
一条指令可以在测试结束时将变量card_number归零,但这应该适用于程序中的所有函数.
memset(card_number, 0, sizeof(card_number));
Run Code Online (Sandbox Code Playgroud)
有没有办法在某个时刻清理堆栈,就像程序结束前一样?
我知道这段代码不能用作"预期".只是快速查看此代码,我们认为返回值应为1,但在执行时它返回3.
// incorrect
variable = 1;
switch (variable)
{
case 1, 2:
return 1;
case 3, 4:
return 2;
default:
return 3;
}
Run Code Online (Sandbox Code Playgroud)
并且有一些正确的选项可以做到这一点:
// correct 1
variable = 1;
switch (variable)
{
case 1: case 2:
return 1;
case 3: case 4:
return 2;
default:
return 3;
}
Run Code Online (Sandbox Code Playgroud)
要么
// correct 2
switch (variable)
{
case 1:
case 2:
return 1;
case 3:
case 4:
return 2;
default:
return 3;
}
Run Code Online (Sandbox Code Playgroud)
我想知道为什么不正确的表单编译没有错误甚至警告(至少在Borland C++编译器中).
编译器在该代码中理解什么?
是否有可能检测到某些串行端口是否被Windows上运行的另一个进程嗅探?
我们有一个应用程序可以接收一些其他人无法读取的敏感数据.因此,在打开串口之前,我们需要检查端口是否受到监控.
我们可以使用CreateFileWindows API函数打开具有独占访问权限的串行端口,但如果监视器在我们的调用之前运行,它可以读取所有通信(它打开具有共享访问权限的串行端口,因此我们可以打开端口同一时间).为避免这种情况,尝试检查端口是否受到监视并引发异常,警告用户.是否有可能做到这一点?