ヘッダーをスキップ
Oracle® Application Express APIリファレンス
リリース4.2
B71112-01
  目次へ移動
目次

前
 
次
 

9 APEX_ESCAPE

APEX_ESCAPEパッケージには、データが後続の処理に適しているように、文字列内の特殊文字列をエスケープするための機能が用意されています。

トピック:


定数

APEX_ESCAPEパッケージでは、次の定数が使用されます。

SPACE# constant binary_integer := 32; 
HASH# constant binary_integer := 35; 
COMMA# constant binary_integer := 44; 
HYPHEN# constant binary_integer := 45; 
DOT# constant binary_integer := 46; 
ZERO# constant binary_integer := 48; 
NINE# constant binary_integer := 57; 
UP_A# constant binary_integer := 65; 
UP_Z# constant binary_integer := 90; 
BACKSLASH# constant binary_integer := 92; 
UNDERSCORE# constant binary_integer := 95; 
LOW_A# constant binary_integer := 97; 
LOW_Z# constant binary_integer := 122; 
 
c_ldap_dn_reserved_chars constant varchar2(8) := '"+,;<=>\'; 
c_ldap_search_reserved_chars constant varchar2(5) := '*()\/'; 
c_html_whitelist_tags constant varchar2(255) := '<h1>,</h1>,<h2>,</h2>,<h3>,</h3>,<h4>,</h4>,<p>,</p>,<b>,</b>,<strong>,</strong>,<i>,</i>,<ul>,</ul>,<ol>,</ol>,<li>,</li>,<br />,<hr/>';

HTMLファンクション

このファンクションは、HTML環境で定数を変更できる文字をエスケープします。これは、既知のsys.htf.escape_scの拡張版です。

このファンクションの結果は、apex_escape.set_html_escaping_modeを使用して定義されているエスケープ・モードによって異なります。デフォルトでは、エスケープ・モードは「拡張」ですが、手動によるset_html_escaping_modeのコールやアプリケーションのセキュリティ属性「HTMLエスケープ・モード」「基本」に設定することによってオーバーライドできます。モードが「基本」の場合、このファンクションはsys.htf.escape_scのように動作します。それ以外の場合には、次のルールが適用されます。

次の表(表9-1)に、ファンクションが変換するASCII文字とエスケープされる値を示します。

表9-1 変換されたASCII文字のエスケープされる値

RAW ASCII文字 返されるエスケープ文字

&


&amp;

"

&quot;

<


&lt;

>

&gt;

'


&#x27;

/


&#x2F;


構文

APEX_EXSCAPE.HTML (
    p_string IN VARCHAR2 )
    return VARCHAR2;

パラメータ

表9-2に、HTMLファンクションで使用可能なパラメータを示します。

表9-2 HTMLファンクションのパラメータ

パラメータ 説明

p_string

エスケープされる文字列テキスト


次の例に、基本('B')および拡張('E')モードでのエスケープのテストを示します。

declare 
procedure eq(p_str1 in varchar2,p_str2 in varchar2) 
    is 
    begin 
        if p_str1||'.' <> p_str2||'.' then 
            raise_application_error(-20001,p_str1||' <> '||p_str2); 
    end if; 
