3

我以前从未编程过,但需要编写一个非常简单的 webapp 来工作。

我试图让这个挖掘查询工作:

dig @8.8.8.8 +nocomments +nostats +noquestion +nocmd google.com any

有了这个perl:

$dig = `/usr/bin/dig \@8.8.8.8 +nocomments +nostats +noquestion +nocmd $query any`;

除了在挖掘结束时它似乎没有识别“任何”并给我:

sh: line 1: any: command not found

我做错了什么愚蠢简单的事情?

4

3 回答 3

11

我敢打赌$query其中有一个换行符,导致您的 shell 被any视为一个新命令。

尝试chomp $query;在系统调用之前删除换行符。更多关于chomp

于 2009-12-05T05:34:02.300 回答
2

您可能应该使用dig ... '$query'它,所以当 shell 看到它时它是单引号的。如果您不这样做,那么 shell 将解释任何元字符。如果有人 "; echo my_key > ~/.ssh/authorized_keys"输入您的网络表单,那么您就完蛋了。即使它仅供内部使用,如果有人在查询中放入带有空格的内容(shell 将分词并传递给 dig 作为两个参数),您也不希望它中断。

你可以使用 perl 的

\Q$查询\E
用潜在的元字符 \escaped 扩展 $query。实际上,这比添加单引号要好得多,如果查询包含单引号字符,它将打破引号。还是超级容易被攻击。这应该会在您的记忆中解决这个问题。

Perl 有安全的方法来使用 system() 函数将 args 指定为字符串列表,避免使用 /bin/sh,而不是将一个字符串作为 shell 命令进行评估。这是最安全的方法,但如果不自己做 pipe && fork && exec,就没有反勾号版本。

于 2009-12-05T06:55:36.160 回答
1

最有可能的是, $query 变量中的某些东西破坏了命令字符串。你能给我们一个失败并给出错误的例子吗?或者显示更多你的脚本?

于 2009-12-05T05:35:52.653 回答