CGI-BBS > CGI > Perl > コマンドの実行


カレッヂ
カレッヂ


質問者 まこと  投稿日 10/26(金) 20:14:00
redhat Linux 7.1 Apache1.3.19 perl5.6.1
WEBページからコマンドを入力し、サーバーでソフトを起動したいのですが可能でしょうか?
可能である場合、
WEBページから渡されたデータ(コマンド)をサーバーで実行する場合の記述方法をご教授いただけますようお願いします。

回答者 しあわせのツボ  [削除]  投稿日 10/27(土) 00:09:18
CGIからのシェルコマンド呼び出しを特に制限していないなら、
system `コマンド`;
で叩くことは可能です。
ただし、入力を$queryに受けて system `$query`; などとすると、とんでもないセキュリティホールになりますので、そうならないよう考えて作って下さい。
回答者 vagabond  [削除]  投稿日 10/29(月) 02:59:38
あのー、systemの引数を``バッククォータで囲うのは違いますよね。
それから、unixのコマンド実行はわたしの知る限り、

1.``バッククォータで囲う。
2.systemで実行
3.forkし、execで実行し、waitする
4.use Shellでmainで定義された関数のようにする。

簡単に実行したいなら1、windowsで使うなら2、複数のコマンドを実行するなら3がお勧めです。
質問者 まこと  [削除]  投稿日 10/29(月) 18:49:11
しあわせのツボさん、vagabondさん、いつもご助言いただきありがとうございます。
只今どのようにすればセキュリティホールにならないか思案しています。
コマンドラインからソフトを起動させる目的だけならば、
ソフトを起動させるコマンドだけを実行できるようにすればいいのですね?  
いかんせんビギナーでございますので、卓上を資料が散乱する中、PCと格闘しています。
また愚問をするかもしれませんが、よろしくお願いします。
回答者 vagabond  [削除]  投稿日 10/31(水) 00:49:10
まず、CGIの使いかたが違います。cgi-libのころの古いものReadParseを使うので、
use CGI qw(:cgi-lib);
CGI::ReadParse;
で、呼び出し、
つぎに、グローバルの%formではなく、%inにhtmlで入力した値が入ります。
先の例では、htmlの入力がname="frent" value="実行"がただ一組となるので、
%in={'frent'=>"実行");
という位置付けになっているでしょう。
質問者 まこと  [削除]  投稿日 11/1(木) 13:35:51
vagabondさん、いつもご指導ありがとうございます。
さて、メールで送っていただいたCGIの_data`部分を"cmd.exe"とし、ローカルサーバーで動作を確認したところ、↓下記のメッセージが現れました。

Can't find string terminator '"' anywhere before EOF at C:\www\vagabond.cgi line 70.

cgi-lib.plはCGIファイルと同じディレクトリに入れてます。
どこがいけないかご指摘いただけないでしょうか?
よろしくお願いします。
回答者 vagabond  [削除]  投稿日 11/2(金) 00:28:20
>Can't find string terminator '"' anywhere before EOF at C:\www\vagabond.cgi line 70
えーと、たぶん、syntax errorのような気がします。(^^;

うちのwin2000のapacheでテストしてみたところ、問題なく実行できますが、なにぶん、
windowsなので、use_shell, back_quoteのみの使用にしてみてください。
具体的には、
6: _date=>'cmd',
10:my $exec_method='back_quote';
と、修正してみてください。あと、use_shellを使う場合、コマンドに従って修正してください。

>cgi-lib.plはCGIファイルと同じディレクトリに入れてます。
cgi-lib.plは使ってないです。
CGI.pmのcgi-libタグをインポートしてるだけなので、同じディレクトリに置かなくともいいですよ。
質問者 まこと  [削除]  投稿日 11/14(水) 08:27:55
解決しました、皆様ありがとうございました。
また、外部からのコマンド実行に関して、どうしてあまり語られないかもわかりました。
非常にリスクを伴うって事も知り、勉強になりました。

このページは終了したので返信(回答)は書きこめません

Web裏技