命令行界面中的敏感数据
Sensitive Data in Command Line Interfaces
我知道在这个例子中的命令行界面中使用密码是不受欢迎的:
./commandforsomething -u username -p plaintextpassword
我的理解是这样做的原因(至少在 unix 系统中)是因为它可以在回滚以及 .bash_history 文件(或任何风格 shell 你用)。
但是,我想知道在编程时以编程方式使用这种接口处理敏感数据是否安全。例如,在 perl 中,您可以使用两个 ``、exec 命令或系统命令来执行命令(除了来自两个反引号的 return 值之外,我不是 100% 确定它们之间的区别已执行命令的输出与 return 值的对比...但我猜这是另一个 post 的问题)。
所以,我的问题是:做这样的事情安全吗
system("command", "userarg", "passwordarg");
因为它本质上做同样的事情,只是没有在回滚或历史记录中得到 posted? (请注意,我仅以 perl 为例——我不关心特定于 perl 的答案,而是普遍接受的原则)。
这不仅仅是关于 shell 历史。
ps
显示传递给程序的所有参数。像这样传递参数不好的原因是你可能通过循环并执行 ps
来看到其他用户的密码。引用的代码不会有太大变化,因为它本质上是一样的。
您可以尝试通过环境传递一些秘密,因为如果用户无权访问给定进程,则不会显示环境。这更好,但也是一个非常糟糕的解决方案(例如:如果程序失败并转储核心,所有密码都将写入磁盘)。
如果您使用环境变量,请使用ps -E
,它会显示进程的环境变量。将其用作与执行程序的用户不同的用户。基本上模拟 "attacker" ,看看你是否可以窥探密码。在正确配置的系统上你不应该能够做到这一点。
我知道在这个例子中的命令行界面中使用密码是不受欢迎的:
./commandforsomething -u username -p plaintextpassword
我的理解是这样做的原因(至少在 unix 系统中)是因为它可以在回滚以及 .bash_history 文件(或任何风格 shell 你用)。
但是,我想知道在编程时以编程方式使用这种接口处理敏感数据是否安全。例如,在 perl 中,您可以使用两个 ``、exec 命令或系统命令来执行命令(除了来自两个反引号的 return 值之外,我不是 100% 确定它们之间的区别已执行命令的输出与 return 值的对比...但我猜这是另一个 post 的问题)。
所以,我的问题是:做这样的事情安全吗
system("command", "userarg", "passwordarg");
因为它本质上做同样的事情,只是没有在回滚或历史记录中得到 posted? (请注意,我仅以 perl 为例——我不关心特定于 perl 的答案,而是普遍接受的原则)。
这不仅仅是关于 shell 历史。
ps
显示传递给程序的所有参数。像这样传递参数不好的原因是你可能通过循环并执行 ps
来看到其他用户的密码。引用的代码不会有太大变化,因为它本质上是一样的。
您可以尝试通过环境传递一些秘密,因为如果用户无权访问给定进程,则不会显示环境。这更好,但也是一个非常糟糕的解决方案(例如:如果程序失败并转储核心,所有密码都将写入磁盘)。
如果您使用环境变量,请使用ps -E
,它会显示进程的环境变量。将其用作与执行程序的用户不同的用户。基本上模拟 "attacker" ,看看你是否可以窥探密码。在正确配置的系统上你不应该能够做到这一点。