我的应用程序的用户被要求输入密码才能启动它。要获取密码,我只需使用:
char c;
std::string password;
while ... // until the end of entry
{
c = fgetc(stdin);
password += c;
}
检查密码后,我会销毁该变量,因此无法使用程序的核心映像检索它。例如,如果有人使用“gcore”命令,然后在生成的核心中搜索密码,他们将找不到它。
但就我而言,我仍然可以检索密码值,因为它似乎仍在标准输入缓冲区中。
所以我的问题是如何清除标准输入缓冲区以使用户输入的值在内存中不再可用?
我已经尝试过:fflush、__fpurge、fwrite(从标准输入流的起始位置开始)...但似乎没有任何效果。
我的答案是:不要使用标准 I/O 流 - 使用原始文件 I/O 来代替:
read(STDIN_FILENO, ...)
您必须自己进行行缓冲,但您可以保证库中没有任何内容保留您的输入缓冲区。
既然你使用的是 C++,为什么不直接使用 std::string 类并直接使用
cin>>password
呢?这将消除在键入时使用单独的变量来保存每个字符的需要。如果之后您仍然担心 stdin
的内容是否可用,请使用:
fseek(stdin,0,SEEK_END);
在阅读结束时。在我看来,这比编写旧的(在我看来不太安全)C 方法更容易使用,并且允许您更好地使用 C++ 库。
编写 C++ 代码时的一般经验法则:除非绝对必要,否则不要使用 C。
我对 C++ 完全一无所知,但是我在 C 中所做的要么是 DoxyLover 建议的,要么,如果你想坚持使用标准库......使用它而不缓冲,谷歌搜索“c++ cin unbuffered”确实给出了毕竟有一些结果