我正在开发一个应用程序,该应用程序可以使用QTcp*建立服务器-客户端连接
客户端向服务器发送一个号码。
接收到的字符串会根据其长度和质量进行检查(它真的是一个数字吗?)
如果一切正常,那么服务器会返回一个文件路径(取决于发送的号码)。
客户端会检查该文件是否存在以及它是否是有效的映像。如果文件符合规则,则会对文件执行命令。
这种类型的连接存在哪些安全问题?
该程序是为Linux系统设计的,映像文件上的外部命令使用QProcess执行。如果发送的字符串包含类似的内容(不要运行以下命令):
; rm -rf /
则它将在未找到文件的安全检查中被阻止(因为它不是文件路径)。如果没有对发送的字符串的有效性进行任何检查,那么将执行以下命令:
command_to_run_on_image ; rm -rf /
这会引起恐慌!但这不可能发生。
那么,我有什么需要考虑的吗?
如果打开控制台并键入command ; rm -rf /*
,则可能会发生不好的情况。这是因为命令是由shell处理的。它解析文本输出,例如按;
分隔符拆分命令,按空格拆分参数,然后使用系统API使用解析的参数执行解析的命令。
但是,当您使用process->start("command", QStringList() << "; rm -rf /*");
时,就没有这种危险。QProcess
不会执行shell。它将使用系统API直接执行command
。结果将类似于在shell中运行command "; rm -rf /*"
。
因此,你可以确保只有你的命令会被执行,参数会按原样传递给它。唯一的危险是攻击者可能会用他可以构造的任何文件路径调用命令。后果取决于命令的作用。