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ファンクション」を参照してください。