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環境で定数を変更できる文字をエスケープします。これは、既知の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文字 | 返されるエスケープ文字 |
---|---|
|
|
|
|
|
|
|
|
' |
|
|
|
構文
APEX_EXSCAPE.HTML ( p_string IN VARCHAR2 ) return VARCHAR2;
パラメータ
表9-2に、HTML
ファンクションで使用可能なパラメータを示します。
例
次の例に、基本('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 &"<>''/'); apex_escape.set_html_escaping_mode('E'); eq(apex_escape.html('hello &"<>''/'), 'hello &"<>'/'); end;
このファンクションは、HTMLのエンティティ属性の値のエスケープに使用されます。英数字または「,」「.」「-」「_」のいずれかの文字以外のすべてを16進エスケープします。
構文
APEX_ESCAPE.HTML_ATTRIBUTE ( p_string IN VARCHAR2 ) return VARCHAR2;
パラメータ
表9-3に、HTML_ATTRIBUTE
ファンクションで使用可能なパラメータを示します。
例
「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
ファンクションで使用可能なパラメータを示します。
例
次の例では、タイトルおよびテキスト本文の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エスケープを実行します。入力テキストには単純な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ファンクションのパラメータ
パラメータ | 説明 |
---|---|
|
フィルタされるテキスト文字列。 |
|
|
例
次の例に、ホワイトリスト・タグを維持し、不要なHTMLマークアップを文字列から削除するためのAPEX_ERROR
の使用方法を示します。
begin sys.htp.p(apex_escape.html_whitelist( '<h1>Hello<script>alert("XSS");</script></h1>')); end;
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ファンクションのパラメータ
パラメータ | 説明 |
---|---|
|
エスケープされるテキスト文字列。 |
|
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
ファンクションは、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ファンクションのパラメータ
パラメータ | 説明 |
---|---|
|
エスケープされるテキスト文字列。 |
|
|
|
TRUEの場合、 |
例
次の例では、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
ファンクションは、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ファンクションのパラメータ
パラメータ | 説明 |
---|---|
|
エスケープされるテキスト文字列。 |
|
|
|
TRUEの場合、 |
例
次の例では、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;
p_string
を変更せずに返します。SQLインジェクションのdbms_assert.noop
と同様に、このファンクションは、自動インジェクション検出テストをサイレンス化するために使用できます。
構文
APEX_ESCAPE.NOOP ( p_string IN VARCHAR2) return VARCHAR2 deterministic;
パラメータ
表9-9に、NOOP
ファンクションで使用可能なパラメータを示します。
例
次の例に、明示的にテキストをエスケープしないようにする開発者の意図を示すためのNOOP
の使用方法を示します。
begin sys.htp.p(apex_escape.noop('Cats & Dogs')); end;
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プロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
|
例
例については、「HTMLファンクション」を参照してください。