end eq; 
begin 
    apex_escape.set_html_escaping_mode('B'); 
    eq(apex_escape.html('hello &"<>''/'), 'hello &amp;&quot;&lt;&gt;''/'); 
    apex_escape.set_html_escaping_mode('E'); 
    eq(apex_escape.html('hello &"<>''/'), 'hello
    &amp;&quot;&lt;&gt;&#x27;&#x2F;'); 
end; 

HTML_ATTRIBUTEファンクション

このファンクションは、HTMLのエンティティ属性の値のエスケープに使用されます。英数字または「,」「.」「-」「_」のいずれかの文字以外のすべてを16進エスケープします。

構文

APEX_ESCAPE.HTML_ATTRIBUTE (
    p_string IN VARCHAR2 )
    return VARCHAR2;

パラメータ

表9-3に、HTML_ATTRIBUTEファンクションで使用可能なパラメータを示します。

表9-3 HTML_ATTRIBUTEファンクションのパラメータ

パラメータ 説明

p_string

エスケープされるテキスト文字列。


「HTML_TRUNCファンクション」を参照してください。


HTML_TRUNCファンクション

HTML_TRUNCファンクションは、HTMLをエスケープし、戻される文字列をp_length文字に制限します。このファンクションは、入力CLOBの最初のp_length文字を返し、それらをエスケープします。入力CLOBがvarchar2変数に対して大きすぎる場合、およびそれの最初の部分のみを表示することが適している場合に、このファンクションを使用できます。

構文

APEX_ESCAPE.HTML_TRUNC (
    p_string IN CLOB,
    p_length IN NUMBER DEFAULT 4000 )
    return VARCHAR2;

パラメータ

表9-4に、HTML_TRUNCファンクションで使用可能なパラメータを示します。

表9-4 HTML_TRUNCファンクションのパラメータ

パラメータ 説明

p_string

エスケープされるテキスト文字列。

p_length

エスケープされるp_stringの文字数。


次の例では、タイトルおよびテキスト本文のHTMLリストが生成されます。HTMLのエンティティ属性はHTML_ATTRIBUTEでエスケープされ、通常のテキストはHTMLおよびHTML_TRUNCでエスケープされます。

begin 
    htp.p('<ul>'); 
    for l_data in ( select title, cls, body 
        from my_topics ) 
    loop 
    sys.htp.p('<li><span class="'||
        apex_escape.html_attribute(l_data.cls)||'">'|| 
        apex_escape.html(l_data.title)||'</span>'); 
    sys.htp.p(apex_escape.html_trunc(l_data.body)); 
    sys.htp.p('</li>'); 
    end loop; 
    htp.p('</ul>'); 
end; 

HTML_WHITELISTファンクション

HTML_WHITELISTファンクションは、指定されたホワイトリスト・タグを除く入力テキスト内のすべての文字に対してHTMLエスケープを実行します。入力テキストには単純なHTMLマークアップが含まれているが、攻撃者によるクロスサイト・スクリプトでの悪意のあるタグの使用を確実に避けることを開発者が希望する場合に、このファンクションは有効です。

構文

APEX_ESCAPE.HTML_WHITELIST (
    p_html IN VARCHAR2,
    p_whitelist_tags IN VARCHAR2 DEFAULT c_html_whitelist_tags )
    return VARCHAR2;

パラメータ

表9-5に、HTML_WHITELISTファンクションで使用可能なパラメータを示します。

表9-5 HTML_WHITELISTファンクションのパラメータ

パラメータ 説明

p_html

フィルタされるテキスト文字列。

p_whitelist_tags

p_htmlにとどまるタグのカンマ区切りのリスト。


次の例に、ホワイトリスト・タグを維持し、不要なHTMLマークアップを文字列から削除するためのAPEX_ERRORの使用方法を示します。

begin     sys.htp.p(apex_escape.html_whitelist(         '<h1>Hello<script>alert("XSS");</script></h1>')); end;

JS_LITERALファンクション

JS_LITERALファンクションは、JavaScript文字列をエスケープし、オプションでクォートします。このファンクションは、安全でない文字を\xHHまたは\uHHHH相当で置換します。結果は、JavaScriptコードに<script>タグ内またはインライン(「javascript:xxx」)で挿入できます。安全な文字には、aからz、AからZ、0から9、カンマ(,)、ピリオド(.)およびアンダースコア(_)があります。

構文

APEX_ESCAPE.JS_LITERAL (
    p_string IN VARCHAR2,
    p_quote  IN VARCHAR2 DEFAULT "" )
    return VARCHAR2;

パラメータ

表9-6に、JS_LITERALファンクションで使用可能なパラメータを示します。

表9-6 JS_LITERALファンクションのパラメータ

パラメータ 説明

p_string

エスケープされるテキスト文字列。

p_quote

null以外の場合、この文字列は結果の左右に置かれます。引用符は、一重引用符または二重引用符である必要があります。


l_string変数内の特殊文字をエスケープするためにJS_LITERALを使用する方法を説明します。

declare 
    l_string varchar2(4000) := 'O''Brien'; 
begin 
    sys.htp.p('<script>'|| 
        'alert('||apex_escape.js_literal(l_string)||');'||'</script>'); 
end;

LDAP_DNファンクション

LDAP_DNファンクションは、RFC 4514に従って、LDAP識別名内の予約文字をエスケープします。RFCでは、"+,;<=>\を予約文字であると説明しています(p_reserved_charsを参照)。これらは、バックスラッシュによってエスケープされます(例: becomes \)。印字できない文字(ASCIIの0から31)および127より大きいコードの文字(p_escape_non_asciiを参照)は、\xxでエスケープされますが、このxxは16進文字コードです。文字列の最初または最後の空白文字および最初の#も、バックスラッシュでエスケープされます。

構文

APEX_ESCAPE.LDAP_DN (
    p_string IN VARCHAR2,
    p_reserved_chars IN VARCHAR2 DEFAULT c_ldap_dn_reserved_chars,
    p_escaped_non_ascii IN BOOLEAN DEFAULT TRUE )
    return VARCHAR2;

パラメータ

表9-7に、LDAP_DNファンクションで使用可能なパラメータを示します。

表9-7 LDAP_DNファンクションのパラメータ

パラメータ 説明

p_string

エスケープされるテキスト文字列。

p_reserved_chars

p_stringで見つかった場合にバックスラッシュでエスケープされる文字のリスト。

p_escaped_non_ascii

TRUEの場合、p_stringのASCIIの127より大きい文字は、バックスラッシュでエスケープされます。これはRFCの4514および2253でサポートされますが、古いLDAPサーバーおよびMicrosoft ADではエラーが発生する可能性があります。


次の例では、l_nameの文字をエスケープし、結果をl_escapedに格納します。

declare 
    l_name varchar2(4000) := 'Joe+User'; 
    l_escaped varchar2(4000); 
begin 
    l_escaped := apex_escape.ldap_dn(l_name); 
    htp.p(l_name||' becomes '||l_escaped); 
end;

LDAP_SEARCH_FILTERファンクション

LDAP_SEARCH_FILTERファンクションは、RFC 4515に従って、LDAP検索フィルタ内の予約文字をエスケープします。RFCでは、*()\/を予約文字であると説明しています(p_reserved_charsを参照)。これらの、印字できない文字(ASCIIの0から31)および127より大きいコードの文字(p_escape_non_asciiを参照)は、\xxでエスケープされますが、このxxは16進文字コードです。

構文

APEX_ESCAPE.LDAP_SEARCH_FILTER (
    p_string              IN VARCHAR2,
    p_reserved_chars    IN VARCHAR2 DEFAULT c_ldap_search_reserved_chars,
    p_escape_non_ascii IN BOOLEAN DEFAULT TRUE )
    return VARCHAR2;

パラメータ

表9-8に、LDAP_SEARCH_FILTERファンクションで使用可能なパラメータを示します。

表9-8 LDAP_SEARCH_FILTERファンクションのパラメータ

パラメータ 説明

p_string

エスケープされるテキスト文字列。

p_reserved_chars

p_stringで見つかった場合に\xxでエスケープされる文字のリスト(xxはASCIIの16進文字コード)。

p_escape_non_ascii

TRUEの場合、p_stringのASCIIの127より大きい文字は\xxでエスケープされ、このxxはASCIIの16進文字コードです。これはRFCの4514でサポートされますが、古いLDAPサーバーおよびMicrosoft ADではエラーが発生する可能性があります。


次の例では、l_nameのテキストをエスケープし、結果をl_escapedに格納します。

declare 
l_name varchar2(4000) := 'Joe*User'; 
l_escaped varchar2(4000); 
begin 
    l_escaped := apex_escape.ldap_search_filter(l_name); 
    htp.p(l_name||' becomes '||l_escaped); 
end;

NOOPファンクション

p_stringを変更せずに返します。SQLインジェクションのdbms_assert.noopと同様に、このファンクションは、自動インジェクション検出テストをサイレンス化するために使用できます。

構文

APEX_ESCAPE.NOOP (
    p_string IN VARCHAR2)
    return VARCHAR2 deterministic;

パラメータ

表9-9に、NOOPファンクションで使用可能なパラメータを示します。

表9-9 APEX_ESCAPE.NOOPファンクションのパラメータ

パラメータ 説明

p_string

入力テキスト文字列。


次の例に、明示的にテキストをエスケープしないようにする開発者の意図を示すためのNOOPの使用方法を示します。

begin 
    sys.htp.p(apex_escape.noop('Cats & Dogs')); 
end;

SET_HTML_ESCAPING_MODEプロシージャ

SET_HTML_ESCAPING_MODEプロシージャは、wwv_flow_escape.htmlに対するHTMLエスケープ・モードを構成します。

構文

APEX_ESCAPE.SET_HTML_ESCAPING_MODE (
    p_mode IN VARCHAR2);

パラメータ

表9-10に、SET_HTML_ESCAPING_MODEプロシージャで使用可能なパラメータを示します。

表9-10 APEX_ESCAPE.SET_HTML_ESCAPING_MODEプロシージャのパラメータ

パラメータ 説明

p_mode

Bと等しい場合は、sys.htf.escape_scのように、基本エスケープを行います。Eと等しい場合は、拡張エスケープを行います。


例については、「HTMLファンクション」を参照してください。