スポンサーリンク

Perlでのファイル処理で、コマンド実行をさせたくない(コマンドインジェクションを避けたい)場合は、open()ではなく、sysopen()を使うことを推奨します。


なぜopen()は危険なのか?

Perlでファイルを開くときにopen()を使ったりすると思いますが、このopen()はくせ者です。
なにがくせ者かというと、 | (pipe, パイプ) があると、その文字列を実行してくれます。
パラメータで渡ってきた文字列をopen()するプログラムを書いてしまうと、問題になることがあります。

パラメータで本来 foo だけ欲しい(とする)のですが、ここでは、

|cat /etc/passwd;foo

が渡ってきたとします。このサンプルでは、/etc/passwdの内容を出力してしまいます。

#!/usr/local/bin/perl
use strict;
use warnings;
my $file = "|cat /etc/passwd;foo";
open (F, "$file.txt") or die "can not open";
while (my $line = <F>) {
	print $line;
}
close (F);

open()の代わりにどうすればいいのか?

入力された文字列に、パイプがあるかどうかチェックするのもいいですが、ここでの対策では、sysopen()を使うやり方を紹介します。
sysopen()はopen()と違って、第2引数の文字列がパイプで始まっていても外部コマンドを実行しません。

#!/usr/local/bin/perl
use strict;
use warnings;
use Fcntl;
my $file = "|cat /etc/passwd;foo";
sysopen (F, "$file.txt", O_RDONLY) or die "can not open";
while (my $line = <F>) {
	print $line;
}
close (F);


スポンサーリンク
スポンサーリンク
 
いつもシェア、ありがとうございます!


もっと情報を探しませんか?

関連記事

最近の記事

人気のページ

はてなの人気のブックマーク

スポンサーリンク
 

過去ログ

2019 : 01 02 03 04 05 06 07 08 09 10 11 12
2018 : 01 02 03 04 05 06 07 08 09 10 11 12
2017 : 01 02 03 04 05 06 07 08 09 10 11 12
2016 : 01 02 03 04 05 06 07 08 09 10 11 12
2015 : 01 02 03 04 05 06 07 08 09 10 11 12
2014 : 01 02 03 04 05 06 07 08 09 10 11 12
2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12
2003 : 01 02 03 04 05 06 07 08 09 10 11 12

サイト

Vim入門

C言語入門

C++入門

JavaScript/Node.js入門

Python入門

FreeBSD入門

Ubuntu入門

セキュリティ入門

パソコン自作入門

ブログ

トップ


プライバシーポリシー