ここの情報は古いです。ご理解頂いた上でお取り扱いください。

Opened 12 years ago

Closed 12 years ago

#2995 closed defect (fixed)

OpenPNE_DB::update() の第三引数に、値に ?, !, & のいずれかを含む文字列が設定された要素が存在する連想配列を指定した場合、 DB_Error が発生する

Reported by: ebihara Owned by: shingo
Priority: minor Milestone: OpenPNE2.12.4
Component: 指定しない Version: 2.10.x & 2.12.x & 2.14.x
Keywords: OpenPNE2.10.10 OpenPNE2.13.3 Cc:

Description (last modified by shingo)

■現象

OpenPNE_DB::update() の第三引数に、値に ?, !, & のいずれかを含む文字列が設定された要素が存在する連想配列を指定した場合、 DB_Error が発生する。

■原因

OpenPNE_DB::update() は、第三引数に指定された連想配列を基に、 OpenPNE_DB::makeWhereClause() によって、 Where 条件節に使用可能な文字列を生成する。

生成された文字列は、SQL文を生成する DB_common::buildManipSQL() 内でSQL文の一部となる。プレースホルダは DB_common::buildManipSQL() の直後にコールされる DB_common:prepare() で展開される。

今回の現象は、 WHERE 節に含まれる ?, !, & などプレースホルダに用いられる文字がエスケープされることのないまま、 DB_common::prepare() に渡されてしまうのが原因で発生する。 SQL 文中のプレースホルダは OpenPNE_DB::update() の第二引数に指定された配列を用いて展開されることになるが、 WHERE 節に含まれるプレースホルダは対応する値が存在しないため、 DB_Error が発生してしまう。

■修正内容

プリペアードステートメントのwhere句に適用される配列パラメータの値に「?」・「!」・「&」が含まれていた場合に、エスケープ処理をする。(「?」・「!」・「&」を「\?」・「\!」・「\&」に置換)

■関連情報

  • #2986: Postgres:携帯版招待画面で!@emnet.ne.jpに招待するとDB Errorが発生する

Change History (7)

comment:1 Changed 12 years ago by ebihara

Description: modified (diff)

comment:2 Changed 12 years ago by shingo

Owner: changed from nobody to shingo
Status: newassigned

修正します。

comment:3 Changed 12 years ago by shingo

Description: modified (diff)
Keywords: 確認中 added

以下のリビジョンで修正しました。ご確認ください。

comment:4 Changed 12 years ago by shingo

Description: modified (diff)

comment:5 Changed 12 years ago by shingo

Description: modified (diff)

comment:6 Changed 12 years ago by ogawa

Keywords: テスト待ち added; 確認中 removed

comment:7 Changed 12 years ago by kiwa

Keywords: テスト待ち removed
Resolution: fixed
Status: assignedclosed

確認しました。問題ありません。

Note: See TracTickets for help on using tickets.