COBOL2002 XML連携機能ガイド


付録E.8 エンティティ参照の扱い

XML連携機能では,エンティティ参照の扱いを指定できます。

〈この項の構成〉

(1) 外部エンティティ参照の展開を無効にする

CBLXML-OP-InterfaceまたはCBLXML-OB-Interfaceアクセスルーチンの引数(アクセスモード),または環境変数CBLXML_PARSE_NOXXEで,入力時の外部エンティティ参照の展開を無効にするかどうかを指定します。

環境変数CBLXML_PARSE_NOXXEにYESを指定すると,外部エンティティ参照を展開しないようにできます。このとき,アクセスモードで"N"(外部エンティティ参照を展開しないモード)を指定していなくても,外部エンティティ参照を展開しません。

外部エンティティ参照を展開しないとき,該当する個所にはテキストデータがないものとして解析します。

(例)外部エンティティ参照があるXMLドキュメント

<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE root [
 <!ENTITY var SYSTEM URI>
]>
<root>
 <tag1>&var;</tag1>
</root>

上記の外部エンティティ参照を展開しないように指定して読み込んだ結果は,次を読み込んだ場合と同じになります。

<?xml version="1.0" encoding="Shift_JIS"?>
<root>
 <tag1></tag1>
</root>
注意事項
  • XML連携機能の既定の動作では,すべての外部エンティティ参照を展開します(互換性のため)。システム全体で外部エンティティ参照を展開しない設定にするためには,環境変数CBLXML_PARSE_NOXXEにYESを指定してください。

  • XMLドキュメントを更新モードでオープンするとき,外部エンティティ参照を展開しないように設定すると出力結果にも展開されません。更新モードを使用するXMLドキュメントには,外部エンティティ参照を使用しないことをお勧めします。

  • 外部エンティティ参照を展開しないモードで入力するとき,入力XMLドキュメントの妥当性チェック機能は無効となります。妥当性チェック機能については,「付録E.4 使用できる解析モードによる動作の違い」を参照してください。

  • 内部エンティティ参照を展開しないように指定する機能はありません。

(a) アクセスルーチンのアクセスモードで無効にする

CBLXML-OP-Interfaceアクセスルーチンで外部エンティティ参照の展開を無効にする例を次に示します。この例は,アクセスモードで「N」を指定した場合です。

CBLXML-OP-Interfaceアクセスルーチンについては「4.2.2 CBLXML-OP-Interfaceアクセスルーチン」を,CBL XML-OB-Interfaceアクセスルーチンについては「4.2.3 CBLXML-OB-Interfaceアクセスルーチン」を参照してください。

      *> 外部エンティティ参照の展開を無効にして
      *> XMLドキュメントを入力する設定
           MOVE 'RN' TO XML-MODE.
 
      *> XMLドキュメントを開く
           CALL 'CBLXML-OP-Interface'
                USING XML-FILE-NAME
                      XML-FILE-NAME-LENGTH
                      XML-MODE
                      XML-POINTER
                RETURNING CBLXML-RETURN-CODE.

(b) 環境変数CBLXML_PARSE_NOXXEで展開しないように設定する

環境変数CBLXML_PARSE_NOXXEで外部エンティティ参照を展開しないように設定します。

形式
CBLXML_PARSE_NOXXE=YES
規則

環境変数を省略,または'YES'以外を指定したときは,XMLドキュメントを開くアクセスルーチン(CBLXML-OP-Interface,CBLXML-OB-Interface)に指定したアクセスモードでXMLドキュメントを入力します。

(2) エンティティ参照の参照回数を制限する

CBLXML-SET-ENTITYLIMITサービスルーチンを呼び出すか,または環境変数CBLXML_ENTITYLIMITに値を指定して,入力時のエンティティ参照回数の制限値を指定します。再帰的なエンティティ参照などで参照回数が膨大になったときのメモリ不足を抑止できます。使用できるメモリ量に合わせて,有効な制限値を指定してください。XMLドキュメントを入力する場合のメモリ所要量については,「7.4 実行時のメモリ所要量」を参照してください。

エンティティ参照回数が指定した値を超えた場合,CBLXML-OP-InterfaceまたはCBLXML-OB-Interfaceアクセスルーチンのステータスとして110(CBLXML-XML-PARSE-FAIL)が返されます。

エンティティ参照回数の数え方

