我之前从未编程,但需要编写一个非常简单的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
我做错了什么愚蠢的事情?
答案 0 :(得分:11)
我敢打赌$query
中有一个换行符,导致你的shell将any
视为新命令。
在系统调用之前尝试执行chomp $query;
以删除换行符。更多关于chomp。
答案 1 :(得分:2)
你应该使用dig ... '$query'
所以当shell看到它时它是单引号。如果你不这样做,那么shell将解释任何元字符。如果有人将"; echo my_key > ~/.ssh/authorized_keys"
放入您的网络表单中,那么您就会被搞砸了。即使它仅供内部使用,如果有人在查询中放入带空格的东西(shell会将其拆分并传递给挖掘为两个参数),您不希望它破坏。)
你可以使用perl的
\Q$query\E来扩展$ query,并且可以使用永久元字符\ escapeped。实际上,这比添加单引号要好得多,如果查询包含单引号字符,它将突破引号。仍然超级容易攻击。这should fix that in into your memory。
Perl有安全的方法来使用system()函数将args指定为字符串列表,避免使用/ bin / sh,而不是将一个字符串作为shell命令进行求值。这是最安全的方式,但没有做管道和放大器的情况下没有后退版本。叉子&&执行自己。
答案 2 :(得分:1)
最有可能的是,$ query变量中的某个东西正在破坏命令字符串。你能告诉我们一个失败并给出错误的例子吗?或者展示一下你的剧本?