webサイト解析プログラムが完成

うーん…、多分、1週間くらいかなぁ。


いやね、このweb解析プログラムにかけた時間です。


web解析といっても、web上でやるもではございません。
シェルスクリプトで書いているので、そのスクリプトを起動して、ファイルを選択して解析するかたちです。



#!/bin/sh
#coding:utf-8

echo "---------------------------------"
echo "解析プログラムへようこそ。"
echo "HTTPウェブサイトのURLを指定してください。"
echo " 止める場合には、[breaks]と入力してください"
echo " ダウンロード手順をスキップしたい場合は[skip]と入力してください"
echo "---------------------------------"
echo -n "URL >> "

#HTTPwebサイトのURL指定
read URL

#break
if [ $URL = breaks ]; then
echo "プログラムを停止します。"
return 0
#skip
elif [ $URL = skip ]; then
echo "スキップします"

#nomal
else
#ディレクトリ作成の分岐 -- 二回目以降はディレクトリ移動だけ
#面倒なので変数作成
ana_dir='analysis_download'
if [ -d $ana_dir ]; then
echo "ディレクトリに移動します"
cd $ana_dir
else
#初回起動*
echo "ディレクトリを作成します"
mkdir $ana_dir
echo "ディレクトリに移動します"
cd $ana_dir
fi

#ダウンロード -- 404等、HTTPエラー処理は未だやってない
echo "ダウンロードを開始します"
wget $URL

fi

#ディレクトリの中身をリスト
echo "ディレクトリの中身を確認します"
ls


#解析したいファイルを標準入力
echo "解析したいファイルを入力してください"
echo -n ">>"

read fname

#ファイルが存在しない場合の分岐
if [ -e $fname ]; then
echo "ファイルを確認しました。解析に移ります"
else
echo "ファイルを確認できませんでした。プログラムを停止します"
return 0
fi


dir_name="ana_txt"
mkdir $dir_name

#
# パターンをtxtファイルに書き込み

cat $fname | grep java > $dir_name/analysis_pm1.txt #危険度+1
cat $fname | grep ".js" > $dir_name/analysis_pm2.txt #危険度+1
cat $fname | grep Java > $dir_name/analysis_pm3.txt #危険度+1
cat $fname | grep ".swf" > $dir_name/analysis_pm4.txt #危険度+2
cat $fname | grep mailto > $dir_name/analysis_pm5.txt #危険度+2
cat $fname | grep "while" > $dir_name/analysis_pm6.txt #危険度+3
cat $fname | grep "for" > $dir_name/analysis_pm7.txt #危険度+3
cat $fname | grep "window.moveTo" > $dir_name/analysis_pm8.txt #危険度+4

# wcコマンドで単語数を表示するコマンド変数
w1=`wc -m $dir_name/analysis_pm1.txt`
w2=`wc -m $dir_name/analysis_pm2.txt`
w3=`wc -m $dir_name/analysis_pm3.txt`
w4=`wc -m $dir_name/analysis_pm4.txt`
w5=`wc -m $dir_name/analysis_pm5.txt`
w6=`wc -m $dir_name/analysis_pm6.txt`
w7=`wc -m $dir_name/analysis_pm7.txt`
w8=`wc -m $dir_name/analysis_pm8.txt`


# パターンマッチコマンドをif文で条件分岐
# javascriptマッチif文
if [ "$w1" = "0 $dir_name/analysis_pm1.txt" ]; then
if [ "$w2" = "0 $dir_name/analysis_pm2.txt" ]; then
if [ "$w3" = "0 $dir_name/analysis_pm3.txt" ]; then
sleep 1s
else
echo "javascriptタグが見つかりました"
echo "***********************"
echo "危険度+1です"
echo "***********************"
fi
else
echo "javascriptタグが見つかりました"
echo "***********************"
echo "危険度+1です"
echo "***********************"
fi
else
echo "javascriptタグが見つかりました"
echo "***********************"
echo "危険度+1です"
echo "***********************"
fi

# swfマッチif文
if [ "$w4" = "0 $dir_name/analysis_pm4.txt" ]; then
sleep 1s
else
echo "swfファイルへのリンクが見つかりました"
echo "***********************"
echo "危険度+2です"
echo "***********************"
fi
# mailtoマッチif文
if [ "$w5" = "0 $dir_name/analysis_pm5.txt" ]; then
sleep 1s
else
echo "mailtoリンクが見つかりました。"
echo "***********************"
echo "危険度+2です"
echo "***********************"
fi
# whileマッチif文
if [ "$w6" = "0 $dir_name/analysis_pm6.txt" ]; then
sleep 1s
else
echo "whileループを見つけました"
echo "***********************"
echo "危険度+3です"
echo "***********************"
fi
# forマッチif文
if [ "$w7" = "0 $dir_name/analysis_pm7.txt" ]; then
sleep 1s
else
echo "forループを見つけました"
echo "***********************"
echo "危険度+3です"
echo "***********************"
fi
# window.moveTo関数マッチif文
if [ "$w8" = "0 $dir_name/analysis_pm8.txt" ]; then
sleep 1s
else
echo "window.moveTo関数を見つけました。"
echo " クラッシュミーブラクラの可能性が高いです"
echo "***********************"
echo "危険度+4です"
echo "***********************"
fi
# パターンマッチの終了
# テキストファイルの削除
rm -R $dir_name

#----- 作業終了 = 解析終了 -------------------------------------------------#

echo "解析が終了しました"
echo "ファイルをlessコマンドで表示しますか?"
read le

if [ $le = yes ]; then
less $fname
echo "プログラムを終了します"
return 0
else
echo "プログラムを終了します"
return 0
fi





ブラクラである可能性をフィルタリングするために、いろいろと工夫をこらしてあります。


まずは、javascriptやswfファイルがある場合などのパターンをgrepコマンドで確認、その結果をテキストファイル(analysis_pm1~8.txt)に書き込み、そのテキストファイルの中に文字があるかいなかを、wcコマンド-mオプションでまたフィルタリング。
そして、その中身が0(つまりテキストファイルの中になにもない)ときには、grepコマンドの出力結果がないと同等(=)なので、パターンにマッチしませんと出力。それ以外、つまりテキストファイルの中に文字がある場合は、パターンにマッチするとして危険度を判断、という形をとったこと。

このif文羅列のことを僕は濾過(ろか)システムと名づけました。

濾過とは…(まぁ中学生以上の人はしってるかな?)

液体または気体に固体が混ざっている混合物を、細かい穴がたくさんあいた多孔質(ろ材)に通して、穴よりも大きな固体の粒子を液体または気体から分離する操作である。

(wikipediaより引用)


あとは、その濾過システムでパターンにマッチさせるやり方が悩みどころで、それに三日くらい費やしてしまいました。

最初は、grepの出力結果があるかないかを調べたいので、grepコマンド周辺ばかりを検索などして調べていたのですがどうやらそれはできなくて、もう頭の中では整理しづらくなっていたのでアナログの王様紙さまをつかって整理したところ、パターンマッチの仕方(上述)を思いついた、というわけです…


http://www1.axfc.net/uploader/Sc/so/101675.sh

DLワード:kaiseki

疲れたので今日はここまで‥