SSIを使う(その3)
SSIでシステムコマンドを実行する。
これは危険性が高いが便利な機能でもある。
不正アクセス者が狙うのもまさにこの方法であり、cgiのパラメータとして実行可能なシェルを送り込みパスワードファイルなどを盗み取っていくというわけだ。
従ってシステムコマンドの実行には十分な注意を払わなくてはいけない。
例えおかしな文字列が因数として渡されたとしても、それを安易に実行してしまうような事がないようにしなければいけないのだ。
TRACEROUT
tracerouteをご存じだろうか?サンプルはこれだが、インターネット上のデータがどの様なサイト(ルータ)を通って目的地にたどり着くか,また、その時に必要となる伝送時間がどの程度なのかを知ることが出来る機能である。
unixのシェル上からはtraceroute hogehoge.co.jp などとすればよいわけだが、これをブラウザから実行するためには少々工夫が必要になる。
#!/bin/sh
# traceroute のパスを指定します。
TRACEROUTE=/usr/sbin/traceroute
# このスクリプトの名前を指定します。
SCRIPTURL=./nph-trace_usa.cgi
# HTTPヘッダを出力します。
echo HTTP/1.0 200 OK
echo Content-type
text/html
echo Server
$SERVER_SOFTWARE
echo
cat << EOM
#表示されるタイトルとメッセージ,背景等を指定します。
<HTML><HEAD><TITLE>Traceroute</TITLE>
</HEAD><BODY TEXT="#000000" BGCOLOR="#F0F0B0"
LINK="#0000FF" VLINK="#FF0000" ALINK="#333333">
<H1><FONT COLOR="0080ff">Fast & First TRACEROUTE</H1></FONT>
EOM
#入力のローレベルエラーチェック
if [ -x $TRACEROUTE ]; then
if [ $# = 0 ]; then
cat << EOM
#表示されるコメントを指定します。
<p>あなたのPCからの経路と時間を調べる場合は <a href="$SCRIPTURL?$REMOTE_HOST">ここをクリックして下さい($REMOTE_HOST)</a></p>
任意のホスト名を入れれば www.cds.co.jp からの経路と時間が分かります↓
<ISINDEX>
#ここでtracerouteを実行します。
EOM
else
echo "Result for <b>$1</b>
"
echo \<PRE\>
nice $TRACEROUTE "$1" 2>&1 #$1には引数が入っている
echo \</PRE\>
fi
else
echo Cannot find traceroute on this system.
fi
cat << EOM
#フッタを指定します。
Tracerouteのマニュアルは<A HREF="trace_man.htm">こちら</A>
<A HREF="http://www.fnf.jp/">戻る</A>
</BODY></HTML>
EOM
これがスクリプトで、nph-trace_usa.cgiと言う名前で実行するわけだ。
tracerouteを指定しているところ(TRACEROUTE=/usr/sbin/traceroute)をnslookupとかpingに変えれば好きなコマンドを実行することが出来る。