ヘッダーをスキップ
Oracle® Application Express APIリファレンス
リリース4.2 for Oracle Database 12c
B71340-03
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

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文字がエスケープされた値

実際のASCI文字 戻されるエスケープされた文字

&


&amp;

"

&quot;

<


&lt;

>

&gt;

'


&#x27;

/


&#x2F;


構文

APEX_ESCAPE.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変数に適合できず、入力CLOBの一部の表示のみで十分な場合に使用できます。

構文

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_WHITELISTを使用して、ホワイトリストのタグを保持しながら、文字列から不要なHTMLマークアップを排除する方法を示します。

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

JS_LITERALファンクション

JS_LITERALファンクションは、JavaScript文字列のエスケープおよび(オプションで)クォートを行います。このファンクションは、影響を受ける文字を\xHHまたは\uHHHHと同等のものに置換します。結果は、<script>タグまたはインライン(「javascript:xxx」)内のJavaScriptコードに挿入できます。影響を受けない文字には、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以外の場合、この文字列は結果の左および右に配置されます。引用文字は、一重引用符または二重引用符である必要があります。


ここでは、JS_LITERALを使用して、l_string変数内の特殊文字をエスケープする方法を示します。

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およびRFC 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の場合、ASCII 127を超えるp_string内の文字が、\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ファンクション」を参照してください。