Bug(バグ) #2339
完了部分一致検索を行う箇所でワイルドカード検索ができてしまう
100%
説明
Overview (現象)¶
メンバー画面の「メンバー検索」や「コミュニティ検索」、あるいは管理画面の「メンバー管理」などでは、ニックネームやキーワード等で部分一致検索が行える。ここで、アンダースコア("_")やパーセント("%")を含めて検索すると、文字としてではなくメタ文字(ワイルドカード)として検索が行なわれてしまう。
これは仕様と考えれば問題ではないと言えるが、この動作は意図した仕様ではなく、不具合として扱うべきであると考えられる。
Causes (原因)¶
LIKE検索を行っている箇所では
$query->addWhere('name LIKE ?', '%'.$value.'%');
のように(部分一致)検索文字列として入力された値を直接渡しているためメタ文字がそのままメタ文字として扱われてしまっている。
Way to fix (修正内容)¶
LIKE検索は関数化されていない(LIKEメソッドがあるわけではない)ため、LIKE文を用いている箇所全てで入力文字列中のメタ文字をエスケープするか、最終的にSQLが生成される時点でエスケープを施すという対応が考えられる。
具体的な修正箇所や修正方針については検討できていない。
Note (補足)¶
バックスラッシュを含む文字列での検索についての挙動も気になる。例えば "foo\bar" というニックネームのメンバーがいる場合、メンバー検索で "foo" と検索すればヒットするが、 "foo\" と検索してもヒットせず、 "foo\\" と検索するとヒットするような動作を確認している。
Hiroshi Kato さんが13年以上前に更新
- ステータス を New(新規) から Pending Review(レビュー待ち) に変更
- 進捗率 を 0 から 50 に変更
pull request出しました。
https://github.com/ebihara/opWebAPIPlugin/pull/7
Kousuke Ebihara さんが13年以上前に更新
- ステータス を Pending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
- 進捗率 を 50 から 70 に変更
Yuma Sakata さんが13年以上前に更新
- ステータス を Pending Testing(テスト待ち) から Rejected(差し戻し) に変更
- 進捗率 を 70 から 50 に変更
テスト実施しましたが、修正が必要な点がありましたので確認お願いします。
パーセントを含むメンバーの検索確認¶
- 試験手順
0. パーセントを含むユーザー、含まないユーザー(例:a%123、ab123、x%123、xb123)を作成しておく
1. 管理画面にログイン後、WebAPIプラグインページ(/pc_backend.php/opWebAPIPlugin)にアクセスする
2. Auth typeを「IP Address」に設定後、Ip listに自分のIPアドレスを入力する
3. pc_frontend側のURLの語尾に「/api.php/feeds/member?q=xx」を追加する
4. 3で追加したURLの「xx」の部分にパーセントを含むユーザー(例:a%123)を入力して検索する
- 試験結果
全てのユーザーが検索結果にヒットする。
- 修正方針
a%123のみ検索結果にヒットするように修正お願いします。
バックスラッシュを含むメンバーの検索確認¶
- 試験手順
0. バックスラッシュを含むユーザー、含まないユーザー(例:a\123、ab123、x\123、xb123)を作成しておく
1. 管理画面にログイン後、WebAPIプラグインページ(/pc_backend.php/opWebAPIPlugin)にアクセスする
2. Auth typeを「IP Address」に設定後、Ip listに自分のIPアドレスを入力する
3. pc_frontend側のURLの語尾に「/api.php/feeds/member?q=xx」を追加する
4. 3で追加したURLの「xx」の部分にバックスラッシュを含むユーザー(例:a\123)を入力して検索する
- 試験結果
全てのユーザーが検索結果にヒットする。
- 修正方針
a\123のみ検索結果にヒットするように修正お願いします。
Kousuke Ebihara さんが13年以上前に更新
- 「3で追加したURLの『xx』の部分に」と二例が示されていますが、これでは何を入力したのかよく分かりません。「(例:a%123)」および「(例:a\123)」は例示になっていません。パーセントエンコーディングされた値を示してください。
- 例示された「a%123」は本当にこの通りに入力したのですか? URL にこのまま入力したのであれば、その値は、「a」という文字と「%12」という文字と「3」という文字として解釈されます。この %12 は UTF-8 の文脈では U+0012 のコードポイントに位置する文字を表すことになります。 U+0012 は DEVICE CONTROL TWO を表す制御文字です。
- 例示された「a\123」は本当にこの通りに入力したのですか? 「\」は全角ですが、そのことに関する注意書きがないということは本当にこの通りであると解釈して構わないのですね? ユーザ名に含まれる「\」も、本当に全角なのですね?
ただ、いずれの試験結果も「全てのユーザーが検索結果にヒットする。」であるのは気になります。たとえば最初のパーセント文字を含む検証の場合、修正が漏れていてパーセント文字をエスケープせずに使用していた場合であるとか、 U+0012 を検索文字列として指定していた場合であったとしても、 x%123 や xb123 がマッチするようなことはまず考えられません。
Yuma Sakata さんが13年以上前に更新
再度、テスト実施しました。問題ありません。
パーセントを含むメンバーの検索確認¶
- 試験手順
0. パーセントを含むユーザー、含まないユーザー(例:a%123、ab123、x%123、xb123)を作成しておく
1. 管理画面にログイン後、WebAPIプラグインページ(/pc_backend.php/opWebAPIPlugin)にアクセスする
2. Auth typeを「IP Address」に設定後、Ip listに自分のIPアドレスを入力する
3. pc_frontend側のURLの語尾に「/api.php/feeds/member?q=a%25123」を追加する
4. パーセントを含むユーザー(a%123)が検索にヒットするか確認する
- 試験結果
パーセントを含むユーザー(a%123)が検索結果にヒットする。
バックスラッシュを含むメンバーの検索確認¶
- 試験手順
0. バックスラッシュを含むユーザー、含まないユーザー(例:a\123、ab123、x\123、xb123)を作成しておく
1. 管理画面にログイン後、WebAPIプラグインページ(/pc_backend.php/opWebAPIPlugin)にアクセスする
2. Auth typeを「IP Address」に設定後、Ip listに自分のIPアドレスを入力する
3. pc_frontend側のURLの語尾に「/api.php/feeds/member?q=a%5c123」を追加する
4. 3で追加したURLの「xx」の部分にバックスラッシュを含むユーザー(例:a\123)を入力して検索する
- 試験結果
バックスラッシュを含むユーザー(例:a\123)が検索結果にヒットする。
- 備考
- 全角バックスラッシュでテストしました。(半角バックスラッシュだと半角円マークに変換されるため)