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

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

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

Re: perlのサニタイジング このメッセージに返信する
日時: 2011/08/26 20:29
名前: サニ
URL:
ペングインさん

もしかして"WEB MART 1.61" と"ショッピングカート cart.cgi v1.2b" は同じ物なんでしょうか?
一方はKENT氏のサイト上での配布、もう一方では名称を変えての書籍での配布ですが (;_;)
2008/05/30にIPAが勧告を出したそうですが、上記のcart.cgi v1.2bではXSS対策がなされた
物なんでしょうか? 


記事編集 編集
Re: perlのサニタイジング このメッセージに返信する
日時: 2011/08/27 01:19
名前: ペングイン
URL: http://blog.trippyboy.com
サニさん

WEB MARTとショッピングカートはきっと違うものです。
触ったことがないのでなんとも言えないです。

該当のスクリプトにてもエスケープさせていますよね。

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;
}
}

ひとまず少なくとも「<」のエスケープが出来てる時点で「自分は」大丈夫と判断します。
記事編集 編集
Re: perlのサニタイジング このメッセージに返信する
日時: 2011/08/27 16:25
名前: サニ
URL:
ペングインさん

ペングインさん回答有り難うございます(^^)

そうですね、確かに#シフトJISコード変換 #エスケープ #改行はタブへ変換しておく等のエスケープは
されています。ですがXSS対策はこれで大丈夫なんでしょうか…HTMLのエスケープが無いですよね…





記事編集 編集
Re: perlのサニタイジング このメッセージに返信する
日時: 2011/08/28 02:53
名前: ペングイン
URL: http://blog.trippyboy.com
サニさん

クロスサイトスクリプティングの対策として、私は十分だと思います。

「<」をエスケープされたら

<script>〜</script> って入力されても、表示されるさいには「<」はエスケープ
されているので、動作しませんよね??(^^;)

[Wikipedia]クロスサイトスクリプティング - 対策
http://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AD%E3%82%B9%E3%82%B5%E3%82%A4%E3%83%88%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0#.E5.AF.BE.E7.AD.96


この場合は半角文字を全角にする(「<」⇒「<」)ことでエスケープしているようです。
記事編集 編集
Re: perlのサニタイジング このメッセージに返信する
日時: 2011/08/28 12:29
名前: 新高校生
URL:
>もしかして"WEB MART 1.61" と"ショッピングカート cart.cgi v1.2b" は同じ物なんでしょうか?
>一方はKENT氏のサイト上での配布、もう一方では名称を変えての書籍での配布ですが
>2008/05/30にIPAが勧告を出したそうですが、上記のcart.cgi v1.2bではXSS対策がなされた
物なんでしょうか?

バージョンのことはKENTさんに聞かないと分からないのでは?
サニさんが分からないように他の方々も分からないです。書籍持ってる人も少ないでしょうし。

使うんだったらWEBにあるものを使った方がいいですよ。書籍のはだいたい古いですから。
サイトではWEB MART が2.62になっていますし。

あと書籍でもサイト配布でも同じですが、「自己責任で使ってくれ」というニュアンスで
しょうから、使うもよし、使わぬもよしです。改造も自己責任になります。
改造は中身が分かりスキルが無いと余計心配になると思います。

どこからか有料のCGIを手配すれば質問等もできますから多少安心かも(料金は安心料?)
記事編集 編集
Re: perlのサニタイジング このメッセージに返信する
日時: 2011/08/28 13:13
名前: サニ
URL:
ペングインさん

><script>〜</script> って入力されても、表示されるさいには「<」はエスケープ
されているので、動作しませんよね??

そうですね、しかし特殊文字'が抜けているのではないでしょうか?それとURL属性も追加したい
のですがどうでしょうか。

【タグ属性】
特殊文字を置換
"$val =~ s/'/</g;"


【URL属性】
●URLで許可されていない文字がある時URLを完全に無効化
●許可しないスキームがある場合URLを完全に無効化
●HTMLに埋め込むので特殊文字をエスケープ

URLサニタイジング関数 IPA

