このスレッドは未解決です(解決したらこちらで解決済にしてください)
<<戻る

perlのサニタイジング このメッセージに返信する
日時: 2011/08/22 15:10
名前: サニ
URL:
perlのサニタイジング記述を教えて下さい。
記事編集 編集

Page: | 1 | 2 | 3 | 4 | 5 | 6 |

Re: perlのサニタイジング このメッセージに返信する
日時: 2011/08/23 21:26
名前: ペングイン
URL: http://blog.trippyboy.com
サニさん

いわゆるそのまま渡されて、HTMLとしてあたいを表示した際にスクリプトなどを書かれちゃう
のを避けたいってことですよね。

「<」などの文字を無効にする方法として「escapeHTML()」関数があるようです(使用経験なし)。
http://perl-memo2.seesaa.net/article/117453609.html
http://www.tokumaru.org/d/20080822.html

自分がCGIを作ったときには、おまじないってことで決まった記述を書いていましたが
単純に「;」や「<」やその他特別な意味を持つものをエスケープする記述でした。
その記述は覚えていません。いくつか古い無料のCGI掲示板をあさりましたが見つけられませんでした。

IPA提供の「安全なウェブサイトの作り方」にも「escpaeHTML」が紹介されています。
Perlに限らずとてもよい情報ですので、ご覧になってみてください。


http://www.ipa.go.jp/security/vuln/websecurity.html

[追記]

該当のPDFに似たような記述がありました。



