COBOL2002 XML連携機能ガイド
XML連携機能では,エンティティ参照の扱いを指定できます。
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> |
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. |
環境変数CBLXML_PARSE_NOXXEで外部エンティティ参照を展開しないように設定します。
CBLXML_PARSE_NOXXE=YES |
CBLXML-SET-ENTITYLIMITサービスルーチンを呼び出すか,または環境変数CBLXML_ENTITYLIMITに値を指定して,入力時のエンティティ参照回数の制限値を指定します。再帰的なエンティティ参照などで参照回数が膨大になったときのメモリ不足を抑止できます。使用できるメモリ量に合わせて,有効な制限値を指定してください。XMLドキュメントを入力する場合のメモリ所要量については,「7.4 実行時のメモリ所要量」を参照してください。
エンティティ参照回数が指定した値を超えた場合,CBLXML-OP-InterfaceまたはCBLXML-OB-Interfaceアクセスルーチンのステータスとして110(CBLXML-XML-PARSE-FAIL)が返されます。
<?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> |
<tag1>&varX;</tag1> |
エンティティ参照回数を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. |
XMLドキュメントの入力時に,エンティティ参照回数を制限します。
CBLXML_ENTITYLIMIT=参照回数 |
All Rights Reserved. Copyright (C) 2003, 2016, Hitachi, Ltd.