さて、最近はWebサイトからの情報漏洩などが報道されていますので、「セキュリティホール」という言葉もよく耳にすると思います。「セキュリティホール」というのは、プログラムに問題があるためにできてしまった、正常なシステム運用を脅かす抜け穴の事です。

また、情報漏洩などを引き起こす「セキュリティホール」とまではならなくても、プログラムがうまく動かなくなる「バグ」を含んだプログラムを書いてしまう可能性は常にあります。プログラマも人間ですからね。

自分でプログラムを書いて自分が使う限り、問題が起こったらその都度対処すればいいのですが、自分が書いたプログラムを人に使ってもらったりWebシステムとして公開する場合は、なるべく大きな問題に発展しないように予め色々な配慮をしておく必要があります。

この記事では、安全なPerlプログラムを書くための3つのポイントをご紹介します。

安全なPerlプログラムを書くための3つのポイント

  • ファイルの入出力の成功をチェック
  • 外から来た値の汚染チェック
  • サブルーチンの引数をチェック

問題のあるプログラム例

さて早速ですが、以下のサンプルプログラムを打ち込んで保存して下さい。
指定した回数、笑い声を出力し、ファイルにも保存するプログラムです。

#指定した回数笑うプログラム

use strict;
use warnings;
use utf8;

binmode STDOUT, ':encoding(utf8)'; #Windows は utf8 -> cp932

#設定を入力させる
print '笑う長さを指定して下さい(数字): ';
my $length = <STDIN>;
chomp $length;

print '保存するファイル名を指定して下さい(半角英数字): ';
my $outfile = <STDIN>;
chomp $outfile;

#笑わせる
my $laughter = &laugh($length);

#笑いを出力
print $laughter;

#ファイルにも保存
my $fh;
open ($fh, '>:encoding(utf8)', $outfile);
print $fh $laughter;
close ($fh);

#指定した長さに応じて笑いを返す
#引数:長さ (数値) 
#戻り値:笑い (文字列) 
sub laugh{
my $length = shift;
my $default = 10; #一息長さの初期値
my $breaths = int($length / $default); #10で割った商
my $vowels = $length % $default; #10で割ったあまり
my $output;
for (1..$breaths){
    $output .= sprintf(
    'わーっはっ%s。',
    'は' x $default,
    );
}
if (0 < $vowels){
    $output .= sprintf(
    'わーっはっ%s。',
    'は' x $vowels,
    );
}
return "$output
";
}

テスト実行

このプログラムは実はかなり難アリですが、とりあえず自分で使うのであれば問題ありません。
プログラムを実行すると入力を求めるコロン(「:」)が出て一旦実行が止まりますので、それぞれ指定の値を入力して実行して下さい。

% perl prog.pl 
笑う長さを指定して下さい(数字): 15 (エンター)
保存するファイル名を指定して下さい(半角英数字): laughter.txt (エンター)
わーっはっはははははははははは。わーっはっははははは。

同じディレクトリに laughter.txt というファイルができて笑い声が入っていると思いますので確認して下さい。

笑うサンプルプログラム

笑うサンプルプログラム


>次は: 安全なプログラミングのポイント1 ファイルの入出力のチェック