1 $url = &ez_url_sanitize($url); # $urlをサニタイズ
2
3 sub ez_url_sanitize {
4 my $url = $_[0];
5
6 ### もしURLで許可されていない文字があるなら空文字列を返す ###
7 # --- http://www.ietf.org/rfc/rfc2396.txt ---
8 # uric = reserved | unreserved | escaped
9 # reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
10 # unreserved = alphanum | mark
11 # mark = "-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")"
12 # escaped = "%" hex hex
13
14 return '' if($url =~ m|[^;/?:@&=+\$,A-Za-z0-9\-_.!~*'()%]|);
15
16 ### もし未知のスキームなら空文字列を返す ###
17 # --- http://www.ietf.org/rfc/rfc2396.txt ---
18 # scheme = alpha *( alpha | digit | "+" | "-" | "." )
19
20 if($url =~ /^([A-Za-z][A-Za-z0-9+\-.]*):/) {
21 # $urlにはスキームがあるのでチェック
22 my $scheme = lc($1); # スキームを小文字に変換
23 my $allowed = 0;
24 $allowed = 1 if($scheme eq 'http');
25 $allowed = 1 if($scheme eq 'https');
26 $allowed = 1 if($scheme eq 'mailto');
27 return '' if(not $allowed);
28 }
29
30 ### HTMLエスケープ ###
31 # special = "&" | "<" | ">" | '"' | "'"
32 # URL許可文字だけなので"<",">",'"'は$url中に存在しない
33
34 $url =~ s/&/&amp;/g; # & → &amp;
35 $url =~ s/'/&#39;/g; # ' → &#39;
36
37 return $url;
38 }

記事編集 編集
Re: perlのサニタイジング このメッセージに返信する
日時: 2011/08/28 13:21
名前: サニ
URL:
新高校生さん

>どこからか有料のCGIを手配すれば質問等もできますから多少安心かも(料金は安心料?)
確かにそうですね(^_^)

それと"WEB MART 1.61" と"ショッピングカート cart.cgi v1.2b" は違う物だそうです。
ですがここまで来た以上はしっかりサニタイジングやろうかなと思ってます。

これで完璧に安全だと言えるレベルまでセキュアに記述したいんです。
【タグ属性】に加え【URL属性】もエスケープすればどうかなと思ったのですが、どうでしょう。
記事編集 編集
Re: perlのサニタイジング このメッセージに返信する
日時: 2011/08/28 17:20
名前: サニ
URL:
ペングインさん

またまたご質問させて頂きます(^^)、まとめますと以下の処理は$keyword 検索欄での入力を
エスケープ処理したものと言う解釈でよろしいでしょうか?
$str =は文字列で、$val =値、$key =名前ですよね(すみません素人なので色々お伺いする事が多い
ですが)。(^^;)すると、フォームデコードのsub decodeに以下の様に記述すれば良いのでしょうか?

cart.cgi v1.2b
#---------------------------------------
# フォームデコード
#---------------------------------------
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/\\/¥/g;
        $val =~ s/'/’/g;
        #$val =~ s/\\/¥/g; ## コメントアウト
# ■↓エスケープ 追加 合ってますでしょうか■
$key =~ s/&/&/g;
$key =~ s/"/”/g;
$key =~ s/</</g;
$key =~ s/>/>/g;
$key =~ s/'/’/g;
$key =~ s/\\/¥/g;
   
# 改行はタブへ変換しておく
$val =~ s/\r\n/\t/g;
$val =~ s/\r/\t/g;
$val =~ s/\n/\t/g;

$in{$key} = $val;
}
}
# ■↓エスケープ色々 追加 合ってますでしょうか■
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;
}

# HTML エスケープする
sub HtmlEscape {
my $content = $_[0];
my $eucpre = qr{(?<!\x8F)};
my $eucpost = qr{ (?= (?:[\xA1-\xFE][\xA1-\xFE])* # JIS X 0208 が 0文字以上続いて
(?:[\x00-\x7F\x8E\x8F]|\z) # ASCII, SS2, SS3 または終端
)
}x;
my @escape_from = qw(& > < " ');
my @escape_to = ('&amp;', '&gt;', '&lt;', '&quot;', '&#39;');
for (my $i = 0; $i <= $#escape_from; $i++) {
$content =~ s/$eucpre\Q$escape_from[$i]\E$eucpost/$escape_to[$i]/g;
}
return $content;
}
---------------------------------------------------
色々ごちゃっとなってしまいましたが、果たしてこれで良いのか自信がありません。
ご教示お願いします。(^^)
記事編集 編集
Re: perlのサニタイジング このメッセージに返信する
日時: 2011/08/28 19:52
名前: ペングイン
URL: http://blog.trippyboy.com
サニさん

申し訳ありませんが、こちらで記述を読み、または検証することは出来ますが、
カスタマイズに関して口をはさむことは避けたいと思います。

実際に渡される値を用いて、何をするかを考えましょう。

たとえば、Webに表示するためなのか、それとも与えられた値をMySQLなど
SQL分の一部として実行するかで話が変わってきます。


以下、ご提示のスクリプトで気づいた点です。

$keyはご自身が指定するものです。

(例)$keyに入るのは、以下の場合「id」
name="id" value="df2wxn"

フォームから入力するときの「name」はWeb閲覧者は変更できません。

また、$keywordにはどの値が入るのでしょうか。。。


このように、他人が作成しているPerlスクリプトに関して
口をはさむのは、得意ではありません・・・

実際に設置し、必要なものがエスケープされているか確認をお願いします。
記事編集 編集
Re: perlのサニタイジング このメッセージに返信する
日時: 2011/08/28 22:29
名前: サニ
URL:
ペングインさん

度々申し訳ありません、お手数お掛け致します。
>申し訳ありませんが、こちらで記述を読み、または検証することは出来ますが、
>カスタマイズに関して口をはさむことは避けたいと思います。

記述を読み検証して頂くだけで結構ですので、間違いがもしあればご指摘下さい。

>たとえば、Webに表示するためなのか、それとも与えられた値をMySQLなど
>SQL分の一部として実行するかで話が変わってきます。

MySQLなどのSQLは使用しません。使用するのはcart.csv の csv ファイルになります。

>$keyはご自身が指定するものです。
>(例)$keyに入るのは、以下の場合「id」
>name="id" value="df2wxn"
>フォームから入力するときの「name」はWeb閲覧者は変更できません。

成る程、するとWeb閲覧者はvalue=のみ変更出来、$key =「id」=「name」はWeb閲覧者は変更
出来ないので、以下はいらないのではと言う事でしょうか?
$key =~ s/&/&/g;
$key =~ s/"/”/g;
$key =~ s/</</g;
$key =~ s/>/>/g;
$key =~ s/'/’/g;
$key =~ s/\\/¥/g;

>また、$keywordにはどの値が入るのでしょうか。。。

IPAやネット上の情報を参考にし『サニタイジング』『XSS対策』で情報を得た上で、
記述したので正直詳細は分からないのです。直接は関係無い処理だったのでしょうか?
どうぞご教示下さい。
記事編集 編集

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

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

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

- WEB PATIO -