diff -urN ../htmllint.orig/htmllint.cgi ./htmllint.cgi --- ../htmllint.orig/htmllint.cgi Fri Sep 28 15:00:00 2012 +++ ./htmllint.cgi Tue Oct 16 08:20:00 2012 @@ -140,14 +140,28 @@ } } -$URL = $RURL = ($cgi->param('Method') =~ /^(?:Data|File)$/oi)? '': &htmllint::AbsoluteURL($ENV{HTTP_REFERER}, $cgi->param('URL')); +if ($cgi->param('Method') =~ /^(?:Data|File)$/oi) { + $RURL = $URL = ''; +} else { + $URL = $cgi->param('URL'); + # AbsoluteURLで前後の空白は除去されるが + # 以下のコードではAbsoluteURLを通らない場合があるので + $URL =~ s/^\s*//; + $URL =~ s/\s*$//; + # 日本語文字が含まれている$URLをエラーメッセージの中に表示する場合に備え、 + # $URLの文字コードをスクリプトの文字コード($myCODE)に合わせておく。 + # さもないとフォームの文字コードが$myCODEと異なる場合に文字化けが起こる。 + &Jconvert(\$URL, $myCODE, $formCODE); -# 日本語文字が含まれている$URLをエラーメッセージの中に表示する場合に備え、 -# $URLの文字コードをスクリプトの文字コード($myCODE)に合わせておく。 -# さもないとフォームの文字コードが$myCODEと異なる場合に文字化けが起こる。 -# 現状ではフォームはUTF-8、スクリプトはEUC-JP/Shift_JISなので、 -# プライマリサイトなどでも実際に文字化けが発生しています。 -&Jconvert(\$URL, $myCODE, $formCODE); + # http:もしくは相対パスの場合のみAbsoluteURLを通す + # AbsoluteURLではホスト名が空になっているURLはうまく扱えないようで、 + # file:/// が file:/ に直されてしまってfile:指定が動作しなくなってしまう。 + # 他にも、UNCパスを表すfile:指定はやや特殊な構文になっているので、 + # URL中の連続する/を一つにまとめられると動作しなくなってしまう。 + $URL = &htmllint::AbsoluteURL($ENV{HTTP_REFERER}, $URL) + if $URL =~ m#^https?:(?!//$)#oi || $URL !~ m#^([\w.+-]*:|\\\\)#oi; # http://のみ、UNCパスも除外 + $RURL = $URL; +} # チェックオプションを得る &GetOptions; @@ -175,9 +189,31 @@ } if ($URL ne '') { if ($GETLOCALFILE) { - if ($URL =~ m#^file:///?(.*)#oi) { - ($LOCALFILE = $1) =~ s/^(\w)\|(.*)/$1:$2/o; - } elsif ($WIN && $URL =~ /^\w:/o) { + # Windowsの各ブラウザが認識できる形式(*はアドレスバーの表示形式) + # ie=ie8 fx=firefox15 ch=chrome22 op=opera12 + # ie* fx ch op C:\dir\file.html + # ie ch op C:/dir/file.html + # ie fx ch op file://C:/dir/file.html + # ie fx ch op file://C|/dir/file.html + # ie fx* ch* op file:///C:/dir/file.html + # ie fx* ch op file:///C|/dir/file.html + # ie fx ch op* file://localhost/C:/dir/file.html + # ie fx ch op* file://localhost/C|/dir/file.html + # ie* fx ch op \\host\share\dir\file.html + # ie ch* op* file://host/share/dir/file.html + # ie ch file:////host/share/dir/file.html + # ie fx* ch file://///host/share/dir/file.html + # ie fx file://localhost///host/share/dir/file.html + # file://C:/は初期のIE、file:///C|/は初期のNetscapeが発祥だったと思う。 + # Windowsの場合は例外的構文が多すぎるので、分解パターンを別にした。 + if (!$WIN && $URL =~ m#^file://[\w.-]*/(.*)#oi) { + $LOCALFILE = $1; + $LOCALFILE =~ s#^([^/].*)#/$1#o if $UNIX; + } elsif ($WIN && $URL =~ m#^file://([\w.-]*/)?((?://)?[^/].*)#oi) { + my $h = $1; + ($LOCALFILE = $2) =~ s/^(\w)\|(.*)/$1:$2/o; + $LOCALFILE = '//'.$h.$LOCALFILE if $h =~ m#^(?!localhost/).+/#oi; + } elsif ($WIN && $URL =~ /^(\w:|\\\\)/o) { $LOCALFILE = $URL; } } diff -urN ../htmllint.orig/htmllintenv ./htmllintenv --- ../htmllint.orig/htmllintenv Sat May 19 17:36:51 2007 +++ ./htmllintenv Tue Oct 16 08:20:00 2012 @@ -73,7 +73,9 @@ # この指定により、file:// で始まるプロトコルを URL に指定できるようになります # ブラウザは、これをクライアント上のファイルとして取得しますが、ここではサーバ上 # のファイルとして取得するので注意してください -# Windows上のサーバでは、C: のようなドライブ名から始まるファイル名も記述できます +# Windows上のサーバでは、C: のようなドライブ名から始まるファイル名や、 +# \\ から始まるUNCパス名も記述できます +# いずれも、CGIの実行権限で取得対象のローカルファイルを読めることが必要です #$GETLOCALFILE = 1; # CGI が出力する HTML の漢字コードの既定値 (コメントアウトしても可)