【しばらく編集不可モードで運営します】 編集(管理者用) | 差分 | 新規作成 | 一覧 | RSS | FrontPage | 検索 | 更新履歴

DEBUG/is_editable - DEBUG/do_index関連。

DEBUG/do_index関連。

 sub is_editable {
     my ($page) = @_;
     if (&is_bracket_name($page)) {
         return wantarray ? 0 : (0, 'bracket');
     } elsif ($fixedpage{$page}) {
         return wantarray ? 0 : (0, 'fixed');
     } elsif ($page =~ /\s/) {
         return wantarray ? 0 : (0, 'inculudes_blank');
     } elsif ($page =~ /^\#/) {
         return wantarray ? 0 : (0, 'enbedded');
     } elsif ($page =~ /^$interwiki_name$/) {
         return wantarray ? 0 : (0, 'interwiki');
     } else {
         return 1;
     }
 }

 sub do_index {
    my %descs;
    &print_header($IndexPage);
    print qq(<ul>);
    foreach my $page (sort keys %database) {
        my ($is_editable, $desc) = &is_editable($page);
        $descs{$page} = $desc ? "$is_editable : $desc" : $is_editable;
        if ($is_editable) {
            print qq(<li><a href="$url_cgi?@{[&encode($page)]}">$page</a>@{[&escape(&get_subjectline($page))]}</li>);
            # print qq(<li>@{[&get_info($page, $info_IsFrozen)]}</li>);
            # print qq(<li>@{[0 + &is_frozen($page)]}</li>);
        }
    }
    print qq(</ul>);
    &print_footer($IndexPage);
    print "<h1>FOR DEBUG</h1>";
    print "<pre>";
    foreach my $page (sort keys %database) {
        print $page, " -> ", $desc{$page}, "\n";
    }
    print "</pre>";
 }


 Coffee

 #今回のindexまわりのトラブルとの関係は薄いと思いますが…
 #いままでどおりに '<' と '>' を含むページ名を許すのなら、
 #直接do_indexで "〜>$page</a>〜" と表示するのは脆弱性を生むと思います。
 #このままの仕様だと、例えば"HOGE</a><h1>NOOOOOOOOOOOO!</h1>"
 #という名前のページが作られると、IndexPageなどでのHTML出力は、"<li><a href="$url_cgi?〜">HOGE</a><h1>NOOOOOOOOOOOO!</h1></a> - HOGE〜"となります。
  
 #自宅のテスト環境で試してみたところ、空白を含むページ名は許されない仕様のようですので、
 #"_</a><a href="www.xxx.com">NOOOOOOOOOOOO!"というリンク先を半分詐称するページ名は作れないようです。
 #しかし、特定のHTMLタグを故意に組み合わせてページ名に使われたりすると、脆弱性に直結すると思います。
  
  
 #また、今回のIndexPageの抜け落ち現象の再現を試みようと自宅のテスト環境で
 #ページ連続作成スクリプトを使って(危険なので良い子は絶対に真似しないように!)
 #YukiWiki2のテストをしていたら、そのスクリプトのコーディング上の手違いで偶然に再現したのですが…
  
 #なんと"〜HOGEケ・/a>"とかいう表示が発生しました。
 #極悪さんの指摘しているのも、たぶんこのケースだと思います。
 #原因は、ページ名の最後に特定の文字(2バイト文字の1バイト目で、2バイト目が '<' になりうるもの)
 #がある状態でページを作成すると、<が必然的に誤解釈されて、こうなるようです。
  
 >print qq(<li><a href="$url_cgi?@{[&encode($page)]}">$page </a>@{[&escape(&get_subjectline($page))]}</li>);
  
 #これは例えば、上記のように$pageと</a>間に空白をいれることで対応出来るはずです。

 #というか、&escape($page)とすればよい?