セキュリティコード
GoogleSitemapsジェネレータ
サイト探索
リンク元調査
Perl での正規表現
ActivePerl
Perlドキュメント(和訳)
Perlデータ構造
Apache JP
Apache 中核機能
では、[1]から検証
HTML,JavaScript,Flash,CGIを使ったサンプル![]()
以下のファイル(4+1)をまとめたものをダウンロードできます
File: secur_code.zip
ほとんどがFlash(code.swf)を引数つきで呼び出すだけのタグです
Code: download
- <h1>セキュリティコード認証のテスト</h1>
- <form action="check.cgi" method="POST">
- <fieldset><legend>Regist Form</legend><br />
- <h2>登録するユーザ名を入力してください(半角英数字20文字以内)</h2>
- Name : <input type="text" name="name" size="20"><br /><br />
- <h2>右側の画像に表示されている、文字列を入力してください</h2>
- Code : <input type="text" name="code" size="10">
- <script>
- var rand = Math.floor(Math.random()*10000000000);
- document.write('<OBJECT classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" '+
- 'codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0" '+
- 'width="90" height="25" id="code.swf" align="middle"><param name="allowScriptAccess" value="sameDomain">'+
- '<param name="quality" value="high"><param name="bgcolor" value="#000000">'+
- '<param name="movie" value="code.swf"><param name="FlashVars" value="code=' + rand +'">'+
- '<embed src="code.swf" quality="high" bgcolor="#000000" width="90" height="25"'+
- ' name="code.swf" align="middle" allowScriptAccess="sameDomain" FlashVars="code=' + rand + '" '+
- 'type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer">'+
- '</object><input type="hidden" name="ccode" value="'+rand+'">');
- </script>
- <noscript><h2>JavaScriptを有効にしてください</h2></noscript><br /><p><input type="submit" value="送 信"></p>
- </fieldset></form>
- <h3>* 画像が見えにくい場合は、<a href="./">読み込みなおして</a>ください</h3>
- <h3>* 送信後、確認画面を表示します</h3>
1行目で、書き込み用のCGIまでのパスを指定
Code: download
- cginame = "ccode.cgi?code=";
- inval = _root.code;
- lv = new LoadVars();
- lv.onLoad = function() {
- tfCount.text = this.secure_num;
- };
- lv.load(cginame + inval);
今回表示する文字列は、数字に限定しました(0〜9)
Code: download
- use CGI qw(:standard);
- $code_file = 'code.txt';
- $limit = 7200;
- $incode = (param('code') =~ /\d+/) ? param('code') : die;
- $rand_code = sprintf("%d%d%d%d%d", int(rand(10)),int(rand(10)),int(rand(10)),int(rand(10)),int(rand(10)));
- $time = time;
- open(CODE, "+< $code_file") or open(CODE, ">$code_file");
- flock(CODE,2);
- while(<CODE>) {
- $date = (split("\t",$_))[2];
- chomp($date);
- next if (($time-$date)>$limit);
- push @out, $_;
- }
- push @out, "$incode\t$rand_code\t$time\n";
- seek(CODE, 0, 0);
- print CODE @out;
- truncate(CODE, tell(CODE));
- close CODE;
- print "Content-type: text/plain\n\nsecure_num=$rand_code";
3行目は、データ保存ファイル名を指定
Code: download
- use CGI qw(:standard);
- $code_file = 'code.txt';
- $limit = 7200;
- $re_date = time;
- $que = param('que');
- $in{code} = param('code');
- $in{ccode} = param('ccode');
- $in{name} = param('name');
- $secur = sprintf("%d%d%d%d%d", int(rand(10)),int(rand(10)),int(rand(10)),int(rand(10)),int(rand(10)));
- open(FH, "+< $code_file") or die "Can't open $code_file: $!";
- flock(FH,2);
- while(<FH>) {
- chomp;
- my($ccode,$code,$date,$dmy) = split("\t");
- if(($ccode eq $in{ccode}) && ($code eq $in{code}) && (($re_date-$date)<$limit)) {
- push @out, qq($ccode\t$code\t$re_date\t$secur\n);
- $flag = 1;
- $ok_code = $code;
- $save_rand = $ccode;
- $save_time = $date;
- $now = $re_date;
- }
- elsif(($re_date-$date)>$limit) {
- next;
- }
- else {
- $flag = 2 if ($ccode eq $in{ccode});
- push @out, "$_\n";
- }
- }
- seek(FH,0,0);
- print FH @out;
- truncate(FH, tell(FH));
- close(FH);
- if($flag == 1) {
- $sec_code = qq(セキュリティーコードが一致しました) }
- elsif($flag == 2) {
- $sec_code = qq(セキュリティーコードが一致しません) }
- else {
- $sec_code = qq(セキュリティコードの有効期限が過ぎているか無効です) }
- print <<HTML;
- Content-type: text/html\n\n
- <html><head>
- <title>test - check</title></head><body>
- <h1>セキュリティコード認証のテスト - 確認</h1>
- <br />
- <h2>$sec_code</h2>
- <table width="400" border="1" cellspacing="0" cellpadding="3">
- <tr><td>ユーザ名</td><td>$in{name}</td></tr>
- <tr><td class="col">保存されているセキュリティーコード</td><td class="col">$in{code}</td></tr>
- <tr><td>表示されたセキュリティコード</td><td>$ok_code</td></tr>
- <tr><td class="col">保存されている乱数</td><td class="col">$save_rand</td></tr>
- <tr><td>JavaScriptで生成された乱数</td><td>$in{ccode}</td></tr>
- <tr><td class="col">保存されていた日付</td><td class="col">$save_time</td></tr>
- <tr><td>現在の日付(書き換えた日付)</td><td>$now</td></tr>
- </table>
- <br />
- <h3>* 通常はここで確認ボタンを表示してメール送信画面に進みますが省略</h3>
- <br />
- <p><a href="javascript:window.close()">閉じる</a></p>
- </body></html>
- HTML
前回のサイト探索からの続きで
Google Sitemaps用のXMLファイルを出力するスクリプトを作ってみた(コマンド編)
強調されている行番号は前回(サイト探索)からの変更点
Code: download
- use LWP::Simple qw(get head);
- use HTML::LinkExtor;
- use strict;
- my(%seen,%mod_time,%out,$site,$top_url,$freq,$priority);
- $freq = 'weekly';
- $priority = '1.0';
- $top_url = 'http://sieg.xeong.com/';
- $top_url = "http://$top_url" unless $top_url =~ /^https?\b/;
- ($site = $top_url) =~ s/^(http:\/\/.+\/).*$/$1/;
- $site .= "/" unless ($site =~ /\/$/);
- &print_xml_head;
- linker($top_url);
- &print_xml_foot;
- sub linker {
- my $base_url = shift;
- my $parser = HTML::LinkExtor->new(undef, $base_url);
- $parser->parse(get($base_url))->eof;
- my @links = $parser->links;
- for my $linkarray (@links) {
- my @element = @$linkarray;
- my $elt_type = shift @element;
- while(@element) {
- my ($attr_name, $attr_value) = splice(@element, 0,2);
- if( $attr_name eq "href" && $attr_value->scheme =~ /\b(https?)\b/ && $attr_value =~ /^$site/
- && ($attr_value =~ /\.xml?$/i or $attr_value =~ /\.s?html?$/i or $attr_value =~ /\.php.*$/i or $attr_value =~ /\.cgi.*$/i)
- ){
- $attr_value =~ s/^(.+)#.*$/$1/;
- next if(defined $seen{$attr_value});
- my @heads = LWP::Simple::head($attr_value);
- if(@heads) {
- $seen{$attr_value}++;
- my @date = $heads[2] ? gmtime($heads[2]) : gmtime(time);
- $mod_time{$attr_value} = sprintf("%04d-%02d-%02dT%02d:%02d:%02dZ", $date[5]+1900, $date[4]+1, @date[3,2,1,0]);
- }
- }
- }
- }
- for (sort keys %seen) {
- my $mod = $mod_time{$_};
- s/^(.+\.cgi).*$/$1/i;
- s/^(.+\.php).*$/$1/i;
- if(defined $out{$_}) {
- next;
- } else {
- $out{$_} = 'true';
- print_xml($_,$mod);
- linker($_);
- }
- }
- }
- sub print_xml_head {
- my %in_url = @_;
- my @date = gmtime(time);
- my $mod_time = sprintf("%04d-%02d-%02dT%02d:%02d:%02dZ", $date[5]+1900, $date[4]+1, @date[3,2,1,0]);
- print <<XML;
- <?xml version="1.0" encoding="UTF-8"?>
- <urlset xmlns="http://www.google.com/schemas/sitemap/0.84"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.google.com/schemas/sitemap/0.84
- http://www.google.com/schemas/sitemap/0.84/sitemap.xsd">\n
- <url>
- <loc>$top_url</loc>
- <lastmod>$mod_time</lastmod>
- <changefreq>$freq</changefreq>
- <priority>$priority</priority>
- </url>\n
- XML
- }
- sub print_xml {
- print qq(<url>\n<loc>$_[0]</loc>\n<lastmod>$_[1]</lastmod>\n</url>\n);
- }
- sub print_xml_foot {
- print qq(\n</urlset>\n);
- }
使い方
6行目で、内容の更新頻度("always", "hourly", "daily", "weekly", "monthly", "yearly", "never")を指定
7行目で、同じサイト内の他のページと比較した優先度(0.0〜1.0)
8行目で探索するURLを指定
Windowsではコマンドラインから、これを実行するとGooglSitemaps用のXMLを表示する
WindowsコマンドプロンプトでのXMLファイル(sitemap.xml)への出力例
perl -w xmlgen.pl > sitemap.xml
Google Sitemaps ジェネレーターを作るにあたり、ネットワークから
サイト内のリンクをたどり、同一サイト内のURLを抽出するスクリプトを作ってみた
Code: download
- use LWP::Simple qw(get head);
- use HTML::LinkExtor;
- use strict;
- my(%seen,%mod_time,%out,$site,$top_url);
- $top_url = 'http://sieg.xeong.com/';
- $top_url = "http://$top_url" unless $top_url =~ /^https?\b/;
- ($site = $top_url) =~ s/^(http:\/\/.+\/).*$/$1/;
- $site .= "/" unless ($site =~ /\/$/);
- linker($top_url);
- sub linker {
- my $base_url = shift;
- my $parser = HTML::LinkExtor->new(undef, $base_url);
- $parser->parse(get($base_url))->eof;
- my @links = $parser->links;
- for my $linkarray (@links) {
- my @element = @$linkarray;
- my $elt_type = shift @element;
- while(@element) {
- my ($attr_name, $attr_value) = splice(@element, 0,2);
- if( $attr_name eq "href" && $attr_value->scheme =~ /\b(https?)\b/ && $attr_value =~ /^$site/){
- # && ($attr_value =~ /\.xml?$/i or $attr_value =~ /\.s?html?$/i or $attr_value =~ /\.php.*$/i or $attr_value =~ /\.cgi.*$/i)){
- $attr_value =~ s/^(.+)#.*$/$1/;
- next if(defined $seen{$attr_value});
- my @heads = LWP::Simple::head($attr_value);
- if(@heads) {
- $seen{$attr_value}++;
- my @date = $heads[2] ? gmtime($heads[2]) : gmtime(time);
- $mod_time{$attr_value} = sprintf("%04d-%02d-%02dT%02d:%02d:%02dZ", $date[5]+1900, $date[4]+1, @date[3,2,1,0]);
- }
- }
- }
- }
- for (sort keys %seen) {
- my $mod = $mod_time{$_};
- # s/^(.+\.cgi).*$/$1/i;
- # s/^(.+\.php).*$/$1/i;
- if(defined $out{$_}) {
- next;
- } else {
- $out{$_} = 'true';
- print qq($_ - $mod\n);
- linker($_);
- }
- }
- }
使い方
6行目で探索するURLを指定
Windowsではコマンドラインから、これを実行するとリンクリストとUTC時間を表示する
Windowsコマンドプロンプトでのテキストファイル(link.txt)への出力例
perl -w linkgen.pl > link.txt
JavaScriptでの例です(とてもめんどうなことになってますが)
Code: [
download]
- <html>
- <body>
- <script src="js.cgi"></script>
- </body>
- </html>
Code: [
download]
- print <<HTML;
- Content-Type: application/x-javascript\n
- rf = parent.document.referrer; //フレーム内なら top.document.referrer
- document.write(rf); //ページに表示するならば
- logurl = "js2.cgi?ref="+rf;
- document.write('<script src="' + logurl + '"></script>');
- HTML
Code: [
download]
- use CGI qw (:standard);
- $ref = param('ref');
- open FH, ">>js.txt";
- print FH "$ref\n";
- close FH;
# 半角スペース
$str = '\x20';
# 全角スペース
$str = '(?:\xA1\xA1)'; # EUC-JP
$str_sjis = '(?:\x81\x40)'; # SJIS
# 全角数字 [0-9]
$str = '(?:\xA3[\xB0-\xB9])'; # EUC-JP
$str_sjis = '(?:\x82[\x4F-\x58])'; # SJIS
# 全角大文字 [A-Z]
$str = '(?:\xA3[\xC1-\xDA])'; # EUC-JP
$str_sjis = '(?:\x82[\x60-\x79])'; # SJIS
# 全角小文字 [a-z]
$str = '(?:\xA3[\xE1-\xFA])'; # EUC-JP
$str_sjis = '(?:\x82[\x81-\x9A])'; # SJIS
# 全角アルファベット [A-Za-z]
$str = '(?:\xA3[\xC1-\xDA\xE1-\xFA])'; # EUC-JP
$str_sjis = '(?:\x82[\x60-\x79\x81-\x9A])'; # SJIS
# 全角ひらがな [ぁ-ん]
$str = '(?:\xA4[\xA1-\xF3])'; # EUC-JP
$str_sjis = '(?:\x82[\x9F-\xF1])'; # SJIS
# 全角ひらがな(拡張) [ぁ-ん゛゜ゝゞ]
$str = '(?:\xA4[\xA1-\xF3]|\xA1[\xAB\xAC\xB5\xB6])'; # EUC-JP
$str_sjis = '(?:\x82[\x9F-\xF1]|\x81[\x4A\x4B\x54\x55])'; # SJIS
# 全角カタカナ [ァ-ヶ]
$str = '(?:\xA5[\xA1-\xF6])'; # EUC-JP
$str_sjis = '(?:\x83[\x40-\x96])'; # SJIS
# 全角カタカナ(拡張) [ァ-ヶ・ーヽヾ]
$str = '(?:\xA5[\xA1-\xF6]|\xA1[\xA6\xBC\xB3\xB4])'; # EUC-JP
$str_sjis = '(?:\x83[\x40-\x96]|\x81[\x45\x5B\x52\x53])'; # SJIS
# 半角カタカナ [ヲ-゜]
$str = '(?:\x8E[\xA6-\xDF])'; # EUC-JP
$str_sjis = '[\xA6-\xDF]'; # SJIS
# EUC-JP文字
$ascii = '[\x00-\x7F]'; # 1バイト EUC-JP文字
$twoBytes = '(?:[\x8E\xA1-\xFE][\xA1-\xFE])'; # 2バイト EUC-JP文字
$threeBytes = '(?:\x8F[\xA1-\xFE][\xA1-\xFE])'; # 3バイト EUC-JP文字
$character = "(?:$ascii|$twoBytes|$threeBytes)"; # EUC-JP文字
# EUC-JP文字(機種依存文字・未定義領域・3バイト文字を含まない)
$character_strict = '(?:[\x00-\x7F]|' # ASCII
'\x8E[\xA1-\xDF]|' # 半角カタカナ
'[\xA1\xB0-\xCE\xD0-\xF3][\xA1-\xFE]|' # 1,16-46,48-83区
'\xA2[\xA1-\xAE\xBA-\xC1\xCA-\xD0\xDC-\xEA\xF2-\xF9\xFE]|' # 2区
'\xA3[\xB0-\xB9\xC1-\xDA\xE1-\xFA]|' # 3区
'\xA4[\xA1-\xF3]|' # 4区
'\xA5[\xA1-\xF6]|' # 5区
'\xA6[\xA1-\xB8\xC1-\xD8]|' # 6区
'\xA7[\xA1-\xC1\xD1-\xF1]|' # 7区
'\xA8[\xA1-\xC0]|' # 8区
'\xCF[\xA1-\xD3]|' # 47区
'\xF4[\xA1-\xA6])'; # 84区
# EUC-JP未定義文字(機種依存文字・3バイト文字を含む)
$character_undef = '(?:[\xA9-\xAF\xF5-\xFE][\xA1-\xFE]|' # 9-15,85-94区
'\x8E[\xE0-\xFE]|' # 半角カタカナ
'\xA2[\xAF-\xB9\xC2-\xC9\xD1-\xDB\xEB-\xF1\xFA-\xFD]|' # 2区
'\xA3[\XA1-\xAF\xBA-\xC0\xDB-\xE0\xFB-\xFE]|' # 3区
'\xA4[\xF4-\xFE]|' # 4区
'\xA5[\xF7-\xFE]|' # 5区
'\xA6[\x89-\xC0\xD9-\xFE]|' # 6区
'\xA7[\xC2-\xD0\xF2-\xFE]|' # 7区
'\xA8[\xC1-\xFE]|' # 8区
'\xCF[\xD4-\xFE]|' # 47区
'\xF4[\xA7-\xFE]|' # 84区
'\x8F[\xA1-\xFE][\xA1-\xFE])'; # 3バイト文字
# SJIS文字
$oneByte_sjis = '[\x00-\x7F\xA1-\xDF]'; # 1バイト SJIS文字
$twoBytes_sjis =
'(?:[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])'; # 2バイト SJIS文字
$character_sjis = "(?:$oneByte_sjis|$twoBytes_sjis)"; # SJIS文字
# SJIS文字(機種依存文字・未定義領域を含まない)
$character_sjis_strict = '(?:[\x00-\x7F\xA1-\xDF]|' # ASCII,半角カタカナ
'[\x89-\x97\x99-\x9F\xE0-\xE9][\x40-\x7E\x80-\xFC]|' # 17-46,49-82区
'\x81[\x40-\x7E\x80-\xAC\xB8-\xBF\xC8-\xCE\xDA-\xE8\xF0-\xF7\xFC]|' # 1,2区
'\x82[\x4F-\x58\x60-\x79\x81-\x9A\x9F-\xF1]|' # 3,4区
'\x83[\x40-\x7E\x80-\x96\x9F-\xB6\xBF-\xD6]|' # 5,6区
'\x84[\x40-\x60\x70-\x7E\x80-\x91\x9F-\xBE]|' # 7,8区
'\x88[\x9F-\xFC]|' # 15,16区
'\x98[\x40-\x72\x9F-\xFC]|' # 47,48区
'\xEA[\x40-\x7E\x80-\xA4])'; # 83,84区
# SJIS未定義文字(機種依存文字を含む)
$character_sjis_undef =
'(?:[\x85-\x87\xEB-\xFC][\x40-\x7E\x80-\xFC]|' # 9-14,85-120区
'\x81[\xAD-\xB7\xC0-\xC7\xCF-\xD9\xE9-\xEF\xF8-\xFB]|' # 1,2区
'\x82[\x40-\x4E\x59-\x5F\x7A-\x7E\x80\x9B-\x9E\xF2-\xFC]|' # 3,4区
'\x83[\x97-\x9E\xB7-\xBE\xD7-\xFC]|' # 5,6区
'\x84[\x61-\x6F\x92-\x9E\xBF-\xFC]|' # 7,8区
'\x88[\x40-\x7E\x80-\x9E]|' # 15,16区
'\x98[\x73-\x7E\x80-\x9E]|' # 47,48区
'\xEA[\xA5-\xFC])'; # 83,84区
# iモード対応 絵文字
$iPictograph_base = '(?:\xF8[\x9F-\xFC]|' # 基本絵文字(SJIS)
. 'F9[\x40-\x49\x50-\x52\x55-\x57\x5B-\x5E\x72-\x7E\x80-\xB0])';
$iPictograph_ext = '(?:F9[\xB1-\xFC])'; # 拡張絵文字(SJIS)
$iPictograph =
'(?:$iPictograph_base|$iPictograph_ext)'; # iモード対応 絵文字(SJIS)