変数のスコープとは何ですか?

ColdFusionには約20種類の変数が存在します。プログラムで明示的に変数を作成するものや、特定のタグや処理によって自動的に作られるものなど、さまざまな処理に応じて作成されます。

スコープとは、変数に定められる参照範囲や有効期間の事を指しています。ColdFusionも他のプログラム言語と同様に、変数の種類に応じてそれぞれ異なるスコープ(参照範囲や有効期間)を持っています。

ColdFusionの変数スコープに関しては下記の情報を参照下さい。

https://helpx.adobe.com/jp/coldfusion/developing-applications/the-cfml-programming-language/using-coldfusion-variables/about-scopes.html
スコープについて (adobe.com)

ColdFusionでは、変数を呼び出すとき(一部の変数については変数を生成するとき)に、スコープを指定することで、その種類の変数に対する処理を特定することができます。例えば、URL変数として渡された変数aを呼び出すには#url.a#と記述したり、Form変数としてSUBMITされてきた変数bを呼び出すには#form.b#と記述します。

また、これまでのColdFusionは、スコープが指定されていない変数(#url.a#や#form.b#ではなくて、単に#a#や#b#と記述して呼び出している変数)については、以下のページの「スコープが指定されていない変数の評価」の順に従って変数を探し、見つかり次第、そのスコープの変数を参照していました。

https://helpx.adobe.com/jp/coldfusion/developing-applications/the-cfml-programming-language/using-coldfusion-variables/about-scopes.html
内、「スコープが指定されていない変数の評価」を参照

ColdFusion 2016からは、Application.cfcで指定可能なアプリケーションレベルの変数(This.searchImplicitScopes)や主にApplication.cfmで使用する<cfapplication>タグのsearchImplicitScopes属性で、CGI・URL・Form・Cookie・File・Client変数については、検索を探すかどうかの指定が可能になっており、これまではデフォルトはTrue(スコープが指定されていない時はそれらの変数の検索を行う)となっていました。

https://www.samuraiz.co.jp/coldfusion/faq/dl/ColdFusion2016_seminar.pdf#page=35「Adobe ColdFusion2016最新機能のご紹介」のP.35を参考にしてください。

この機能が、2024年3月に公開されたColdFusion 2023 Update 7や ColdFusion 2021 Update 13を適用することで、デフォルトがFalse(スコープが指定されていない時はCGI・URL・Form・Cookie・File・Clientの変数の検索を行わない)に変更となりました。そのため、プログラムの中でスコープを指定しないでそれら変数を参照している処理がある場合は、UndefinedElementExceptionや変数 {xx} は未定義ですのエラーが発生するようになります。

これはスコープ インジェクションの脆弱性(プログラム中で記述している変数のスコープとは異なるスコープの変数を渡し、想定されるのとは違う変数の値をColdFusionに認識させる)に対する対応であり、CGI・URL・Form・Cookie・File・Client変数についてはアプリケーションの内容からユーザーが値を直接取得・簡単に操作できやすいため、それらの種類の変数を用いたスコープインジェクションを防ぐためのものであります。

スコープインジェクションについて解説されているサイトが以下にありますので、参考にしてください。
https://foundeo.com/security/guide/scope-injection/
Scope Injection Guide for ColdFusion / CFML (foundeo.com)

 

2024年3月に公開されたColdFusion 2023 Update 7や ColdFusion 2021 Update 13またはそれ以降のUpdateを適用した後、運用しているアプリケーションでUndefinedElementExceptionや変数{xx}は未定義ですというエラーが発生した場合は、以下のことを行ってください

  • エラーとなった変数にスコープを付けます(例えば、URL変数のaを参照しているところでエラーが発生した場合は#a#と記述していると思いますので、そこを#URL.a#に変更します)

ただ、変更箇所が多いなど、すぐに対応することが難しい場合は、以下のいずれかの方法を行うことで、Update適用前の動作に戻す方法も提供されています。ただし、この方法はスコープ インジェクションの脆弱性が発生する可能性があることから、アドビでは searchImplicitScopes は FALSE のまま、エラーが発生した箇所のプログラムを修正することを強く推奨しています。

  • Application.cfcで「This.searchImplicitScopes=true」を指定するか、または、主にApplication.cfmで使用する<cfapplication>タグの属性に「searchImplicitScopes=true」を追加する
  • ColdFusion Administratorの「サーバーの設定 > Java と JVM」の『JVM引数』に新たに追加されたJVMフラグ『-Dcoldfusion.searchimplicitscopes=true』を指定する
    ※JVM引数にフラグを追加する場合は、項目と項目の区切りは空白で、改行は入れないでください
    ※このJVMフラグは、2024年3月のUpdateで追加されたものです。次のメジャーバージョンアップでは廃止される予定です

 


記事公開日:2011年10月27日
最終更新日:2024年03月15日


x

Sample Modal Window

This is just a sample…

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent suscipit iaculis libero sed tristique. Quisque mollis dolor non tellus placerat vitae sodales lectus porta. Curabitur ut suscipit tellus. Maecenas rhoncus, ante vitae vehicula vestibulum, metus sapien dapibus tellus, et mattis dolor neque vitae nisl. Nullam eleifend ultrices ipsum eget pretium. Curabitur semper metus ut ante adipiscing nec volutpat sem rutrum. Nullam a nisi lacus, non interdum ante. Vivamus ante augue, commodo vel egestas sed, pharetra nec dui. Quisque sed tellus felis. Donec ipsum mauris, sagittis eu accumsan in, aliquam non ipsum.

Vestibulum tempor nunc nec felis scelerisque eget elementum erat dignissim. Ut vel ipsum mollis orci venenatis luctus. Aenean vehicula quam vel quam porttitor ac iaculis elit pulvinar. Proin consequat, ipsum eu venenatis semper, justo turpis posuere tortor, ac placerat metus nisl et lectus. Nulla cursus dui id nunc ullamcorper sed semper nisl lobortis. Aliquam erat volutpat. Phasellus arcu ante, imperdiet in ornare sed, laoreet eu massa.