Perl/Perlの基礎知識

安全なPerlプログラムを書くための3つのポイント(3ページ目)

プログラミングをしていると知らずのうちにバグやセキュリティホールを生み出してしまう事があります。うっかりミスが大きな問題に発展しないように、プログラミング時の3つのポイントをご紹介します。

井上 みやび子

執筆者:井上 みやび子

Perlガイド

ポイント2: 外から来た値の汚染チェック

先ほどのプログラムは、ファイル名にディレクトリを含めなければ期待通り動きます。でもその他にも、入力ミスの可能性がありますよね。

例えば、以下のように、数字の入力ミスをしてしまいました。「20」と打ち込みたかったのに、指が1段ずれて「wp」となってしまいました。
% perl prog.pl
笑う長さを指定して下さい(数字): wp
保存するファイル名を指定して下さい(半角英数字): laughter.txt 
Argument "wp" isn't numeric in division (/) at prog.pl line 38, <STDIN> line 2.
Use of uninitialized value $output in concatenation (.) or string at prog.pl line 53, <STDIN> line 2.
この場合上記のように、「Argument "wp" isn't numeric in division(割り算しているけど"wp"は数字じゃないよ)」と怒られます。また、長さの指定がされていないため、その後の処理もうまくいかず「Use of uninitialized value .... line 53」という警告も表示されてしまいました。

このように、外から受け付けた値をプログラムで扱う時には、必ずその値が形式通りかをチェックする必要があります。これはとても重要な点なので必ず心に留めておいて下さい。例えば、WebプログラミングでWebサイトのフォームから値を受け取るときなども一緒です。

【ポイント2】外から受付けた値は形式チェック

さてでは、入力チェックを追加したプログラムは以下のようになります。

正規表現(※2)を使って、以下の点をチェックする事にしました。
  • 長さの指定は数字でかつ0より大きい
  • ファイル名は英数字とドット、アンダーバー、ハイフンでのみ構成される
※2 正規表現の基礎は「Perl の正規表現で文字検索」をご覧下さい。

サンプルプログラム: 入力チェックの追加後
#指定した回数笑うプログラム

use strict;
use warnings;
use utf8;

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

my ($length, $outfile);

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

if ($length_input =~ m/^\d+$/ and 0 < $length_input){
$length = $length_input;
} else {
die "長さの指定が違います。\n";
}

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

if ($outfile_input =~ m/^[a-zA-Z0-9._-]+$/){
$outfile = $outfile_input;
} else {
die "ファイル名の指定が違います。\n";
}

#以下同じ
こうして実行すると、入力が形式にそわない場合はその場で実行を中止する事ができます。
% perl prog.pl 
笑う長さを指定して下さい(数字): wp
長さの指定が違います。
% perl prog.pl
笑う長さを指定して下さい(数字): 20
保存するファイル名を指定して下さい(半角英数字): present/result.txt
ファイル名の指定が違います。

>次は: さらに強力な汚染チェック(テイントモード)
  • 前のページへ
  • 1
  • 2
  • 3
  • 4
  • 6
  • 次のページへ

あわせて読みたい

あなたにオススメ

    表示について

    カテゴリー一覧

    All Aboutサービス・メディア

    All About公式SNS
    日々の生活や仕事を楽しむための情報を毎日お届けします。
    公式SNS一覧
    © All About, Inc. All rights reserved. 掲載の記事・写真・イラストなど、すべてのコンテンツの無断複写・転載・公衆送信等を禁じます