プロジェクト

全般

プロフィール

Bug(バグ) #1955

管理画面のナビゲーションフォームでナビゲーションのURLとして想定しない文字列が入力された場合、エラーメッセージを表示するように対処する

Shinichi Urabe約13年前に追加. 約12年前に更新.

ステータス:
New(新規)
優先度:
Normal(通常)
担当者:
-
対象バージョン:
開始日:
2011-03-17
期日:
進捗率:

0%

3.6 で発生するか:
Yes (はい)
3.8 で発生するか:
Unknown (未調査)

説明

現象

管理画面のナビゲーションフォームでナビゲーションのURLとして想定しない文字列がURLフィールドに入力された場合、フォーム上でエラーとならない

ルーティング名、もしくはルーティングのURLとして存在しない文字列が入った場合エラーとするほうがよいと考えられる (表示メッセージ例:「適切なURLではありません」)


opDiaryPlugin を使っている状態で @diary_list → 存在するので ○ @diary_tetete → 存在しないので☓

aaaa/eeee → 存在しないURLなので ☓

hahahaha → URLとして存在しない場合は ☓

原因

修正内容


関連するチケット

関連している OpenPNE 3 - Backport(バックポート) #1956: 管理画面のナビゲーションフォームでナビゲーションのURLとして想定しない文字列が入力された場合、エラーメッセージを表示するように対処する Invalid(無効) 2011-03-17

履歴

#1 Shinichi Urabe約13年前に更新

  • 題名ナビゲーションでナビゲーションとして想定しない文字列が入力された場合、エラーメッセージを表示するように対処する から 管理画面のナビゲーションフォームでナビゲーションのURLとして想定しない文字列が入力された場合、エラーメッセージを表示するように対処する に変更

#2 Minoru Takai約13年前に更新

管理画面のナビゲーションフォームでナビゲーションのURLとして想定しない文字列がURLフィールドに入力された場合、フォーム上でエラーとならない

このことが問題視されていますが、この挙動をバグと判断する根拠が読み取れません。

OpenPNE 3.4.9.2 で簡単に実装を調べてみました。

  • まず、管理画面ではどのような文字列でもURLとして設定できます。
  • ナビの表示側では、「想定しない文字列」がURLに設定されていても、エラーなどは生じません。
  • apps/pc_frontend/modules/default/templates/_globalNav.php
    <?php if ($navs): ?>
    <ul>
    <?php foreach ($navs as $nav): ?>
    <?php if (op_is_accessable_url($nav->uri)): ?>
    <li id="globalNav_<?php echo op_url_to_id($nav->uri) ?>"><?php echo link_to($nav->caption, $nav->uri) ?></li>
    <?php endif; ?>
    <?php endforeach; ?>
    </ul>
    <?php endif; ?>
    
  • apps/pc_frontend/modules/default/templates/_localNav.php
    <?php if ($navs): ?>
    <ul class="<?php echo $type; ?>">
    <?php foreach ($navs as $nav): ?>
    
    <?php if (isset($navId)): ?>
    <?php $uri = $nav->uri.'?id='.$navId; ?>
    <?php else: ?>
    <?php $uri = $nav->uri; ?>
    <?php endif; ?>
    
    <?php if (op_is_accessable_url($uri)): ?>
    <li id="<?php echo $nav->type ?>_<?php echo op_url_to_id($nav->uri) ?>"><?php echo link_to($nav->caption, $uri); ?></li>
    <?php endif; ?>
    
    <?php endforeach; ?>
    </ul>
    <?php endif; ?>
    
  • lib/helper/opUtilHelper.php (op_is_accessable_url() の定義)
    function op_is_accessable_url($uri)
    {
      if ('/' === $uri[0] || preg_match('#^[a-z][a-z0-9\+.\-]*\://#i', $uri))
      {
        return true;
      }
    
      $info = sfContext::getInstance()->getController()->convertUrlStringToParameters($uri);
    
      if (!empty($info[0]))
      {
        return sfContext::getInstance()->getRouting()->hasRouteName($info[0]);
      }
      elseif (!empty($info[1]))
      {
        return sfContext::getInstance()->getController()->actionExists($info[1]['module'], $info[1]['action']);
      }
    }
    
    • 余談ですが、関数名 op_is_accessable_url は不適切です。 accessable という綴りは誤りです。

ルーティング名、もしくはルーティングのURLとして存在しない文字列が入った場合エラーとするほうがよいと考えられる (表示メッセージ例:「適切なURLではありません」)

これは、「新しいナビゲーション項目の追加」か「あるひとつのナビゲーション項目の編集」をした際に op_is_accessable_url() が false を返すような場合には、そのURLを設定しようと時点で設定できないようにアラートを出したほうが親切であるという提案でしょうか。

もしそうであれば、その提案は妥当だと思いますが Bug チケットとするのは不適切だと思います。付け加えておくと、その提案は悪くはないと思いますが、わざわざアラートを表示する必要があるのか疑問です。 Enhancement チケットとする場合は対応した方がよいと考える理由についても併記頂ければと思います。

#3 Yuma Sakata12年以上前に更新

  • 3.6 で発生するかYes (はい) にセット
  • 3.4 で発生するかYes (はい) にセット

再現確認できました。

Environment (再現バージョン)

OpenPNE3.6.1
OpenPNE3.4.18

Way to repro (再現手順)

1. 管理画面ナビ設定ページ(/pc_backend.php/navigation/list/app/pc)にアクセスする
2. 存在しない文字列(例:@diary_tetete)を入力する
3. エラーメッセージが表示されず、存在しない文字列を登録できる

#4 Shouta Kashiwagi約12年前に更新

  • 対象バージョンOpenPNE 3.7.0 から 252 に変更

#5 Shouta Kashiwagi約12年前に更新

  • 対象バージョン252 から OpenPNE 3.8.x に変更

他の形式にエクスポート: Atom PDF