XML連携機能では,入力中に検出した内部エンティティおよび外部エンティティの個数をエンティティ参照回数としてカウントします。定義済み実体参照や文字参照はカウントしません。

外部エンティティ参照を展開しない場合でも,外部エンティティ参照自身は検出したエンティティとしてカウントされます。また,その外部エンティティの参照先に含まれるエンティティは解析対象にならないため,カウントされません。

カウントの例を次に示します。

(XMLドキュメントの例)
<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE root SYSTEM "sample.dtd" [
<!ENTITY xxe10 SYSTEM "xxes/xxe10.ent">
<!ENTITY var1 "12345">
<!ENTITY var2 "67890">
<!ENTITY varX "XXXXX&var1;">
]>
<root>
 &xxe10;
 <tag1>&var1;&var2;</tag1>
</root>
(XMLドキュメントで参照する外部エンティティxxes/xxe10.entの例)
<tag1>&varX;</tag1>
説明
  • 環境変数CBLXML_PARSE_NOXXEにYESを指定したときなど,入力時の外部エンティティ参照の展開を無効にした場合,入力するXMLドキュメントの「&xxe10;」は検出したエンティティとしてカウントされますが,"xxes/xxe10.ent"に含まれる「&varX;」は解析されないため,カウントされません。

    参照回数は,入力したXMLドキュメントの「&var1;&var2;」を加えて3になります。

  • 外部エンティティ参照を展開する場合,「&varX;」は「&var1;」を展開するので,"xxes/xxe10.ent"の内容の参照回数は2になります。このとき,「&xxe10;」も検出したエンティティとしてカウントされるため,参照回数は全体で5となります。

注意事項
  • XML連携機能の既定の動作では,エンティティ参照回数を制限しません(互換性のため)。システム全体でエンティティ参照回数を制限するためには,環境変数CBLXML_ENTITYLIMITに制限値を指定してください。

  • 入力するXMLドキュメントでエンティティ参照を使用する場合,十分に妥当な値を検証して設定してください。制限値に0を指定した場合,1件でもエンティティ参照が見つかったときは解析を中断します。

(a) CBLXML-SET-ENTITYLIMITサービスルーチンで制限値を指定する

エンティティ参照回数を512回までに制限して入力する例を次に示します。

        01 XML-POINTER USAGE POINTER VALUE NULL.
        01 XML-ENTITY-LIMIT PIC 9(9) USAGE COMP VALUE 512.
 
      *> 空のXMLドキュメントのポインタを作成する
           CALL 'CBLXML-CREATE-XML-POINTER'
               USING XML-POINTER.
           IF RETURN-CODE NOT = 0 THEN
               EXIT PROGRAM
           END-IF.
 
      *> エンティティ参照回数の制限値を指定する
           CALL 'CBLXML-SET-ENTITYLIMIT'
               USING XML-POINTER XML-ENTITY-LIMIT.
 
      *> XMLドキュメントを開く(READ)
           MOVE 'RE' TO XML-MODE.
           CALL 'CBLXML-OP-Interface'
                USING XML-FILE-NAME
                      XML-FILE-NAME-LENGTH
                      XML-MODE
                      XML-POINTER
                RETURNING CBLXML-RETURN-CODE.
注意事項
  • CBLXML-SET-ENTITYLIMITサービスルーチンの指定は,CBLXML-CREATE-XML-POINTERサービスルーチンで割り当てたXMLドキュメントのポインタごとに有効です。CBLXML-OP-InterfaceまたはCBLXML-OB-InterfaceアクセスルーチンでXMLドキュメントを入力する前に呼び出してください。CBLXML-SET-ENTITYLIMITサービスルーチンについては,「9.3.6 エンティティ参照回数を制限する機能」を参照してください。

  • CBLXML-SET-ENTITYLIMITサービスルーチンの指定は,環境変数CBLXML_ENTITYLIMITの指定よりも優先されます。

(b) 環境変数CBLXML_ENTITYLIMITで制限値を指定する

XMLドキュメントの入力時に,エンティティ参照回数を制限します。

形式
CBLXML_ENTITYLIMIT=参照回数
規則
  • 参照回数に指定できる値は,0〜2,147,483,647の範囲です。

  • 環境変数を省略,または参照回数に範囲外の値を指定したとき,エンティティの参照回数は制限されません。