print "<input ... value=\"".&myEscapeHTML($keyword)."\"...";
print "「".&myEscapeHTML($keyword)."」の検索結果...";
...
# 独自に作成したエスケープ処理関数 myEscapeHTML
sub myEscapeHTML($){
my $str = $_[0];
$str =~ s/&/&amp;/g;
$str =~ s/</&lt;/g;
$str =~ s/>/&gt;/g;
$str =~ s/"/&quot;/g;
$str =~ s/'/&#39;/g;

記事編集 編集
Re: perlのサニタイジング このメッセージに返信する
日時: 2011/08/24 15:37
名前: サニ
URL:
ペングインさん

有り難うございます、早速参考にさせて頂きます。(^^)
記事編集 編集
Re: perlのサニタイジング このメッセージに返信する
日時: 2011/08/24 20:01
名前: サニ
URL:
問題が発生してしまいました。(;_;)

"安全なウェブサイトの作り方"PDFを拝見致しましたが、コードや文章をコピペ出来ない様細工されて
おりました。一部分をコピーすると、数個ずつの同じ文字列が並んだ状態でペーストされます。

PDFには透明な四角形が単語を囲うように配置されており、せっかくのコードですが自力で入力し
直す他手が無い様です。その為、読み上げ機能も正常に機能せず若干がっかりしてしまいました。
(同じ文字列を繰り返し読み上げる)

せっかくIPAから提供された判り易いPDFでしたが、上記の通り通常のPDFに比べかなり扱い辛い部分があり
あまり参考になりませんでした。このような結果は非常に残念です。
執筆されたのは高木氏だそうですが、かなり期待していただけに無念。(;_;)
記事編集 編集
Re: perlのサニタイジング このメッセージに返信する
日時: 2011/08/28 16:39
名前: サニ
URL:
ペングインさん

気を取り直し、また質問させて頂きます。
Perlでのサニタイジングですが、フォームとセットになった物は有りますでしょうか?
Webで検索するとPerlでのフォームはかなりの数でヒットしますが、いずれもサニタイジングは
なされておらず、新たに記述が必要となってしまい時間的にも余裕が無いので困っております。

最近KENT氏の書籍を購入し、付録としてCD-ROMにフォーム一式があったのでそれを使用する事に
なりました。ネットで検索するまで脆弱のあるフォームだとは気付かず、また書籍も非常に
少ない為、困惑しております。
脆弱があるとして有名になってしまったKENT氏のフォームを利用する場合、
サニタイジング処理は必須ですが、どのように記述すればよろしいのでしょうか?

エスケープ処理関数は参考にさせて頂きますが、エスケープ処理だけでは不十分な気がしてしまいます。
記事編集 編集
Re: perlのサニタイジング このメッセージに返信する
日時: 2011/08/24 23:33
名前: ペングイン
URL: http://blog.trippyboy.com
サニさん

>脆弱があるとして有名になってしまったKENT氏のフォームを利用する場合

上記、私は知りませんでしたが、情報によると最新版では対応がなされているようです。



http://jvn.jp/jp/JVN43906021/

---------------------------
JVN#43906021
KENT WEB 製 WEB MART におけるクロスサイトスクリプティングの脆弱性
公開日:2008/05/30 最終更新日:2009/05/28


【想定される影響】
ユーザのウェブブラウザ上で任意のスクリプトを実行される可能性があります。

【対策方法】
アップデートする
ベンダが提供する情報をもとに最新版へアップデートしてください。

----------------------------

もしかするとKENT氏に直接連絡し、確認を取るといいかもしれません。

---------以下蛇足-------

現在公開されている「WEB-PATIO」のinit.cgiの230行以降に以下の記述があります。

#-----------------------------------------------------------
# フォームデコード
#-----------------------------------------------------------
sub parse_form {
my $cgi = shift;

my %in;
foreach ( $cgi->param() ) {
my $val = $cgi->param($_);

if (!/^upfile\d$/) {
# 無効化
$val =~ s/&/&amp;/g;
$val =~ s/</&lt;/g;
$val =~ s/>/&gt;/g;
$val =~ s/"/&quot;/g;

# 改行変換
$val =~ s/\r\n/<br>/g;
$val =~ s/\n/<br>/g;
$val =~ s/\r/<br>/g;
}
$in{$_} = $val;
}
return %in;
}

で、その設定をpatio.cgiが16行目以降で呼び出しています。

# 設定ファイル認識
require "./init.cgi";
my %cf = &init;

# データ受理
$CGI::POST_MAX = $cf{maxdata};
my $cgi = CGI->new;
&error($cgi->cgi_error) if ($cgi->cgi_error);
my %in = &parse_form($cgi);



記事編集 編集
Re: perlのサニタイジング このメッセージに返信する
日時: 2011/08/25 07:32
名前: stranger
URL: http://ja.528p.com/
>"安全なウェブサイトの作り方"PDFを拝見致しましたが、コードや文章をコピペ出来ない様細工されて
>おりました。一部分をコピーすると、数個ずつの同じ文字列が並んだ状態でペーストされます。

Adobe Readerで開き、コピー&ペーストするとおかしくなる

CentOSをクライアントとして使っているなら
PostScript / PDF ファイル・ビューア Evince で開き
コピー&ペーストでgeditなどにコピーすれば、普通に表示されます

下記 evinceで表示しコピー&ペーストした状態

print "<input ... value=\"".&myEscapeHTML($keyword)."\"...";
print "「".&myEscapeHTML($keyword)."」の検索結果...";
...
# 独自に作成したエスケープ処理関数 myEscapeHTML
sub myEscapeHTML($){
my $str = $_[0];
$str =~ s/&/&amp;/g;
$str =~ s/</&lt;/g;
$str =~ s/>/&gt;/g;
$str =~ s/"/&quot;/g;
$str =~ s/'/&#39;/g;
}
記事編集 編集
Re: perlのサニタイジング このメッセージに返信する
日時: 2011/08/25 08:46
名前: ペングイン
URL: http://blog.trippyboy.com
strangerさん

ありがとうございます!
自分もどうにかしてコピーが出来ないものか模索しておりました。
早速試してみます。
記事編集 編集
Re: perlのサニタイジング このメッセージに返信する
日時: 2011/08/25 11:45
名前: 新高校生
URL:
>エスケープ処理関数は参考にさせて頂きますが、エスケープ処理だけでは不十分な気がしてしまいます。

当たり前かもしれませんがブラウザーからCGIへ戻ってくるデータ(CGIから見ると入力側)も
可能な限りチェックしないと心がやすまらないかも(^^)
(他人が作ったCGIを読み解くのが面倒そう…)
記事編集 編集
Re: perlのサニタイジング このメッセージに返信する
日時: 2011/08/26 20:07
名前: サニ
URL:
ペングインさん、strangerさん、新高校生さん

有り難うございます。念の為購入した書籍の付録にあったKENT氏のショッピングカート
を以下に示しました。フォームよりも複雑なのですが、より完璧にサニタイズする事を
目指しています。
サニタイジング処理の他に、HTMLコードでのJavascript処理、AjaxのSpry処理も行う予定です。
と言う訳で、サニタイジングとして有効な記述がありましたらよろしくお願いします。

#!/usr/local/bin/perl

#┌────────────────────────
#│ ショッピングカート
#│ cart.cgi v1.2b
#│ Copyright (c) KentWeb
#│ webmaster@kent-web.com
#│ http://www.kent-web.com/
#└────────────────────────

#-----------------------------
# 設定開始
#-----------------------------

# ライブラリ
require './jcode.pl';

# データファイル
$datfile = './cart.csv';

# 戻り先のリンク
$backurl = 'http://www.xxx.xxx/index.html';

# 送信先
$mailto = 'taro@email.xx.jp';

# sendmailパス
$sendmail = 'c:\sendmane\sendmane.exe';

# 買物カゴページURL
$cart_html = './cart.html';

#-----------------------------
# 設定完了
#-----------------------------

# 処理定義
&decode;
if ($in{'code'}) { &cart_in; }
elsif ($in{'mode'} eq "addr") { &addr; }
elsif ($in{'mode'} eq "conf") { &conf; }
elsif ($in{'mode'} eq "send") { &send; }
&cart_view();

#---------------------------------------
# フォームデコード
#---------------------------------------
sub decode {
my $buf;
if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $buf, $ENV{'CONTENT_LENGTH'});
} else {
$buf = $ENV{'QUERY_STRING'};
}

undef(%in);
my @buf = split(/&/, $buf);
foreach (@buf) {
my ($key, $val) = split(/=/);
$val =~ tr/+/ /;
$val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("H2", $1)/eg;

# シフトJISコード変換
&jcode::convert(\$val, 'sjis');

# エスケープ
$val =~ s/&/&/g;
$val =~ s/"/”/g;
$val =~ s/</</g;
$val =~ s/>/>/g;

# 改行はタブへ変換しておく
$val =~ s/\r\n/\t/g;
$val =~ s/\r/\t/g;
$val =~ s/\n/\t/g;

$in{$key} = $val;
}
}

#---------------------------------------
# 買物カゴに入れる
#---------------------------------------
sub cart_in {
# 入力チェック
if ($in{'num'} eq "") { &error("数量が未入力です"); }

# 現状のクッキーを取り出す
my @cook = &get_cookie;

# 先頭の要素を分解
my ($id,$code,$num) = split(/,/, $cook[0]);

# ID番号採番
$id++;

# 購入情報を先頭に追加する
@cook = ("$id,$in{'code'},$in{'num'}",@cook);

# クッキーを格納
&set_cookie(@cook);

# かごの中身を表示
&cart_view(@cook);
}

#---------------------------------------
# 買物カゴ中身確認
#---------------------------------------
sub cart_view {
my (@cook) = @_;

# 引数がなければ、現状のクッキー取り出し
if (@cook == 0) {
@cook = &get_cookie;
}

# 取消し
if ($in{'del'}) {
my @tmp;
foreach (@cook) {
my ($id,$code,$num) = split(/,/);

if ($in{'del'} != $id) {
push(@tmp,$_);
}
}
@cook = @tmp;

# クッキー更新
&set_cookie(@cook);
}

# ログ読み出し
my (%goods,%price);
open(IN,"$datfile");
while (<IN>) {
chomp;
my ($code,$goods,$price) = split(/,/);

# 商品名と価格をハッシュ化
$goods{$code} = $goods;
$price{$code} = $price;
}
close(IN);

# 画面表示
&header;
print <<EOM;



(^_^)
記事編集 編集

Page: | 1 | 2 | 3 | 4 | 5 | 6 |

件名※必須
名前※必須
URL
任意のパスワード (投稿後のコメント修正・削除時に使用)
画像認証※必須 投稿キー(画像で表示されている数字を入力)
コメント※必須

※質問を投稿後に自己解決された場合は、原因と行った対処を具体的に書き込み下さるよう、よろしくお願いします。

- WEB PATIO -